Таким образом, в SO и в Интернете в целом существует много путаницы и разочарования по поводу того, как сделать так, чтобы директивы OpenMP easy -to -use #pragma
взаимодействовали с так же легко C++ -to -использовать контейнеры STL.
Все говорят о рабочих -обходах для STL vector
, но как насчет не-случайного доступа/двунаправленных -контейнеров, таких как map
, list
, set
и т. д.?
Я столкнулся с этой проблемой и разработал очень простой и очевидный обходной путь. Я привожу его здесь для STL map
, но он легко обобщается.
Серийная версия:
for (std::map::iterator it = my_map.begin();
it != my_map.end();
++it)
{ /* do work with it */ }
Предлагаемое мной решение для использования OpenMP с STLmap
:
//make an array of iterators.
int loop_length = my_map.size();
std::map::iterator loop_array[ loop_length ];
std::map::iterator allocate_it = my_map.begin();
for (int j=0; j
Однако я далек от эксперта по OpenMP, поэтому я хотел бы знать, является ли предложенная мной работа -эффективной и хорошей практикой.
Предположим, что программист отвечает за безопасную обработку контейнера STL потоком -в цикле for.
Наконец, является ли мое предложенное решение более эффективным, чем следующее обычно -предлагаемое решение(см. ответ на этот вопрос SO), потому что в моем решении каждый поток не перебирает весь контейнер?
#pragma omp parallel
{
for (std::map::iterator it = my_map.begin();
it != my_map.end();
++it)
#pragma single nowait
{ /* do work */ }
}