0

私はOpenMPを初めて使用しますが、現時点では、詳細を確認できるワークステーションにアクセスできません。ハンズオンパートに進む直前に、基本を設定するための簡単な質問がありました。

反復を使用してマップを展開し、展開後の変数の最終値を提供するFORTRAN90で記述されたシリアルプログラムがあるとすると、コードは次のようになります。

 call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE
 do i=1,50000  !! ITERATION OF THE SYSTEM
  xf=4.d0*xi*(1.d0-xi) !! EVOLUTION OF THE SYSTEM
  xi=xf
 enddo     !! END OF SYSTEM ITERATION
print*, xf

100の異なるランダムな初期条件に対して、クラスター上で独立したプロセスと同じコードを実行し、初期条件によって出力がどのように変化するかを確認したいと思います。この目的のシリアルプログラムは次のようになります。

do iter=1,100 !! THE INITIAL CONDITION LOOP
 call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE
 do i=1,50000  !! ITERATION OF THE SYSTEM
  xf=4.d0*xi*(1.d0-xi) !! EVOLUTION OF THE SYSTEM
  xi=xf
 enddo     !! END OF SYSTEM ITERATION
print*, xf

私が考えることができるOpenMPの実装は機能しますか?私が思いついたコードは次のとおりです。

!$ OMP PARALLEL PRIVATE(xi,xf,i)
!$ OMP DO
  do iter=1,100 !! THE INITIAL CONDITION LOOP
   call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE
    do i=1,50000  !! ITERATION OF THE SYSTEM
     xf=4.d0*xi*(1.d0-xi) !! EVOLUTION OF THE SYSTEM
     xi=xf
    enddo     !! END OF SYSTEM ITERATION
  print*, xf
!$ OMP ENDDO
!$ OMP END PARALLEL

提案や助けを事前に感謝します。

4

2 に答える 2

1

このラインだと思います

   call random_number(xi) !! RANDOM INITIALIZATION OF THE VARIABLE

いくつかの問題を引き起こす可能性があります。システムでの の実装はrandom_numberスレッドセーフですか? 私には手がかりがありません.あなたのコンパイラやオペレーティングシステムについては何も知りません. スレッドセーフでない場合、OpenMP* スレッドがすべて乱数ジェネレーターの使用を開始したときに、プログラムがさまざまなことを行う可能性があります。それらには、クラッシュやデッドロックが含まれます。

実装がスレッドセーフである場合、スレッドがすべて同じ乱数シーケンスを生成するかどうかを確認する方法を理解する必要があります。各スレッドで同じ乱数を使用するプログラムや、異なるスレッドで異なるシーケンスを使用するプログラムを作成することは完全に賢明ですが、取得したものが目的のものであることを理解する必要があります。

また、乱数ジェネレーターがスレッドセーフで、スレッドごとに異なるシーケンスを生成する場合、それらのシーケンスは、シングルスレッドの乱数ジェネレーターが合格する可能性のあるランダム性の一種のテストに合格しますか?

並列プログラムで疑似乱数の適切に独立したシーケンスを生成するのは非常に困難です。確かに、SO回答のスペースでカバーできるものではありません。

コードの連続部分で、必要なすべての乱数を (おそらく配列に) 生成し、さまざまなスレッドが配列からさまざまな要素を読み取れるようにすることで役立つ可能性のある回避策をすべて見つけます。

于 2013-03-12T17:51:36.587 に答える
0

クラスタ上で独立したプロセスとして同じコードを実行したい

次に、OpenMP は必要ありません。OpenMP は、単一のアドレス空間内で並列処理を利用することを目的としています。

クラスターで操作したい場合は、MPI を参照することをお勧めします。

于 2013-03-13T15:56:41.770 に答える