Fortran 90/95使用数组减少OpenMP(总和)

时间:2011-11-04 18:52:26

标签: loops fortran openmp nested-loops fortran90

我正在努力将一些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)。

感谢您提供任何帮助/意见!

1 个答案:

答案 0 :(得分:1)

我正在使用英特尔Fortran编译器,但我有类似的经验,在运行时出现分段错误。

在我的情况下,以下解决了问题,增加了线程堆栈的大小。我希望这会有所帮助。

[hoge@hoge]$ ulimit -s unlimited
[hoge@hoge]$ export OMP_STACKSIZE=1g # 1GB for thread stack size