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);
    }
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top