减少FORTRAN

时间:2015-04-24 00:31:27

标签: fortran

我正在尝试使用OpenMP在我的FORTRAN代码中并行化模块,并且我遇到了线程覆盖数组中更新值的一些问题。显然我的第一直觉是做一个减少,但我不确定如何在这种情况下去做,因为我只是在一个简单的x = x +更新类型的情况下完成它,因为这是类似的,但通常是无序的方式,也是数组。

subroutine chargeInterp(q,x,xmin,xmax,dg,np,ng)
real(kind = 8) :: charge, dg, xmin, weight, xmax,wp
integer :: g1,g2,g1temp,g2temp,i,np,ng
real(kind = 8), dimension(np) :: q,x


!$OMP PARALLEL DO PRIVATE(g1,g2) REDUCTION(+:q)
do i=1,np

g1 = floor((x(i)-xmin)/dg)
g2 = g1 + 1
wp=((x(i)-xmin)/dg-g1)
weight=1-wp
q(g1+1) = q(g1+1) - weight 
q(g2+1) = q(g2+1) - wp      
enddo   
!$OMP END PARALLEL DO

只是简要介绍它正在做什么,基本上它是取一个粒子的位置并将其电荷加权到网格上的相邻网格点上。

感谢您的帮助!

P.S。围绕循环的omp语句不起作用。把那个丢掉。在更新q之前还尝试了!$ OMP ATOMIC。编译并运行,但我的结果与我的非并行化结果不匹配,所以这是不行的。

0 个答案:

没有答案