gpt4 book ai didi

c++:OpenMP 和非随机访问 STL 容器——一种可能的解决方法

转载 作者:可可西里 更新时间:2023-11-01 16:16:28 26 4
gpt4 key购买 nike

所以在 SO 上,以及整个互联网上,对于如何使 OpenMP 易于使用的 #pragma 指令与 C++ 同样易于使用的 STL 容器合作,存在很多困惑和沮丧.

每个人都在谈论 STL vector 的变通方法,但是非随机访问/双向容器呢,比如 maplist设置等 ?

我遇到了这个问题并设计了一个非常简单、明显的解决方法。我在这里为 STL map 展示它,但它显然是可推广的。

连续版:

for (std::map<A,B>::iterator it = my_map.begin();
it != my_map.end();
++it)
{ /* do work with it */ }

我提出的将 OpenMP 与 STL map 结合使用的解决方案:

    //make an array of iterators.
int loop_length = my_map.size();
std::map<A,B>::iterator loop_array[ loop_length ];

std::map<A,B>::iterator allocate_it = my_map.begin();
for (int j=0; j<loop_length; ++j)
loop_array[j] = allocate_it++;

// now you can use OpenMP as usual:
#pragma omp parallel for
for (uint j=0; j<loop_length; ++j)
{ /* do work with loop_array[j] */ }

但是,我远不是 OpenMP 方面的专家,所以我想知道我提出的变通办法是否有效和良好实践。

请假设程序员负责在 for 循环中线程安全地处理 STL 容器。

最后,我提出的解决方案是否比以下普遍提出的解决方案更有效(see answer to this SO Question) ,因为在我的解决方案中,每个线程都不会遍历整个容器?<​​/p>

#pragma omp parallel
{
for (std::map<A,B>::iterator it = my_map.begin();
it != my_map.end();
++it)
#pragma single nowait
{ /* do work */ }

}

最佳答案

OpenMP 从 3.0 版开始提供 task 结构,这对于与 STL 一起使用非常有用:

for (std::map<A,B>::iterator it = my_map.begin();
it != my_map.end();
++it)
{
#pragma omp task
{ /* do work with it */ }
}

当然,迭代之间的数据依赖不应该存在,这样才能起作用。

关于c++:OpenMP 和非随机访问 STL 容器——一种可能的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10433048/

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