- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的代码中的某个时刻,我必须对 unordered_map 中的所有元素进行操作。为了加速这个过程,我想使用 openMP,但是天真的方法不起作用:
std::unordered_map<size_t, double> hastTable;
#pragma omp for
for(auto it = hastTable.begin();
it != hastTable.end();
it ++){
//do something
}
原因是,unordered_map 的迭代器不是随机访问迭代器。作为替代方案,我尝试了对 for_each 起作用的 __gnu_parallel 指令。但是下面的代码
#include <parallel/algorithm>
#include <omp.h>
__gnu_parallel::for_each (hashTable.begin(), hashTable.end(),[](std::pair<const size_t, double> & item)
{
//do something with item.secon
});
使用 (gcc 4.8.2) 编译
g++ -fopenmp -march=native -std=c++11
不并行运行。使用 vector 切换 unordered_map 并使用相同的 __gnu_parallel 指令并行运行。
为什么在无序映射的情况下它不并行运行?有解决方法吗?
下面我给你一些简单的代码,它重现了我的问题。
#include <unordered_map>
#include <parallel/algorithm>
#include <omp.h>
int main(){
//unordered_map
std::unordered_map<size_t, double> hashTable;
double val = 1.;
for(size_t i = 0; i<100000000; i++){
hashTable.emplace(i, val);
val += 1.;
}
__gnu_parallel::for_each (hashTable.begin(), hashTable.end(),[](std::pair<const size_t, double> & item)
{
item.second *= 2.;
});
//vector
std::vector<double> simpleVector;
val = 1.;
for(size_t i = 0; i<100000000; i++){
simpleVector.push_back(val);
val += 1.;
}
__gnu_parallel::for_each (simpleVector.begin(), simpleVector.end(),[](double & item)
{
item *= 2.;
});
}
期待您的回答。
最佳答案
不支持随机迭代器的容器的规范方法是使用显式 OpenMP 任务:
std::unordered_map<size_t, double> hastTable;
#pragma omp parallel
{
#pragma omp single
{
for(auto it = hastTable.begin(); it != hastTable.end(); it++) {
#pragma omp task
{
//do something
}
}
}
}
这会为每次迭代创建一个单独的任务,这会带来一些开销,因此只有当 //do something
实际上意味着 //do quite a bit of work
时才有意义。
关于c++ - OpenMP/__gnu_parallel 用于 unordered_map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034642/
这让我很困惑,如果有人能帮助我,我将不胜感激。 (编辑:以为这是一个模板化问题,我误会了) 我想使用 gnu 的并行累积算法(存储在 #include 中)添加以下类的多个拷贝 类故意不做太多,我觉
在我的代码中的某个时刻,我必须对 unordered_map 中的所有元素进行操作。为了加速这个过程,我想使用 openMP,但是天真的方法不起作用: std::unordered_map hastT
在我的代码中的某个时刻,我必须对 unordered_map 中的所有元素进行操作。为了加速这个过程,我想使用 openMP,但是天真的方法不起作用: std::unordered_map hastT
我试图理解为什么在单线程上运行的 std::for_each 比 __gnu_parallel::for_each 快 ~3 倍在下面的示例中: Time =0.478101 milliseconds
我是一名优秀的程序员,十分优秀!