OpenMP / __ gnu_parallel para um mapa não ordenado
Em algum momento do meu código, tenho que fazer operações em todos os elementos em um unordered_map. Para acelerar esse processo, quero usar o openMP, mas a abordagem ingênua não funciona:
std::unordered_map<size_t, double> hastTable;
#pragma omp for
for(auto it = hastTable.begin();
it != hastTable.end();
it ++){
//do something
}
A razão para isso é que o iterador de um unordered_map não é um iterador de acesso aleatório. Como alternativa, tentei as diretivas __gnu_parallel trabalhando em for_each. Mas o código a seguir
#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
});
compilado com (gcc 4.8.2)
g++ -fopenmp -march=native -std=c++11
não corre paralelo. Alternar o unordered_map com um vetor e usar a mesma diretiva __gnu_parallel é executado em paralelo.
Por que não é executado em paralelo no caso do mapa não ordenado? Existem soluções alternativas?
A seguir, dou um código simples, que reproduz o meu problema.
#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.;
});
}
Estou ansioso por suas respostas.