Рассмотрим:
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.