2017-09-22 13 views
0

これは恐らく疑問な質問ですが、データ量が増えたためにOpenMPを使い始めました。入れ子にされたOpenMP並列領域は、期待どおりに反復されません。

私はMiguel Hermannsの「OpenMPを使用したFortran 95での並列プログラミング」を行っており、本書の非常に早い段階です。初期の例の1つは、ネストされた並列領域の使用を示し、N + N行の出力を生成する必要があることを示しています。手順は次のようになります。

program helloworld 
    !$OMP PARALLEL 
     write(*,*) "Hello" 
     !$OMP PARALLEL 
      write(*,*) "Hi" 
     !$OMP END PARALLEL 
    !$OMP END PARALLEL 
end program helloworldcode 

私は12のハローズと144彼を期待するが、代わりに私は、それぞれの12を得る:私はだろうと

$ ./helloworld.exe 
Hello 
Hello 
Hello 
Hi 
Hi 
Hello 
Hello 
Hello 
Hello 
Hello 
Hello 
Hi 
Hi 
Hello 
Hello 
Hi 
Hi 
Hi 
Hi 
Hi 
Hello 
Hi 
Hi 
Hi 

は、なぜ私は、出力の156行を取得しておりません期待?

+0

すべてのFortran質問のUesタグ[タグ:fortran]。バージョン固有の質問用のバージョンタグを追加することができます(これはFortranのバージョン固有のものではありません)。そしてあなたが引用している本でさえ、F95でなくF90です... –

答えて

0

デフォルトでは、N^2ワーカースレッドが作成されたときに、2次オーバーサブスクリプションの最悪のケースを防ぐために、OpenMPはネストされたすべての並列領域をシリアル化します。十分な数のプロセッサ(例えば> = 16)を使用すると、2次オーバーサブスクリプションは悪夢のオーバーヘッドで実行を破棄したり、要求されたスレッド数を作成できないときにリソースが枯渇する可能性があります。

リスクのあるOpenMPでネストされた並列化を有効にする方法については、omp_set_nestedおよび対応する環境変数OMP_NESTEDを参照してください。

+0

ああ、ありがとう、ありがとう。もし私が望むのであれば、入れ子にされた並列領域が書かれているときにそれを実行するよう指示するフラグはありますか? – Vorticity

関連する問題