0

在这里使用别人的代码。它用 gfortran 编译得很好。但是,在波特兰集团下,我收到一个错误:

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

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

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

4

1 回答 1

1

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

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

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

隐式输入(即来自没有 IMPLICIT NONE 的源代码)在这里也会混淆。

于 2012-11-29T00:28:39.590 回答