OPENMP:如何在fortran中移动矢量

时间:2013-06-20 14:18:07

标签: 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用户,所以,我不知道如何以正确的方式编写此循环。 最初,我想到这样的事情:

!$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 :(得分:1)

可以通过以下方式并行化这种循环:

  1. 对1和0的序列使用“prefix-sum”操作,其中如果采用THEN,则sequence元素为1,否则为0。 prefix-sum的结果告诉你每次迭代的j值。
  2. 执行THEN操作,用左侧替换临时数组, 使用步骤1中的j值。
  3. 将临时数组复制回原始数组。
  4. 有关实施“prefix-sum”的详细信息,请参阅discussion of parallel prefix-sum。步骤2可以嵌入前缀sum的“Downsweep”阶段(参见其他讨论)。因为prefix-sum使带宽消耗加倍(因为它是一个两遍算法),所以很难从中获得加速。