【问题标题】:what is difference between (ulimit -s unlimited) and (export KMP_STACKSIZE = xx)?(ulimit -s unlimited) 和 (export KMP_STACKSIZE = xx) 有什么区别?
【发布时间】:2019-07-30 02:15:51
【问题描述】:

我像下面这样运行我的程序,并使用了 (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

我不喜欢使用!$OMP SECTION,它只使用2个线程限制了速度。

所以我改变了我的代码,如下所示。

!$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

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

我认为这与内存大小有关。 所以,经过搜索,我找到了这个解决方案

 export KMP_STACKSIZE=value

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

 ulimit -s unlimited 

 export KMP_STACKSIZE=value

效果很好,但我不知道这两个命令之间的区别。 有什么区别?

【问题讨论】:

  • 我们知道的细节太少,无法知道ulimit -s 到底发生了什么。至少你应该告诉我们你的操作系统是什么(发行版和版本),你的编译器是什么(版本)以及你得到的错误。您还应该说,您将哪个value 用于KMP_STACKSIZE,如果这个变量在您使用export 之前有任何值。
  • 我使用 intelcompiler、centOS 7 和 KMP_STACKSIZE=1g。我不知道默认值是什么。对不起。

标签: fortran openmp intel ulimit stack-size


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多