!$ omp原子的索引与其主机的循环索引变量不同是否合法?

时间:2014-04-14 16:07:58

标签: multithreading parallel-processing fortran openmp

当我学习如何使用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

1 个答案:

答案 0 :(得分:1)

是的,为什么不呢?它只是更新一个内存地址,没有区别。在你的情况下,使用原子与i甚至没有多大意义,因为不同的线程具有不同的i值。

但是,要注意你的j你的竞争条件是你从更多的帖子写的,它应该是private

你的第二个例子没有添加任何新内容,情况相同,仍然合法。