我正在努力将一些OpenMP指令添加到一大堆相当昂贵的嵌套循环中。我相信我需要在我的指令中使用reduction子句,因为数组上的操作不一定是独立的。但是,在尝试添加还原指令时,我的应用程序核心转储(但会编译)。我正在使用通过OpenMP 3.0启用的IBM XL Fortran编译器。我的(简化)代码如下:
!$omp parallel do reduction(+:f) private(n,m,l,i,j,k, &
!$omp parm,ista,iend,jsta,jend,ksta,kend)
do n=1,lm !k
do m=1,jm !j
do l=1,im !i
if (val(l,m,n) .ne. zero) then
jsta=max j bounds in box
jend=min j bounds in box
ista=max i bounds in box
iend=min i bounds in box
ksta=min k bounds in box
kend=max k bounds in box
do k=ksta,kend
do j=jsta,jend
do i=ista,iend
parm = exp( -dx*(abs(i-l)) &
-dy*(abs(j-m)) &
-dz*(abs(k-n)))
f(i,j,k) = f(i,j,k)+ val(l,m,n) * parm
end do
end do
end do
end if
end do
end do
end do
其中f具有维度(im,jm,lm)。这只是一个语法问题吗?我一直在尝试解决几个较小的玩具问题,但是我很难通过一个较小的测试来学习我所学到的东西。出于参考目的,几个月前我问了一个类似的问题,但问题从那时起略有改变,我不相信解决方案现在很简单(link)。
感谢您提供任何帮助/意见!
答案 0 :(得分:1)
我正在使用英特尔Fortran编译器,但我有类似的经验,在运行时出现分段错误。
在我的情况下,以下解决了问题,增加了线程堆栈的大小。我希望这会有所帮助。
[hoge@hoge]$ ulimit -s unlimited
[hoge@hoge]$ export OMP_STACKSIZE=1g # 1GB for thread stack size