Chr*_*ian 3 c++ unordered-map openmp gnu-parallel
在我的代码中的某些时候,我必须对unordered_map中的所有元素进行操作.为了加速这个过程,我想使用openMP,但天真的方法不起作用:
std::unordered_map<size_t, double> hastTable;
#pragma omp for
for(auto it = hastTable.begin();
it != hastTable.end();
it ++){
//do something
}
Run Code Online (Sandbox Code Playgroud)
原因是,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
});
Run Code Online (Sandbox Code Playgroud)
编译(gcc 4.8.2)
g++ -fopenmp -march=native -std=c++11
Run Code Online (Sandbox Code Playgroud)
没有并行运行.使用向量切换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.;
});
}
Run Code Online (Sandbox Code Playgroud)
我期待着你的回答.
使用不支持随机迭代器的容器的规范方法是使用显式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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这为每次迭代创建了一个单独的任务,这带来了一些开销,因此只有在//do something实际意义上才有意义//do quite a bit of work.
| 归档时间: |
|
| 查看次数: |
1758 次 |
| 最近记录: |