2

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なしまたはあり)はまったく発生しません。このスレッドを閉じる方法はありますか?

4

1 に答える 1

1

おそらく、COMP は、ハードウェアではなくソフトウェアで実行されるいくつかの 非正規化操作を実行しています。

denormals に取り組むと、Flush-to-zero モード (すべての denormals が 0 に丸められる場合) と比較して実行時間が変わる可能性があります。denormals の計算を公正に行うコンパイラで行うべき作業がさらに増えるでしょう。また、反復ごとに作業量が異なる場合があります。

インテル® コンパイラー-Oはデフォルトで非正規化操作を無効にし、任意のレベル (-O0、-O1、-O2 など) でFlush-to-zero と Denormals-are-zero を設定します。

denormalsをオンにするに-no-ftzは、Intel コンパイラのオプション(docs1) (docs2)または-fp-model precise

GCCではdenormals-are-zero は -ffast-mathオプションによってのみ有効になり-O1-O2, -O3: (grep a -ffast-math)のいずれによっても設定されません。-ffast-mathインクルードは非正規化を無視します( bug36821、コメント #1)

そのため、COMP に多くのデノーマルがある場合、ICC はそれらをゼロとして無視し、GCC は多くのソフトウェア処理を行います。

デノーマルは当てはまらない可能性がありますが、他の浮動小数点処理の違いは当てはまります。

于 2012-01-23T21:03:58.857 に答える