0

大家好,我正在将我的代码从在 ubuntu 上运行的集群部署到具有相同硬件的集群上,但使用的是红帽,并且看起来更旧的 gfortran 编译器。源码其实是由ifort编译的,但是由于没有安装在red had cluster上,我可能不得不切换到gfortran。

现在的问题是代码无法编译。在我可以在我的部分代码中修复的类型中有一个带有“可分配”的东西,但是其他人也有其他贡献,他们还没有准备好将他们的代码适应旧标准。

我的问题 :

  1. 尽管如此,我如何将其部署到另一个系统上,希望不会发生太大变化?
  2. 当使用相同版本的编译时,还有什么其他惊喜等着我,只是不同的颠覆?
  3. 我如何强制这样的事情不再发生?代码应该可以在不诉诸暴力的情况下部署到各种系统上。

感谢您的建议和欢呼

4

2 回答 2

1

gfortran 从 4.0 版开始。4.1 和 4.2 版本较旧,缺少许多功能,并且可能存在错误。您可能会遇到代码使用的其他缺失功能。我建议,如果可能的话,将编译器升级到当前的稳定版本,即 4.5。

支持所有版本的 gfortran 会对您的代码造成很多限制。最好确定最早的可用版本并将该信息添加到文档中。对于我的代码,该版本是 4.3,因为我广泛使用了 ISO C 绑定。

gfortran wiki http://gcc.gnu.org/wiki/GFortran有一个按版本划分的变更日志,可以帮助您确定所需的版本。唯一确定的方法是测试。

如果要强制执行版本要求,可以在 Fortran 中进行测试。您可以运行一个小型测试程序作为 make 过程的一部分,如果 gfortran 版本太早,则中止。

以下代码片段显示了从 Fortran 程序输出 gfortran 版本号的两种方式。使用文件类型“.F90”命名程序,以便 gfortran 调用预处理器。

#ifdef __GFORTRAN__ 
    write (*, '( "gfortran" )' )
    write (*, '( I0, ".", I0 )' )  __GNUC__, __GNUC_MINOR__

! Merged version number:
#define GCC_VERSION (__GNUC__ * 10000  + __GNUC_MINOR__ * 100  + __GNUC_PATCHLEVEL__)
    write (*, '( I0 )' )  GCC_VERSION

#endif
于 2010-09-28T17:24:39.963 回答
1

我认为你有3个选择:

  1. 交叉编译:即在你的开发机器上编译,以便在你的部署机器上执行;我不知道您的设置是否可行,但如果您还没有这样做,则值得调查。
  2. 对所有编译器中实现的 Fortran 特性集进行编程——这意味着重新编写代码以去除 4.2.3 实现的任何特性,而 4.1.2 没有实现。
  3. 升级部署机器上的编译器以匹配开发机器上的编译器。

其中,我认为(1)可能是困难的;如果是,那么我会选择(3)。如果那不可能,那么它必须是(2)——我没有看到任何其他选择。

现在回答你的问题:

  1. 上面回答了。
  2. 不确定,但 Gfortran 的发行说明应该告诉您 Fortran 语言功能 4.2.3 实现了哪些 4.1.2 没有。
  3. 仅使用可以在目标平台上编译的 Fortran 版本的程序。
于 2010-09-28T17:08:03.643 回答