OpenMP を使用して、バランスの取れていないネストされた for ループを使用してアルゴリズムを並列化しようとしています。前代未聞の政府の秘密のプロジェクトであるため、元のコードを投稿することはできませんが、おもちゃの例を次に示します。
for (i = 0; i < 100; i++) {
#pragma omp parallel for private(j, k)
for (j = 0; j < 1000000; j++) {
for (k = 0; k < 2; k++) {
temp = i * j * k; /* dummy operation (don't mind the race) */
}
if (i % 2 == 0) temp = 0; /* so I can't use openmp collapse */
}
}
現在、この例は複数のスレッドで動作が遅くなります (シングル スレッドで~1 秒、2 スレッドで~2.4 秒など)。
注意事項:
外側の for ループは順番に実行する必要があります (前のステップに応じて) (私の知る限り、OpenMP は内側のループを適切に処理するため、各ステップでスレッドが作成/破棄されませんよね?)
典型的なインデックス番号が例に示されています
(100, 1000000, 2)
ダミー操作はわずかな操作で構成されています
最も内側のループの外側にいくつかの条件付き操作があるため、折りたたみはオプションではありません (とにかくパフォーマンスが向上するようには見えません)
恥ずかしいほど並列アルゴリズムのように見えますが、過去 2 日間はスピードアップしていないようです。ここでの最善の戦略は何でしょうか?