openMp:parallelize std :: map iteration

Arc*_*yno 1 c++ stdmap openmp

有一些关于这个问题的帖子,但没有一个满足我.我没有openMp 3.0支持,我需要在地图上并行化迭代.我想知道这个解决方案是否有效:

auto element = myMap.begin();

#pragma omp parallel for shared(element)
for(int i = 0 ; i < myMap.size() ; ++i){
 MyKeyObject * current_first = nullptr;
 MyValueObject * current_second = nullptr;
#pragma omp critical
{
    current_first = element->first;
    current_second = element->second;
    ++element;
}

// Here I can use 'current' as in a usual loop
}
Run Code Online (Sandbox Code Playgroud)

所以我使用for循环只是为了确保线程将处理相同数量的地图元素.这是正确的猜测还是会失败?

ps:我正在开发visual studio 2012,所以如果你有关于如何让我的编译器支持openMp 3.0的提示,这也将解决我的问题..

Hri*_*iev 9

这不是你问题的直接答案,但我会尽力为你节省一些未来糟糕的"OpenMP with Visual Studio"经验.

Microsoft C/C++编译器仅支持OpenMP 2.0.由于OpenMP内置于编译器内核并且不是附加软件包(除非有人提出外部源到源转换引擎),并且Microsoft似乎不是,所以无法使其支持OpenMP 3.0或更高版本.有兴趣在推动自己的解决方案的同时提供进一步的OpenMP支持(见下文).因此,您应该获得与Visual Studio集成的英特尔C/C++编译器或者像GCC或PGI C/C++编译器这样的独立编译器.

如果您专门为Windows开发,那么您可能希望放弃OpenMP并使用并发运行时,特别是PPL.PPL附带Visual Studio 2012及更新版本,并为STL中的某些算法提供数据和任务并行等效项.你感兴趣的是concurrency::parallel_for_each(),它的并行版本std::for_each().它适用于前向迭代器,虽然不如随机迭代器那样有效.但是你必须确保处理地图的一个元素需要至少一千条指令,否则并行化将不会有益.

如果您的目标是跨平台兼容性,那么英特尔线程构建模块(简称英特尔TBB)是PPL的替代品.它提供了tbb::parallel_do()算法,专门设计用于前向迭代器.关于每个地图元素的工作量的相同警告适用.