代码之家  ›  专栏  ›  技术社区  ›  TimW

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

  •  14
  • TimW  · 技术社区  · 6 年前

    在阅读了文档之后,我仍然对 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 回复  |  直到 6 年前
        1
  •  11
  •   Evg    6 年前

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

    影响: 通过每个迭代器赋值 i 在范围内 [result,result + (last1 - first1)) op(*(first1 + (i - result)) binary_op(*(first1 + (i - result)), *(first2 + (i - result))) .

    [algorithms.parallel.overloads] :

    除非另有规定,否则 ExecutionPolicy 算法重载与它们的重载相同。

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

        2
  •  2
  •   Swordfish    6 年前

    不,你的测试永远不会失败,因为即使执行顺序改变, ys[0...3] = xs[0...3] * xs[0...3] = {1*1, 2*2, 3*3, 4*4}; 不会改变的。