我正在调用嵌套的 for 循环,如下所示:
do ir = 1,Nr
do iom = iom1, iom2
xyz(1) = xo(1) + xom(iom)*r
xyz(2) = xo(2) + yom(iom)*r
xyz(3) = xo(3) + zom(iom)*r
call FUNSUB(xyz,Nprop,PropXYZ)
enddo
enddo
whereFUNSUB
以下列方式评估属性:
id = 1
do l=0,lmax
do m=-l,l
id = id + 1
Prop(id) = RHO * Ylm(l,m,xl(1),xl(2),xl(3))
enddo
enddo
现在我正在尝试将其与某种形式并行化
!$OMP parallel do reduction(+:Prop) private(ir, l, m, j, iom, r, wrad, xyz, PropOm, PropOm1, PropXYZ)
为简洁起见,我的示例代码中省略了此处看到的其他一些私有变量。我有意尝试将其设为l
私有m
,以便在FUNSUB
循环内部独立评估属性。但是,我发现它们在线程之间共享。我已经放入了一些调试选项,发现它id
不断超出.Prop
l
lmax
m
(-l,l)
我的问题是:我如何确保它保持私密而不l
与m
主程序共享?似乎问题在于,它是一个完全不同的子例程,它保存这些值,并且不知何故,这些变量的私有声明不会延续