回 帖 发 新 帖 刷新版面

主题:ivf openmp 并行 堆栈溢出

我在写一个openmp的并行程序,当程序数组比较大时,就会出现堆栈溢出错误。
网上说增加堆栈大小,这个方法可行吗?计算时都是什么变量要进入堆栈?

回复列表 (共15个回复)

11 楼

[quote]在这种情况下数组IC是不进栈的,
那么怎么栈溢出呢?

      PROGRAM HELLO
      DIMENSION IC (10000000)

!$OMP PARALLEL PRIVATE(I),SHARED(IC)
!$OMP DO SCHEDULE(DYNAMIC)
        DO I = 1, NMAX
             IC(I) = I*3
        END DO
!$OMP END DO
        write (*,*) "I = " ,IC(100)

!$OMP END PARALLEL 

       END
[/quote]

出错提示是堆栈溢出吗? 你这个程序的write卸载那个位置在有些系统环境下是会直接挂掉的.

12 楼


提示如下:
forrtl: severe (170): Program Exception - stack overflow
Image              PC        Routine            Line        Source
omp.exe            00446717  Unknown               Unknown  Unknown
omp.exe            00464A83  Unknown               Unknown  Unknown
omp.exe            004468C3  Unknown               Unknown  Unknown
kernel32.dll       77323677  Unknown               Unknown  Unknown
ntdll.dll          77D69F02  Unknown               Unknown  Unknown
ntdll.dll          77D69ED5  Unknown               Unknown  Unknown

13 楼

共享变量可以放在堆里也可以放在栈区,由程序员自行控制,默认都是栈

14 楼

昨晚没有测试就回帖了, 今早修改了一下检测测试, 更新了一下帖子.

不一定是因为omp的变量堆栈出错的. 以前的使用中试过I/O在linux下提示段错误.
下面是网友的测试代码(稍有修改), 为了看内存, 我在并行区加了个pause, 不知道对不对, 请指正.

      PROGRAM HELLO
      IMPLICIT NONE
      INTEGER :: I, NMAX = 100000000
      integer, allocatable, dimension (:) :: IC
      ALLOCATE ( IC(NMAX))

!$OMP PARALLEL DEFAULT(NONE) PRIVATE(I),SHARED(IC, NMAX)
!$OMP DO SCHEDULE(DYNAMIC)
        DO I = 1, NMAX
             IC(I) = I*3
             pause
        END DO
!$OMP END DO
!$OMP END PARALLEL 
       write (*,*) "I = " ,IC(100)
       DEALLOCATE ( IC)
       pause 100
       END

在vs2010下, 用ivf2011XE打开一个新工程, debug模式下使用默认设置(我不清楚默认下ivf分配一个多大的omp stack), 只修改omp编译选择. 编译之后生成编译命令是:
ifort /nologo /debug:full /Od /Qopenmp /warn:interfaces /module:"Debug\\" /object:"Debug\\" /Fd"Debug\vc100.pdb" /traceback /check:bounds /libs:static /threads /dbglibs /c /Qvc10 /Qlocation,link,"C:\Program Files\Microsoft Visual Studio 10.0\VC\\bin" "C:\test.f90"

在pause的过程中, 由任务管理器看内存没明显增加. 不知道看任务管理器准不准,只是随手测试没使用其它工具.

不知道你测试的环境是什么?

15 楼

[quote]共享变量可以放在堆里也可以放在栈区,由程序员自行控制,默认都是栈[/quote]
怎样设置可以让它进堆?

我来回复

您尚未登录,请登录后再回复。点此登录或注册