OpenMPを使用して並列化する問題を開始しています。これは、ある量のデータを処理するコードと同じコードを繰り返し実行します。 OpenMPが適用されているレベルにあり、各スレッドはサブボリュームを処理します。すべての反復には、すべてのサブボリュームと同じワークロードが必要です。ICC、GCC、OpenMP
ICCを使用してコンパイルすると、イテレーションの時間は常に同じになります。しかし、奇妙なことが起こります:GCCでコンパイルすると、反復ごとの時間は増加し始め、最大に達してから安定した所与の値に達するまで再び減少します。 OpenMPなしでコンパイルされた同じプログラムは、ICCまたはGCCを使用しても違いはありません。
OpenMPのこれらのコンパイラでの動作は誰にも分かりますか?
[編集1]:ガイド付きおよび静的スケジューリングポリシーがテストされました。
[EDIT 2]:コードは多少のようになります。
COMPは、Bの値の線形アプリケーションのいくつかの種類を行う位置k + j個の* NのC + i *が#pragma omp parallel for schedule(static) private(i,j,k)
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
for(k = 0; k < N; k++){
a[ k+j*N+i*NN] = 0.f;
b[ k+j*N+i*NN] = 0.f;
c[ k+j*N+i*NN] = 0.f;
d[ k+j*N+i*NN] = 0.f;
}
for(t = 0; t < T; t+=dt){
/* ... change some discrete values in a,b,c .... */
/* and propagate changes */
#pragma omp parallel for schedule(static) private(i,j,k)
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
for(k = 0; k < N; k++){
d[ k+j*N+i*NN ] = COMP(a,b,c,k+j*N+i*NN);
}
}
NN(およびその隣人の一部)。要点は、GCCとICCのこのコードが私が説明した問題を引き起こしたことです。ポイントは、私がa、b、c、dの初期値を0.0f(f.ex、0.5f)以外の値に変更したことがわかったということです。
[編集3]:GOMPの問題ではないようです。 OpenMPを無効にしても同じことが起こります。もう一度、ICC(openmpなしまたはopenmpなし)はまったく発生しません。このスレッドを閉じる方法はありますか?
GCCおよびlibgomp /環境変数を有効にしてみてください: 'GOMP_CPU_AFFINITY = 0-31' 31はCPUコア数-1、より予測可能な結果を得るには 'OMP_WAIT_POLICY = active'が必要です。 – osgx
ありがとう!しかし、私はあなたの目的と行動が持続することを試みました。 OpenMPが最適なワークロード配布を見つけるまで、さまざまなchunsizeを試みることができますか?私は特定のチャンクを設定しませんでした。 –
まだ同じ動作をしているモデルコードを表示できますか? – osgx