主题:ivf openmp 并行 堆栈溢出
xaxaxaxaxdxd
[专家分:0] 发布于 2010-11-09 18:14:00
我在写一个openmp的并行程序,当程序数组比较大时,就会出现堆栈溢出错误。
网上说增加堆栈大小,这个方法可行吗?计算时都是什么变量要进入堆栈?
回复列表 (共15个回复)
11 楼
yeg001 [专家分:14390] 发布于 2011-06-02 12:58:00
[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 楼
bshine1225 [专家分:720] 发布于 2011-06-02 19:47:00
提示如下:
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 楼
dongyuanxun [专家分:7180] 发布于 2011-06-02 20:19:00
共享变量可以放在堆里也可以放在栈区,由程序员自行控制,默认都是栈
14 楼
yeg001 [专家分:14390] 发布于 2011-06-02 20:26:00
昨晚没有测试就回帖了, 今早修改了一下检测测试, 更新了一下帖子.
不一定是因为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 楼
bshine1225 [专家分:720] 发布于 2011-06-03 14:37:00
[quote]共享变量可以放在堆里也可以放在栈区,由程序员自行控制,默认都是栈[/quote]
怎样设置可以让它进堆?
我来回复