Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Fortran 90/95 OpenMP阵列缩减(总和)_Loops_Fortran_Openmp_Nested Loops_Fortran90 - Fatal编程技术网

Loops Fortran 90/95 OpenMP阵列缩减(总和)

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,

我正在研究将一些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,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()或指针将字段放在堆上。也许还有一些环境变量可以让系统增加堆栈。最后,它对小问题有效吗?谢谢你的建议。我将尝试重新讨论这个问题,如果我学到了什么,我会让你们都知道!我看不出有什么不对劲,所以我可以建议在这个部分的框中添加deugg
jsta=max j bounds吗?如果数组索引不在其中,则可能导致seg故障。可以使用-C选项编译代码以启用数组绑定检查。可能是堆栈内存不足。尝试使用allocate()或指针将字段放在堆上。也许还有一些环境变量可以让系统增加堆栈。最后,它对小问题有效吗?谢谢你的建议。我将尝试重新讨论这个问题,如果我学到了什么,我会让你们都知道!