2012-01-19 29 views
2

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

+0

GCCおよびlibgomp /環境変数を有効にしてみてください: 'GOMP_CPU_AFFINITY = 0-31' 31はCPUコア数-1、より予測可能な結果を​​得るには 'OMP_WAIT_POLICY = active'が必要です。 – osgx

+0

ありがとう!しかし、私はあなたの目的と行動が持続することを試みました。 OpenMPが最適なワークロード配布を見つけるまで、さまざまなchunsizeを試みることができますか?私は特定のチャンクを設定しませんでした。 –

+0

まだ同じ動作をしているモデルコードを表示できますか? – osgx

答えて

1

5月、COMPはハードウェアではなくソフトウェアで行われる一部のdenormal操作を実行しています。

デノーマルの処理は、ゼロになるまでのモード(すべてのデノーマルがゼロに丸められた場合)と比較して実行時間が異なる可能性があります。公式に非正規化を行うコンパイラでは、もっと多くの作業が必要になります。作業の量は反復ごとに異なる場合があります。デフォルトで

インテルコンパイラは非正規操作と設定フラッシュ・ツー・ゼロとデノーマル-あるゼロ任意-Oレベル(-O0、-O1、-O2、等)で無効になります。 -no-ftzインテルコンパイラのオプション(docs1)(docs2)又は-fp-model precise

においてGCCデノーマル-あるゼロのみ-O1のいずれかによって設定されていない-ffast-mathオプションによって回転されることがあります:使用にデノーマルをオンに

-O2,-O3(grep a -ffast-math)-ffast-mathにはdenormalsが無視されています(bug36821,comment#1)

したがって、COMPに非正規表現があると、ICCはそれらを無視して、GCCは多くのソフトウェア処理を行います。

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

+0

ありがとうございますが、それは解決策ではありませんでした。実際には、計算時間を増やしましたが、問題を解決することはありませんでした。 –

+0

COMPではどのような操作が使用されていますか? CPUとは何ですか? CPUに「ターボブースト」やパワーセーブ機能はありますか? AVXは使用されていますか? – osgx

+0

COMPは線形演算を行います:乗算と加算、すべてが一次です。ダイナミックな周波数に対するどんな懸念で。 (私はあなたがそれを意味すると思う)、私は確信していない、私はそれを見てみる必要があります。そしてAVXに関係するものでは、私はベクトル化を導入していません.O3ではコンパイラが行うこと、つまりXXMSレジスタと命令をスカラーの方法でしか使用しませんでした(私はそれを確認するためにアセンブラコードを調べました) 。 –

関連する問題