小编Chr*_*ian的帖子

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> & …
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map openmp gnu-parallel

3
推荐指数
1
解决办法
1758
查看次数

标签 统计

c++ ×1

gnu-parallel ×1

openmp ×1

unordered-map ×1