Vector OPENMP:如何在fortran中洗牌向量

Vector OPENMP:如何在fortran中洗牌向量,vector,fortran,openmp,shuffle,Vector,Fortran,Openmp,Shuffle,在我用fortran编写的顺序代码中,我有一个子程序来洗牌一些向量,其工作方式如下: DO i=1,nsim IF(iflag(i) == 0)THEN j=j+1 pos(j)=pos(i) v(j)=v(i) iflag(j)=iflag(i) END IF END DO nsim=j 我是一个OpenMP新手,所以我不知道如何以正确的方式编写这个循环。 起初,我的想法是

在我用fortran编写的顺序代码中,我有一个子程序来洗牌一些向量,其工作方式如下:

    DO i=1,nsim

      IF(iflag(i) == 0)THEN

        j=j+1
        pos(j)=pos(i)
        v(j)=v(i)
        iflag(j)=iflag(i)

      END IF

    END DO
    nsim=j
我是一个OpenMP新手,所以我不知道如何以正确的方式编写这个循环。 起初,我的想法是这样的:

!$omp parallel do reduction(+: j)
  DO i=1,nsim

  IF(iflag(i) == 0)THEN

    j=j+1
    pos(j)=pos(i)
    v(j)=v(i)
    iflag(j)=iflag(i)

  END IF

END DO
!$omp end parallel do
nsim=j
但我不知道这样是否能产生一个竞赛条件。关于如何更好地编写这个循环,有什么建议吗?
提前感谢

可通过以下方式并行此类循环:

  • 在1和0的序列上使用“前缀和”运算,其中如果采用THEN,则序列元素为1,否则为0。前缀和的结果告诉您每个迭代的j值
  • 然后执行操作,用临时数组替换左侧, 使用步骤1中的j值
  • 将临时数组复制回原始数组
  • 有关实现“前缀和”的详细信息,请参阅。步骤2可以嵌入前缀和的“向下滑动”阶段(参见其他讨论)。因为前缀和会使带宽消耗翻倍(因为它是一个两次通过的算法),所以很难从中获得加速