for_each parallela usando OpenMP
-
20-09-2019 - |
Domanda
Perché questo codice non parallelizzare std :: for_each () quando funziona perfettamente bene con std :: sort ()?
Come posso risolvere il problema?
g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p sort
GCC 4.3 su 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);
}
}
Soluzione
Proprio la compilazione con -D_GLIBCXX_PARALLEL
non necessariamente parallelizzare tutti gli algoritmi (vedi qui ):
Si prega di notare che questo non significa necessariamente che tutto finirà per essere eseguito in modo parallelo, ma piuttosto che l'euristica e le impostazioni codificate nelle versioni parallele saranno utilizzati per determinare se tutti, alcuni o nessun algoritmi essere eseguito utilizzando varianti parallele.
Tuttavia, la configurazione e messa a punto Capitolo potrebbe aiutare di forzare la parallelizzazione.
Solo una nota per il vostro "Benchmark":
std::sort
e std::for_each
non richiedono necessariamente delay()
lo stesso numero di volte. std::for_each
chiama il metodo ritardo per tempi N
, std::sort
chiama qualcosa tra N log(N)
e N^2
volte (vedi riferimento ). Così misurare il tempo di esecuzione ti dà solo un'indicazione debole sulla parallelizzazione.