我试图对代码进行并行处理,但这只会降低性能。我写了一个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核心处理器上运行它。
编辑:添加implicit none
,声明所有变量和增加私人条款
欢迎。请参加[Tour],建议所有新人参加。你是如何衡量时间的? –
请参阅我如何更改代码中的缩进。将所有代码缩进以便人们可以看到结构是很好的。对你来说保留源文件也是有好处的。 –
'里面'是什么?它从何而来?请确保你使用'IMPLICIT NONE'。 –