for_each paralelo usando OpenMP
-
20-09-2019 - |
Pregunta
¿Por qué este código no paralelizar std :: for_each () cuando funciona perfectamente bien con std :: sort ()?
¿Cómo lo arreglo?
g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p sort
GCC 4.3 en 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);
}
}
Solución
Sólo compilar con -D_GLIBCXX_PARALLEL
no necesariamente paralelizar todos los algoritmos (ver aquí ):
Tenga en cuenta que esto no significa necesariamente que todo va a terminar siendo ejecutado de manera paralela, sino más bien que la heurística y la configuración codificados en las versiones paralelas se utilizará para determinar si todos, algunos o ninguno algoritmos ser ejecutado usando variantes paralelas.
Sin embargo, la configuración y puesta a punto Capítulo podría ayudar a forzar la paralelización.
Sólo una nota a su "punto de referencia":
std::sort
y std::for_each
no necesariamente llamar delay()
el mismo número de veces. std::for_each
llama al método de retardo de tiempos N
, std::sort
lo llama para algo entre N log(N)
y N^2
veces (ver referencia ). Por lo tanto medir el tiempo de ejecución que sólo da una indicación débil sobre la paralelización.