Fortran中的OpenMP

Dio*_*Dio 4 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       
Run Code Online (Sandbox Code Playgroud)

第一个分配给"uconsold"的工作正常,第二个似乎是错误的来源,因为当我评论该行时,接下来的几行快速执行,直到再次使用"uconsolde".

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

M. *_* B. 7

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

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