gpt4 book ai didi

fortran - Fortran 中的 OpenMP

转载 作者:行者123 更新时间:2023-12-04 23:10:02 24 4
gpt4 key购买 nike

我很少使用 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

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

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

最佳答案

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

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

关于fortran - Fortran 中的 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2867680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com