Параллельно for_each с использованием openmp - PullRequest
3 голосов
/ 14 января 2010

Почему этот код не распараллеливает std :: for_each (), когда он отлично работает с std :: sort ()?

Как мне это исправить?

g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p  sort

GCC 4.3 в 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);
    }
}

1 Ответ

6 голосов
/ 14 января 2010

Просто компиляция с -D_GLIBCXX_PARALLEL не обязательно распараллеливает все алгоритмы (см. здесь ):

Обратите внимание, что это не обязательно означает, что все будет выполняться параллельно, а скорее эвристика и настройки, закодированные в параллельных версиях, будут использоваться для определения того, будут ли все, некоторые или нет алгоритмы исполняться с использованием параллельных вариантов.

Однако, Конфигурация и настройка Глава может помочь вам форсировать распараллеливание.

Просто примечание к вашему «Эталону»: std::sort и std::for_each не обязательно будут звонить delay() одинаковое количество раз. std::for_each вызывает метод задержки для N раз, std::sort вызывает его для чего-то между N log(N) и N^2 раз (см. ссылка ). Таким образом, измерение времени выполнения дает вам лишь слабое указание на распараллеливание.

...