回 帖 发 新 帖 刷新版面

主题: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循环下的正确求和?

回复列表 (共1个回复)

沙发

atmp 在一般默认是下shared的. 由atmp=0, 到Do循环都出现数据竞争(特别是Do循环下导致数值不断被覆盖). 可以考虑:

program main
  implicit none
  integer :: a,i,atmp
  a=0
  !$OMP Parallel Default(none) Private(i,atmp) Shared(a)
    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

我来回复

您尚未登录,请登录后再回复。点此登录或注册