OpenMPを使用して並列化する特定の問題を起動しています。大量のデータを処理する同じコードの特定の回数の反復を実行します。OpenMPが適用されるレベルにあり、各スレッドがサブボリュームを処理するようにします。すべてのイテレーションには、すべてのサブボリュームと同様に同じワークロードが必要です。
ICCでコンパイルすると、予想どおり、反復は常に同じ時間続きます。しかし、奇妙なことがあります。GCCでコンパイルすると、反復あたりの時間が増加し始め、最大に達し、その後、安定する特定の値に達するまで再び減少します。OpenMPなしでコンパイルされた同じプログラムは、ICCまたはGCCを使用する場合に違いはありません。
それらのコンパイラのOpenMPでの動作を観察した人はいますか?
[編集1]:ガイド付きおよび静的スケジューリングポリシーがテストされました。
[編集2]:コードは次のようになります。
#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 );
}
}
ここで、COMPは、位置k + j * N + i * NN(およびそれらの隣接するもの)のa、b、cの値のある種の線形適用を実行します。重要なのは、GCCとICCのこのコードが私が説明した問題を引き起こしたということです。重要なのは、a、b、c、dの初期化を0.0f(f.ex、0.5f)以外の値に変更して、タイムステップごとに費やされる時間が増加しないことを発見したことです。
[編集3]:GOMPのせいではないようです。OpenMPを無効にしても同じことが起こります。繰り返しになりますが、ICCあり(openmpなしまたはあり)はまったく発生しません。このスレッドを閉じる方法はありますか?