質問

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);
    }
}
役に立ちましたか?

解決

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

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

しかし 構成とチューニング この章は、並列化を強制するのに役立つかもしれません。

「ベンチマーク」へのメモ:std::sort そして std::for_each 必ずしも電話するわけではありません delay() 同じ回数です。 std::for_each 遅延メソッドを呼び出します N 回、 std::sort 間の何かを呼び出します N log(N) そして N^2 回(参照 参照)。したがって、実行時間を測定しても、並列化については弱い指標しか得られません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top