Параллельный алгоритм суммирования элементов вектора с элементами другого - PullRequest
2 голосов
/ 14 мая 2019

Рассмотрим:

std::vector<double> u, v;

#pragma omp parallel for
for (std::size_t i = 0u; i < u.size(); ++i)
  u[i] += v[i];

Чтобы выразить подобный код с помощью параллельных алгоритмов C ++ 17, я нашел решение до сих пор - использовать версию std::transform с двумя входными диапазонами:

std::transform(std::execution::par_unseq,
               std::begin(u), std::end(u), std::begin(v), std::begin(u),
               std::plus())

, который мне совсем не нравится, потому что он обходит оператор += моих типов и в моем реальном случае использования приводит к гораздо более подробному (в 4 раза длиннее) коду, чем исходный код OpenMP (я не могу просто использовать std::plus потому что я должен сначала сделать операцию на элементах диапазона RHS).

Есть ли другой алгоритм, который я наблюдаю?

Также обратите внимание, что если я использую ranges::zip, код не будет выполняться параллельно в GCC 9, потому что если iterator_category не меньше, чем forward_iterator, то серверная часть PSTL возвращается к последовательному алгоритму: https://godbolt.org/z/XGtPwc.

...