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);
    }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top