4

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

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

gfortran Example1.F90 -o Example1

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

gfortran -openmp Example1.F90 -o Example1

当我运行旧程序时,会出现分段错误。使用我编写的较小的测试程序,我已经成功地编译了其他在多个线程上运行的带有 -openmp 的程序,但是我很困惑为什么单独启用该选项并且没有指令会导致段错误。

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

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

    ...

    uconsold=0.0    
    uconsolde=0.0       

对“uconsold”的第一个分配工作正常,第二个似乎是错误的根源,因为当我注释掉该行时,接下来的几行会愉快地执行,直到再次使用“uconsolde”。

感谢您在这件事上提供的任何帮助。

4

2 回答 2

8

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

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

于 2010-05-19T17:20:19.833 回答
2

我有这个问题。令人毛骨悚然:我仅仅因为声明 33x33 数组或 11x11x11 数组而没有 OpenMP 指令而得到段错误;这些段错误发生在具有 4 GB RAM 的 Intel Mac 上。使它们“可分配”而不是静态分配解决了这个问题。

于 2011-01-28T00:30:22.787 回答