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

Tim*_*imW 14 c++ algorithm parallel-processing c++17

阅读文档后,我仍然对使用它感到困惑par_unseq.我知道由于线程和矢量化,我无法说出执行的顺序,但是我仍然可以依赖输出的顺序吗?

transform([x0, x1, x2], f) == [f(x0), f(x1), f(x2)]]
Run Code Online (Sandbox Code Playgroud)

换句话说,这个测试是否会失败?

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);
Run Code Online (Sandbox Code Playgroud)

Evg*_*Evg 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算法重载的语义与它们的重载相同.

所以,是的,您可以依赖输出中的顺序.

  • 您还有["除非另有说明,ExecutionPolicy算法重载的语义与它们的重载相同,但没有"](http://eel.is/c++draft/algorithms.parallel#overloads-2)[算法.并行] .overloads] (2认同)