OpenMP の標準的な使用例は、ループの反復に直接的または間接的な依存関係がないという条件で、反復回数の多いループの反復をスレッドのチーム間で分散することです。
ループ反復実行の順序は結果に影響しますか? . たとえば、反復 N+1 が反復 N の結果を使用する場合、そのような依存関係があり、ループ反復を逆の順序で実行すると、ルーチンの出力が変更されます。
間接的な依存関係とは、主にデータ競合を意味し、スレッドは共有データへのアクセスを調整する必要があります。特に、共有変数への書き込みが正しい順序で行われるようにする必要があります。
多くの場合、依存関係のあるループを再設計して、それらの依存関係を削除できます。
そのような依存関係のない反復回数の多いループがある場合は、OpenMP を使用して高速化できる可能性があります。ここにバットがあります:
- このような各ループの開始時と終了時の計算には、ある程度の並列オーバーヘッドがあります。ループ カウントが十分に高くない場合、このオーバーヘッドは、部分的または全体的に、反復の並列実行による高速化を上回る可能性があります。これがコードに影響を与えているかどうかを判断する唯一の方法は、テストして測定することです。
- ループの繰り返しの間には、既に概説したよりも微妙な依存関係が存在する可能性があります。システム アーキテクチャとループ内の計算によっては、キャッシュや I/O リソース、またはその他のリソースへのアクセスを争うようにスレッドをプログラムすることがあります (気付かないうちに)。最悪の場合、これによりスレッド数が増加し、実行速度が低下する可能性があります。
- ハイパースレッディングが表す擬似ハードウェアではなく、各 OpenMP スレッドがハードウェアによってバックアップされていることを確認する必要があります。OpenMP スレッドごとに 1 つのコア、ハイパースレッディングはこのドメインのスネーク オイルです。
- 他にもあると思いますが、ここに入れると、おそらく他の誰かが助けてくれるでしょう。
さて、あなたの質問に目を向けてください:
- とにかく並列コードを使用する必要がありますか? テストと測定。
- forループの負荷で並列化効率が上がるって本当ですか? おおよそですが、ハードウェア上のコードについては、テストして測定してください。
最後に、さまざまな状況の組み合わせで実行時間を測定し、測定結果から何がわかるかを理解することなしに、真剣な並列計算家になることはできません。大量のデータの順次実行と並列実行を比較できない場合は、大量のデータを処理するときの動作を予測する前に、適度な量のデータを測定し、学んだ教訓を理解する必要があります。