Распараллеливание простого цикла с помощью алгоритмов C++17 ⇐ 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, при этом удовлетворив ограничения стандарта на параллельные алгоритмы?
У меня есть параллельный код, который можно свести к следующему:
#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, при этом удовлетворив ограничения стандарта на параллельные алгоритмы?
Мобильная версия