主题:Openmp中关于!$OMP Atomic的使用方法
先请各位大侠看一小段程序:
program main
implicit none
integer :: a=0,i,atmp
!$OMP Parallel
atmp=0
!$OMP DO
do i=1,100
atmp=atmp+i
enddo
!$OMP END DO
!$OMP ATOMIC
a=a+atmp
!$OMP End Parallel
write(*,*) a
pause
end
请问这个程序的运行结果应该是多少?按照书上的说法,在!$OMP Atomic语句后的语句应该是逐次访问变量的地址位的,结果应该是5050,但是经过我的试验,在do循环结束以后,四个线程中的atmp的值都会统一成一个值,这就导致了a=a+atmp的的计算实际上是对同一个atmp的值加了四次。
请问各位老师,这段程序应该怎么改,才能实现do循环下的正确求和?
program main
implicit none
integer :: a=0,i,atmp
!$OMP Parallel
atmp=0
!$OMP DO
do i=1,100
atmp=atmp+i
enddo
!$OMP END DO
!$OMP ATOMIC
a=a+atmp
!$OMP End Parallel
write(*,*) a
pause
end
请问这个程序的运行结果应该是多少?按照书上的说法,在!$OMP Atomic语句后的语句应该是逐次访问变量的地址位的,结果应该是5050,但是经过我的试验,在do循环结束以后,四个线程中的atmp的值都会统一成一个值,这就导致了a=a+atmp的的计算实际上是对同一个atmp的值加了四次。
请问各位老师,这段程序应该怎么改,才能实现do循环下的正确求和?