0

我正在刷新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,无论如何,一千万实数不是我定义的大数组。

我究竟做错了什么 ?

4

3 回答 3

4

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

在网上搜索,我发现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 上的问题。

于 2010-06-18T20:41:57.090 回答
2

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

于 2010-07-07T12:47:17.417 回答
0

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

于 2010-06-18T17:29:59.320 回答