gpt4 book ai didi

c++ - openMp:并行化 std::map 迭代

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:36 26 4
gpt4 key购买 nike

关于这个问题有一些帖子,但没有一个让我满意。我没有 openMp 3.0 支持,我需要在 map 上并行化迭代。我想知道这个解决方案是否可行:

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
}

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

ps :我正在使用 visual studio 2012,所以如果您有关于如何使我的编译器支持 openMp 3.0 的提示,那也可以解决我的问题..

最佳答案

这不是您问题的直接答案,但我会尽力为您避免一些 future 糟糕的“OpenMP with Visual Studio”体验。

Microsoft C/C++ 编译器仅支持 OpenMP 2.0。没有办法让它支持 OpenMP 3.0 或更高版本,因为 OpenMP 内置在编译器核心中而不是附加包(除非有人提出外部源到源转换引擎)并且 Microsoft 似乎不是有兴趣在推出自己的解决方案的同时提供进一步的 OpenMP 支持(见下文)。因此,您应该获得与 Visual Studio 集成的英特尔 C/C++ 编译器或独立编译器,如 GCC 或 PGI C/C++ 编译器。

如果您专门为 Windows 开发,那么您可能想要放弃 OpenMP 并使用 Concurrency Runtime尤其是 PPL。 PPL 随 Visual Studio 2012 及更新版本一起提供,并为 STL 中的某些算法提供数据和任务并行等效项。您感兴趣的是 concurrency::parallel_for_each(),它是 std::for_each() 的并行版本。它适用于前向迭代器,尽管不如随机迭代器有效。但是您必须确保处理 map 的一个元素至少需要一千条指令,否则并行化将无益。

如果您的目标是跨平台兼容性,那么 Intel Threading Building Blocks (简称Intel TBB)是PPL的替代品。它提供了 tbb::parallel_do() 算法,该算法专门设计用于前向迭代器。关于每个 map 元素的工作量的警告同样适用。

关于c++ - openMp:并行化 std::map 迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30528967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com