Loops Fortran 90/95 OpenMP阵列缩减(总和)
我正在研究将一些OpenMP指令添加到一大组相当昂贵的嵌套循环中。我相信我需要在我的指令中使用reduce子句,因为数组上的操作不一定是独立的。但是,当尝试添加reduction指令时,我的应用程序核心转储(但编译)。我使用的是IBM的XL Fortran编译器,支持OpenMP 3.0。我的(简化)代码如下:Loops Fortran 90/95 OpenMP阵列缩减(总和),loops,fortran,openmp,nested-loops,fortran90,Loops,Fortran,Openmp,Nested Loops,Fortran90,我正在研究将一些OpenMP指令添加到一大组相当昂贵的嵌套循环中。我相信我需要在我的指令中使用reduce子句,因为数组上的操作不一定是独立的。但是,当尝试添加reduction指令时,我的应用程序核心转储(但编译)。我使用的是IBM的XL Fortran编译器,支持OpenMP 3.0。我的(简化)代码如下: !$omp parallel do reduction(+:f) private(n,m,l,i,j,k, & !$omp parm,ista,iend,
!$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)。这仅仅是一个语法问题吗?我已经在几个小的玩具问题上试过了,但是我很难把我通过一个小测试学到的东西应用到这个环境中。为了便于参考,几个月前我问了一个类似的问题,但问题从那时起发生了轻微的变化,我不相信现在的解决方案是那么简单()
谢谢你的帮助/意见 我正在使用英特尔Fortran编译器,但我和你有过类似的经历,运行时出现分段错误 在我的例子中,下面解决了这个问题,它增加了线程堆栈的大小。我希望这有帮助
[hoge@hoge]$ ulimit -s unlimited
[hoge@hoge]$ export OMP_STACKSIZE=1g # 1GB for thread stack size
我使用的是英特尔Fortran编译器,但我和你有过类似的经历,运行时出现分段错误 在我的例子中,下面解决了这个问题,它增加了线程堆栈的大小。我希望这有帮助
[hoge@hoge]$ ulimit -s unlimited
[hoge@hoge]$ export OMP_STACKSIZE=1g # 1GB for thread stack size
我看不出有什么不对劲,所以我可以建议在这个部分的框中添加deugg
jsta=max j bounds吗?如果数组索引不在其中,则可能导致seg故障。可以使用-C选项编译代码以启用数组绑定检查。可能是堆栈内存不足。尝试使用allocate()或指针将字段放在堆上。也许还有一些环境变量可以让系统增加堆栈。最后,它对小问题有效吗?谢谢你的建议。我将尝试重新讨论这个问题,如果我学到了什么,我会让你们都知道!我看不出有什么不对劲,所以我可以建议在这个部分的框中添加deuggjsta=max j bounds吗?如果数组索引不在其中,则可能导致seg故障。可以使用-C选项编译代码以启用数组绑定检查。可能是堆栈内存不足。尝试使用allocate()或指针将字段放在堆上。也许还有一些环境变量可以让系统增加堆栈。最后,它对小问题有效吗?谢谢你的建议。我将尝试重新讨论这个问题,如果我学到了什么,我会让你们都知道!