大規模なネストされたループの崩壊原因のパフォーマンスについて、誰かが入札を知っているかどうか疑問に思っていましたか? 意味私はパフォーマンスOpenMPの崩壊と大規模なネストループの崩壊の比較
omp parallel for private(i,j,k) collapse(3) schedule(static)
と
omp parallel for private(i,j,k) schedule(static)
は、ネストされたforループ
for(int i=0; i<i_max; i++){
for(int j=0; j<j_max; j++){
for(int k=0; k<k_max; k++){
A[i][j][k]=B[i][j][k]+C[i][j][k];
}
}
}
I_最大、J_MAXのように構築プラグマを比較したいと、すべて何かk_maxあるでしょう使用可能なスレッドの数の5〜10倍です。
私が崩壊原因を正しく理解していれば、openmpは3つのループをサイズi_max*j_max*k_max
のものに崩壊させ、(i_max*j_max*k_max) mod #threads = 0
の場合は最高の性能と仮定します。
崩壊の原因がなければ、openmpはiループだけを取りますか?もしそうなら、私の次の仮定はi_max mod #threads = 0
のための最良の性能を得ることであり、両方のプラグマに匹敵する性能が期待されます。
ご覧のとおり、私はここでかなり推測しています。誰かが実際にこのような場合の両方のプラグマのパフォーマンスをテストしましたか?
あなたの推測は問題ありません。どちらのケースでも*あなたのパフォーマンスをテストしましたか? – Zulan
このような小さなボディを持つループでは、内部ループの実装が改善されているため、スレッド数が「i_max」を分けると、折りたたまれていないバージョンが高速になることがあります(どのくらい?_itに依存します)。ループを崩壊させると、ベクトル化が阻害される可能性があります。 –
@ Zulan私はいくつかのテストを行ったが、私の結果をどのように解釈するのか分からなかった。あるサーバーでは、折りたたみバージョンは高速で、別のサーバーでは非折りたたみバージョンでした。私はいくつかのシミュレーションを禁止することなく、それを広範囲にテストする能力を持っていないので、ここでいくつかの説明をしました。 – LeBo