Могу ли я по-прежнему полагаться на порядок элементов вывода при использовании par_unseq? - PullRequest
0 голосов
/ 07 сентября 2018

После прочтения документации я все еще не понимаю, как использовать 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 голосов
/ 07 сентября 2018

Стандарт, [alg.transform] , читает:

Эффекты: Назначает через каждый итератор i в диапазоне [result,result + (last1 - first1)) новое соответствующее значение, равное op(*(first1 + (i - result)) или binary_op(*(first1 + (i - result)), *(first2 + (i - result))).

и (спасибо, @Caleth), [алгоритмы.parallel.overloads] :

Если не указано иное, семантика перегрузок алгоритма ExecutionPolicy идентична их перегрузкам без.

Итак, да, вы можете положиться на порядок вывода.

0 голосов
/ 07 сентября 2018

Нет, ваш тест никогда не будет неудачным, потому что даже если порядок выполнения изменится, ys[0...3] = xs[0...3] * xs[0...3] = {1*1, 2*2, 3*3, 4*4}; не изменится.

...