openmp を使用した並列 for_each
-
20-09-2019 - |
質問
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
回(参照 参照)。したがって、実行時間を測定しても、並列化については弱い指標しか得られません。
所属していません StackOverflow