当我学习如何使用OpenMP指令避免与多个线程潜在读写的数据冲突时,我遇到了一个问题!$ atomic。
下面的文字显示的是我的问题所代表的代码段。我想知道FORTRAN中是否合法使用不同的索引(这里是 j )来表示!$ atomic比循环索引变量 i ,这是紧随其后的那个指令!$ omp parallel do private(a,b)?感谢。
program main
...
integer :: i,j
integer, dimension(10000) :: vx,vy,va,vb
...
va=0
!$omp parallel do private(j)
do i=1,10000
j=merge(vx(i),vy(i),mod(i,2)==1)
!$omp atomic update
va(j)=va(j)+vb(j)
end do
!$omp end parallel do
...
end program
此外,循环使用原子指令是否可以?
program main
...
integer :: i,j
integer, dimension(10000) :: vx,vy
integer, dimension(12,10000) :: va,vb
...
va=0
!$omp parallel do private(j,k)
do i=1,10000
j=merge(vx(i),vy(i),mod(i,2)==1)
do k=1,12
!$omp atomic update
va(k,j)=va(k,j)+vb(k,j)
enddo
end do
!$omp end parallel do
...
end program
答案 0 :(得分:1)
是的,为什么不呢?它只是更新一个内存地址,没有区别。在你的情况下,使用原子与i甚至没有多大意义,因为不同的线程具有不同的i
值。
但是,要注意你的j
你的竞争条件是你从更多的帖子写的,它应该是private
。
你的第二个例子没有添加任何新内容,情况相同,仍然合法。