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);
    }
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top