阅读文档后,我仍然对par_unseq
的使用感到困惑。我知道由于线程和向量化我无法告知执行顺序,但是我仍然可以依靠输出的顺序吗?
transform([x0, x1, x2], f) == [f(x0), f(x1), f(x2)]]
换句话说,这个测试会失败吗?
std::vector<int> xs = {1, 2, 3, 4};
std::vector<int> ys(xs.size());
std::transform(
std::execution::par_unseq,
cbegin(xs), cend(xs),
begin(ys),
[](int x) { return x*x; });
std::vector<int> expected = {1, 4, 9, 16};
ASSERT_EQ(expected , ys);
答案 0 :(得分:11)
标准[alg.transform]的内容如下:
效果:通过范围
i
中的每个迭代器[result,result + (last1 - first1))
分配一个等于op(*(first1 + (i - result))
或binary_op(*(first1 + (i - result)), *(first2 + (i - result)))
的新的对应值。
和(感谢@Caleth),[algorithms.parallel.overloads]:
除非另有说明,否则
ExecutionPolicy
算法重载的语义与其没有的重载相同。
是的,您可以依赖输出中的顺序。
答案 1 :(得分:2)
不,您的测试将永远不会失败,因为即使执行顺序发生变化,
ys[0...3] = xs[0...3] * xs[0...3] = {1*1, 2*2, 3*3, 4*4};
不会改变。