for_each parallèle en utilisant OpenMP
-
20-09-2019 - |
Question
Pourquoi ce code ne paralléliser std :: for_each () quand il fonctionne parfaitement bien avec std :: sort ()?
Comment puis-je résoudre ce problème?
g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p sort
GCC 4.3 sur Linux.
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
void delay()
{
for(int c = 0; c < 1000000; c++) {
}
}
int lt(int a, int b)
{
delay();
return a < b;
}
void noop(int a)
{
delay();
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("%s <sort | for_each>\n", argv[0]);
return 1;
}
std::vector<int> foo(10000);
if (!strcmp(argv[1], "sort")) {
std::sort(foo.begin(), foo.end(), lt);
} else if (!strcmp(argv[1], "for_each")) {
std::for_each(foo.begin(), foo.end(), noop);
}
}
La solution
Il suffit de la compilation avec -D_GLIBCXX_PARALLEL
ne paralléliser pas nécessairement tous les algorithmes (voir et le réglage Chapitre pourrait vous aider à forcer parallélisation.
Juste une note à votre "Benchmark":
std::sort
et std::for_each
appelleront pas nécessairement delay()
le même nombre de fois. std::for_each
appelle la méthode de retard pour les temps de N
, std::sort
il appelle à quelque chose entre les temps de N log(N)
et N^2
(voir ). Ainsi, la mesure du temps d'exécution vous ne donne qu'une faible indication à propos de parallélisation.