(ulimit -s unlimited)和(export KMP_STACKSIZE = xx)之间有什么区别?

时间:2019-03-08 04:07:15

标签: fortran openmp intel ulimit stack-size

我像下面那样运行程序,并使用了(NULL。 可以。

ulimit -s unlimited

我不喜欢使用 REAL(DP), DIMENSION(1024,2,1541) :: L_X TanV REAL(DP), DIMENSION(4) :: Val_X, Val_Y REAL(DP), dimension(1029) :: E_x REAL(DP), dimension(1024) :: E_y REAL(DP), DIMENSION(1024,1024) :: E_Fx, E_Fy !$OMP SECTIONS PRIVATE(i, j, ii,jj, PSL_X, i_x, i_y, Val_X, Val_Y) !$OMP SECTION do j=1,LinkPlusBndry do i=1,Kmax(j)-1 PSL_X(1)=modulo(L_X(i,1,j),H*N2); PSL_X(2)=L_X(i,2,j) i_x=floor(PSL_X(1)/H)+2; i_y=floor(PSL_X(2)/H) call Delta4((E_x(i_x:i_x+3)-PSL_X(1))/H,Val_X) call Delta4((E_y(i_y:i_y+3)-PSL_X(2))/H,Val_Y) do ii=1,4; do jj=1,4 EE_Fx(i_y+ii-1,i_x+jj-1)=EE_Fx(i_y+ii-1,i_x+jj-1) & +tauH2*TanV(i,1,j)*Val_X(jj)*Val_Y(ii) end do; end do end do end do ... ... ... !$OMP SECTION do j=1,LinkPlusBndry do i=1,Kmax(j)-1 PSL_X(1)=modulo(L_X(i,1,j),H*N2); PSL_X(2)=L_X(i,2,j) i_x=floor(PSL_X(1)/H)+2; i_y=floor(PSL_X(2)/H) call Delta4((E_x(i_x:i_x+3)-PSL_X(1))/H,Val_X) call Delta4((E_y(i_y:i_y+3)-PSL_X(2))/H,Val_Y) do ii=1,4; do jj=1,4 EE_Fy(i_y+ii-1,i_x+jj-1)=EE_Fy(i_y+ii-1,i_x+jj-1) & +tauH2*TanV(i,2,j)*Val_X(jj)*Val_Y(ii) end do; end do end do end do !$OMP END SECTIONS ,它仅使用2个线程来限制速度。

所以我像下面那样更改了代码。

!$OMP SECTION

启动此代码时,出现分段错误。

我认为这与内存大小有关。 因此,在搜索后我找到了解决方案

!$OMP DO PRIVATE(j, i, PSL_X, i_x, i_y, ii, jj, Val_X, Val_Y) REDUCTION(+:EE_Fx, EE_Fy)
do j=1,LinkPlusBndry
  do i=1,Kmax(j)-1
    PSL_X(1)=modulo(L_X(i,1,j),H*N2); PSL_X(2)=L_X(i,2,j)
    i_x=floor(PSL_X(1)/H)+2; i_y=floor(PSL_X(2)/H)
    call Delta4((E_x(i_x:i_x+3)-PSL_X(1))/H,Val_X)
    call Delta4((E_y(i_y:i_y+3)-PSL_X(2))/H,Val_Y)
    do ii=1,4; do jj=1,4
       EE_Fx(i_y+ii-1,i_x+jj-1)=EE_Fx(i_y+ii-1,i_x+jj-1) &
                               +tauH2*TanV(i,1,j)*Val_X(jj)*Val_Y(ii)
       EE_Fy(i_y+ii-1,i_x+jj-1)=EE_Fy(i_y+ii-1,i_x+jj-1) &
                               +tauH2*TanV(i,2,j)*Val_X(jj)*Val_Y(ii)
    end do; end do

    PSL_X(1)=modulo(L_X(i+1,1,j),H*N2); PSL_X(2)=L_X(i+1,2,j)
    i_x=floor(PSL_X(1)/H)+2; i_y=floor(PSL_X(2)/H)
    call Delta4((E_x(i_x:i_x+3)-PSL_X(1))/H,Val_X)
    call Delta4((E_y(i_y:i_y+3)-PSL_X(2))/H,Val_Y)
    do ii=1,4; do jj=1,4
       EE_Fx(i_y+ii-1,i_x+jj-1)=EE_Fx(i_y+ii-1,i_x+jj-1) &
                               -tauH2*TanV(i,1,j)*Val_X(jj)*Val_Y(ii)
       EE_Fy(i_y+ii-1,i_x+jj-1)=EE_Fy(i_y+ii-1,i_x+jj-1) &
                               -tauH2*TanV(i,2,j)*Val_X(jj)*Val_Y(ii)
    end do; end do
  end do
end do
!$OMP END DO

现在我使用2个不同的命令

 export KMP_STACKSIZE=value

 ulimit -s unlimited 

它运行良好,但是我不知道两个命令之间的区别。 有什么区别?

1 个答案:

答案 0 :(得分:2)

ulimit设置程序的操作系统限制。

KMP_STACKSIZE告诉OpenMP实现有关实际为每个堆栈分配多少堆栈。因此,根据您的操作系统默认值,您可能同时需要两者。顺便说一句,您应该改用OMP_STACKSIZE,因为KMP_STACKSIZE是Intel和clang编译器使用的环境变量。 OMP_STACKSIZE是设置OpenMP线程的堆栈大小的标准方法。

请注意,此问题通常更容易解决,因为Fortran倾向于将更多数据保留在堆栈上,尤其是。数组。一些编译器可以将此类数组自动移动到堆中,例如英特尔编译器,请参见-heap-arrays