3

std::sort() で完全に正常に動作するのに、このコードが std::for_each() を並列化しないのはなぜですか?

どうすれば修正できますか?

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

Linux 上の GCC 4.3。

#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);
    }
}
4

1 に答える 1

6

でコンパイルするだけで-D_GLIBCXX_PARALLELは、必ずしもすべてのアルゴリズムが並列化されるわけではありません(ここを参照)。

これは必ずしもすべてが並列に実行されることを意味するのではなく、並列バージョンにコード化されたヒューリスティックと設定を使用して、すべて、一部、またはまったくアルゴリズムが実行されないかどうかを判断することに注意してください。並列バリアント。

ただし、構成とチューニングの章は、並列化を強制するのに役立つ場合があります。

あなたの「ベンチマーク」へのメモ: std::sortそしてstd::for_each必ずしもdelay()同じ回数を呼び出すとは限りません。時間std::for_eachに対してdelayメソッドを呼び出し、時間と時間の間の何かに対してそれを呼び出します(リファレンスを参照)。したがって、実行時間を測定しても、並列化については弱い兆候しか得られません。Nstd::sortN log(N)N^2

于 2010-01-14T12:41:26.313 に答える