コードを並列化しようとしましたが、パフォーマンスが低下するだけでした。私はいくつかのモンテカルロ統合を実行し、その平均を見つけるFortranコードを書いた。OpenMPを使用して並列化する際のパフォーマンスの問題
implicit none
integer, parameter :: n=100
integer, parameter :: m=1000000
real, parameter :: pi=3.141592654
real MC,integ,x,y
integer tid,OMP_GET_THREAD_NUM,i,j,init,inside
read*,init
call OMP_SET_NUM_THREADS(init)
call random_seed()
!$OMP PARALLEL DO PRIVATE(J,X,Y,INSIDE,MC)
!$OMP& REDUCTION(+:INTEG)
do i=1,n
inside=0
do j=1,m
call random_number(x)
call random_number(y)
x=x*pi
y=y*2.0
if(y.le.x*sin(x))then
inside=inside+1
endif
enddo
MC=inside*2*pi/m
integ=integ+MC/n
enddo
!$OMP END PARALLEL DO
print*, integ
end
スレッドの数を増やすと、実行時間が大幅に増加します。私はそのような問題の解決策を探していましたが、ほとんどの場合共有メモリ要素が問題になりましたが、私のケースにどのように影響しているのか分かりません。
私は、インテルFortranコンパイラを使用して16コア・プロセッサで実行しています。
EDIT:あなたは並列スレッドではない間違いなくハイパフォーマンス・コンピューティングのためのRANDOM_NUMBER
を使用してはいけませんprivate節
ようこそ。 [ツアー]を取ってください、それはすべての新規の方にお勧めです。どのように時間を測定しましたか? –
コード内のインデントをどのように変更したかをご覧ください。人々が構造を見ることができるように、すべてのコードをインデントしておくとよいでしょう。ソースファイルをそのまま維持することは良いことです。 –
「内部」とは何ですか?それはどこから来たのですか? 'IMPLICIT NONE'を必ず使用してください。 –