c++ :OpenMP и контейнеры STL без -случайного -доступа -возможный обходной путь

Таким образом, в 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  */   }

}

10
задан Community 23 May 2017 в 12:08
поделиться