在我用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
但我不知道是否以这种方式,我可以产生竞争条件。关于如何更好地编写此循环的任何建议? 提前致谢
答案 0 :(得分:1)
可以通过以下方式并行化这种循环:
有关实施“prefix-sum”的详细信息,请参阅discussion of parallel prefix-sum。步骤2可以嵌入前缀sum的“Downsweep”阶段(参见其他讨论)。因为prefix-sum使带宽消耗加倍(因为它是一个两遍算法),所以很难从中获得加速。