2017-04-03 6 views
0

OpenMP並列セクションIEのセクションごとにスレッド数を設定することが可能である場合、私は疑問に思う:openmpの各セクションのスレッド数を設定しますか?

real*8  :: x 
real*4  :: y 
integer*8 :: ii 
integer*4 ** jj 
x = 0.0d0 
y = 0.0 
!$OMP PARALLEL 
!$OMP SECTIONS 
!$OMP SECTION NUM_THREADS(3) 
do ii=1,100000000000 
    x=x+(cos(sin(tan(ii*1.0d0)))**(x/ii) 
end do 
!$OMP SECTION NUM_THREADS(1) 
do jj=1,10000 
    x=x+exp(jj*0.001) 
end do 
!$OMP END SECTIONS 
!$OMP END PARALLEL 

このコードは、16.0のifortでは動作しませんが、1つは何ができる何か他のものがある場合、私はちょうど疑問に思います..?

EDIT:セクションあたりのスレッド数を設定しようとするとエラーが発生します(コンパイル時)...セクションごとに異なるスレッド数を指定したいと思います。

EDIT 2:エラーメッセージ= 2×

エラー#5082:構文エラー、見出さ 'NUM_THREADS' "< "END-OF-STATEMENT">" のいずれかを期待。 2つの!OMP SECTION NUM_THREADS(i)

恩赦性急令状で

...今では私たちは、それは問題が何であるか疑いの余地なく明らかだ知るために必要なものを私たちに語ったこと

+0

*「このコードは機能しません」*とは何ですか?それは全く何も言わない。間違った結果?彼らはどのように見えるのですか?なぜ彼らは間違っていますか?いくつかのエラーメッセージ?彼らはどのように見えるのですか?あなたのコンパイルコマンドはどのように見えますか?タイトル(スレッド数の設定)と共通するのは何ですか? –

+0

@Vladimir F - すばやい返信をいただきありがとうございます - 私の編集がより明確になることを願っています –

+0

このコードは何をしようとしていますか?それは 'x'に競合条件があり、「セクション」のポイントは2つのセクションを並行して実行することです。これも間違っています。 reduce節を持つ並列の2つのomp forループを欲しいだけではありませんか? (最初のループにはループ依存関係があるので、簡単に並列化できません!) –

答えて

0

...

... num_threads句は、parallelディレクティブにのみ適用されます。

簡単な方法で、別の部分と残りn-mスレッドにnスレッドのうちmを割り当てることができません。あなたはおそらく、その効果を達成するために何かをハックすることができますが、それはOpenMPプログラミングのグレインに反するでしょう。

0

あなたがしようとしているのは、OpenMPの考え方に反するものです。ここでは、スレッドを完全に制御するはずがありません。しかし、あなたはハックを使うことができます:OpenMPとpthreadの組み合わせ。つまり、pthread文を含むOMP PARALLELブロックです(pthreadは、どのスレッドがOMPブロックで使用されるかを完全に制御します)。以前は、私はそれを試していましたが、あなたがしたいことを正確には試しませんでしたが、OpenMP +の組み合わせが可能であることを確認する興味深い結果が得られました。また、gfortranのようなコンパイラの中には、バックグラウンドでpthreadを使ってOpenMPを実装しているものもあります。

もちろん、使用するpthreadステートメントのFortranバインディングを記述する必要がありますが、それほど大きな問題はありません。実際の問題は、そのようなアプローチが定義上問題であるということです。根本的に異なる2つの並列化モデルを混在させています。これはハックなので、あなた自身があります。私は深刻なアプリケーションでそのようには行かないだろうが、十分な試行錯誤があれば、それはあなたがやろうとしていることをする方法である。

+0

複雑である必要はありません。ネストされたOpenMPははるかに簡単です。 –

関連する問題