Распараллеливание простого цикла с помощью алгоритмов C++17C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Распараллеливание простого цикла с помощью алгоритмов C++17

Сообщение Гость »


У меня есть параллельный код, который можно свести к следующему:

#include #include структура TKeyObjPtr; класс TObj { публика: виртуальная пустота Calculate (TKeyObjPtr const &) = 0; }; структура TKeyObjPtr { INT Ключ; TObj *ObjPtr; }; void Calculate(std::vector const &KeyObjPtrVec) { #pragma omp параллель для for (auto It1= KeyObjPtrVec.begin(); It1!=KeyObjPtrVec.end(); ++It1) for (auto It2= It1+1; It2!=KeyObjPtrVec.end() && It2->Key==It1->Key; ++It2) It1->ObjPtr->Вычислить(*It2); } Я хотел бы модернизировать этот код, используя параллельные алгоритмы c++17. К сожалению, у меня возникли проблемы с переписыванием такого простого фрагмента кода.

Можно использовать boost::counting_iterator:

void Calculate(std::vector const &KeyObjPtrVec) { std::for_each(std::execution::par_unseq, boost::counting_iterator(0u), boost::counting_iterator(KeyObjPtrVec.size()), [&KeyObjPtrVec](авто i) { for (auto j= i+1; jCalculate(KeyObjPtrVec[j]); }); } Это работает, но значительно более подробно и, что еще хуже, я не думаю, что это соответствует требованиям стандартным, поскольку boost::counting_iterator является кэширующим итератором и, следовательно, не соответствовать требованиям Cpp17ForwardIterator.

Можно ли написать приведенный выше код так же лаконично, как в OpenMP, при этом удовлетворив ограничения стандарта на параллельные алгоритмы?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»