使用par_unseq时,我仍然可以依赖输出元素的顺序吗?

时间:2018-09-07 09:43:15

标签: c++ algorithm parallel-processing c++17

阅读文档后,我仍然对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);

2 个答案:

答案 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}; 不会改变。