使用-fopenmp进行段错误以获得一个简单的程序

时间:2010-06-18 14:44:20

标签: fortran openmp segmentation-fault

我正在刷新openmp,并陷入了这种奇怪的境地。剃掉了一堆,我创建了这个显示问题的最小琐碎案例

program ex2
    implicit none
    integer, parameter :: n=10000000
    integer :: i
    real :: x(n)

    do i=1,n
        x(i) = 0.0d0
    enddo

end program

没有指定标志,mac(10.6)上的gfortran 4.3.4编译,程序正确执行。

但是,如果我使用-fopenmp启用openmp,程序将终止并出现分段错误。显然,没有代码被执行,因为它立即崩溃。如您所见,openmp从未在代码中用于并行化任何东西。我尝试修改堆栈大小,两者都使用ulimit -fmax-stack-var-size,并且无论如何,千万雷亚尔不是我定义的大数组。

我做错了什么?

3 个答案:

答案 0 :(得分:4)

是的,openmp通常会改变内存的分配方式。之前的讨论:OpenMP in Fortran

在网上搜索,我找到了http://homepage.mac.com/eric.c/hpc/contents/documentation/How%20to%20increase%20the%20stack%20size%20on%20Mac%20OS%20X.pdf

gfortran-mp-4.3 -fopenmp ex2.f90 -Wl,-stack_size,0x40000000,-stack_addr,0xf0000000 -o ex2.exe

修复了我的Mac上的问题。

答案 1 :(得分:2)

我同意M.S.B.这是一个常见的堆栈大小问题。我建议在堆上分配x字段。我也试图完全避免在堆栈上使用数组(在你的情况下,所有局部变量的堆栈方式分配)。这可以防止几个令人讨厌的错误,例如子程序在某个问题大小时开始出现故障,或者在另一台机器上出现不同堆栈大小的问题。根据我的经验,堆上的分配和释放不会导致显着的运行时开销。

答案 2 :(得分:0)

这是一个暗淡的尝试答案:openmp标志是否将数组从堆栈移动到堆中?如果是这样,可能会产生什么影响?