【问题标题】:Why does PGI not pick up on public attribute in this module?为什么 PGI 在此模块中不使用公共属性?
【发布时间】:2012-11-16 15:35:36
【问题描述】:

在这里使用其他人的代码。它用 gfortran 编译得很好。但是,在 Portland Group 下,我收到一个错误:

pgf90 -DsysLinux -DcompPGF90 -I/home/cables/GITM/share/Library/src  -c  -r8 -fast        ModUtilities.F90
PGF90-S-0084-Illegal use of symbol mpi_wtime - not public entity of module (ModUtilities.F90: 419)
0 inform,   0 warnings,   1 severes, 0 fatal for sleep

违规行如下所示:

use ModMpi, ONLY : MPI_wtime

(这里显然有很多 MPI 的东西,但我认为这不是重点。)所以我转到 ModMpi 的源代码,即 ModMpi.f90,我看不到任何参考MPI_WTIME,但我明白了:

use ModMpiInterfaces

所以最后,我去ModMpiInterface 的源代码,我找到了这条线:

public:: mpi_wtime

好的,我可以通过编辑 ModMpi.f90 并将 mpi_wtime 声明为公开来从 PGI 获得编译。但是,我仍然想知道:为什么 gfortran 假设(显然)mpi_wtime 是公开的,但 PGI 必须明确告知这一点?为什么 PGI 不假设原始公开声明在整个“使用链”中都成立?

我认为其中一种行为更接近 Fortran 标准。那会是哪个?

【问题讨论】:

    标签: fortran gfortran pgi


    【解决方案1】:

    对于完全相同的 Fortran 源代码(相对于某种 MPI 库)编译器的行为在这里应该是相同的。

    实体是否是模块的公共实体取决于定义或访问(通过 USE)该实体的每个模块。模块 A 可能声明“某物”并指定它是公共的,模块 B 可能使用模块 A 然后指定相同的“某物”然后是私有的。任何使用模块 A 的代码都可以访问“某物”,任何只使用模块 B 的代码都不能。

    模块中声明的事物的默认可访问性是 PUBLIC,但该默认值可以通过 PRIVATE 语句(没有任何后续标识符的语句)更改。如果出现这样的私有语句,您将看到您使用 PGI 编译器描述的行为。

    隐式输入(即从没有 IMPLICIT NONE 的源代码中)在这里也会造成混淆。

    【讨论】:

    • 仍然不明白行为差异,但这清除了一些事情。谢谢。这里有一个问题:不要认为我会在现实中这样做,但原则上假设我们采用您假设的模块 B,然后在模块 C 中使用它。然后在模块 C 中,我们再次公开“某事” .这行得通吗?我希望公共可以变成私有,但是一旦“链中”的某些东西是私有的,它就不能再公开了。感谢您的帮助。
    • 模块 C 将公开一个 不同 的东西 - 就像在模块 C 中(假设它没有直接使用模块 A)在模块 A 中声明的“某物”会无法访问。使用隐式类型仍然可以编译 - 问题只会出现在同时使用 A 和 C 并引用“某物”的其他代码中(编译器会发出有关使用名称冲突的错误)。
    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 2012-02-12
    • 2010-10-12
    • 1970-01-01
    • 2021-10-09
    • 2018-11-12
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多