首页 > 解决方案 > 使用 par_unseq 时,我仍然可以依赖输出元素的顺序吗?

问题描述

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

标签: c++algorithmparallel-processingc++17

解决方案


标准[alg.transform]内容如下:

效果:i通过范围内的每个迭代器分配[result,result + (last1 - first1))一个新的对应值等于op(*(first1 + (i - result))or binary_op(*(first1 + (i - result)), *(first2 + (i - result)))

和(感谢@Caleth),[algorithms.parallel.overloads]

除非另有说明,否则ExecutionPolicy算法重载的语义与其没有的重载相同。

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


推荐阅读