Fortran中的OpenMP

时间:2010-05-19 16:56:51

标签: fortran openmp

我很少使用fortran,但是我的任务是将遗留代码重写为并行运行。我正在使用gfortran作为我的编译器选择。我在https://computing.llnl.gov/tutorials/openMP/以及其他一些人那里找到了一些很好的资源。

我的问题是,在我添加任何OpenMP指令之前,如果我只是编译遗留程序:

gfortran Example1.F90 -o Example1

一切正常,但即使不添加指令,也可以打开openmp编译器选项:

gfortran -openmp Example1.F90 -o Example1

运行遗留程序时,

会出现Segmentation故障。使用我编写的较小的测试程序,我已成功使用在多个线程上运行的-openmp编译其他程序,但我不知道为什么单独启用该选项而没有指令导致seg错误。

如果我的问题相当简单,我道歉。我可以发布代码,但它很长。它在我分配初始值时出错:

    REAL, DIMENSION(da,da) :: uconsold
    REAL, DIMENSION(da,da,dr,dk) :: uconsolde

    ...

    uconsold=0.0    
    uconsolde=0.0       

“uconsold”的第一个分配工作正常,第二个似乎是故障的来源,因为当我评论该行时,下一行快速执行,直到再次使用“uconsolde”。

感谢您对此事的任何帮助。

2 个答案:

答案 0 :(得分:7)

也许你正在运行堆栈空间?使用openmp变量将在堆栈上,以便每个线程都有自己的副本。也许你的数组很大,即使只有一个线程(没有openmp指令),它们也会占用堆栈。只是猜测...尝试使用操作系统的方法来增加堆栈空间的大小,看看分段错误是否消失。

另一种方法:指定数组应该在堆上,你可以使它“可分配”。 OpenMP 3.0版允许更多使用Fortran可分配数组 - 我不确定细节。

答案 1 :(得分:2)

我有这个问题。它很怪异:我得到段错误只是为了声明没有OpenMP指令的33x33阵列或11x11x11阵列;这些段错误发生在具有4 GB RAM的Intel Mac上。使它们“可分配”而不是静态分配修复了这个问题。