2010-06-18 60 views
0

我刷新openmp有点,并陷入这种奇怪的情况。剃掉了一堆,我创建了一个显示问题段错误与-fopenmp为一个简单的程序

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上指定标志,gfortran 4.3.4(10.6)编译,程序正确执行这个最小的小例子。

但是,如果我使用-fopenmp启用openmp,程序将终止并出现分段错误。显然,没有代码被执行,因为它立即崩溃。正如您所看到的,openmp在代码中不会用于并行化任何事情。我试图修改堆栈大小,都使用ulimit -fmax-stack-var-size,并且在任何情况下,千万个实数都不是我定义的一个大数组。

我在做什么错?

回答

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轮候册,-stack_size,0x40000000之后,-stack_addr,0xf0000000 -o ex2.exe

解决了我的Mac上的问题。

+0

它适用于我,但只能通过删除-stack_addr规范。我得到页面零段和堆栈段之间的段重叠。我想指定stack_size,这将离开编译器安排的堆栈地址。 – 2010-06-18 23:14:58

0

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

2

我同意M.S.B.这是一个常见的堆栈大小问题。我建议在堆上分配x字段。我也尽量避免在堆栈上使用数组(对于所有局部变量,在您的情况下,堆栈式分配会发生)。这可以防止像子例程这样的一些令人讨厌的错误在某个问题大小时开始出现故障,或者在另一台机器上出现不同堆栈大小的问题。同样从我的经验来看,堆上的分配和释放操作并不会导致很大的运行时间开销。