为什么PGI没有在这个模块中获取公共属性?

时间:2012-11-28 17:26:35

标签: fortran gfortran pgi

在这里使用其他人的代码。它与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

好的,我能够通过编辑ModMpi.f90并声明mpi_wtime是公开的,从PGI获得编译。但是,我仍然想知道:为什么gfortran(显然)认为mpi_wtime是公开的,但PGI必须明确地告诉它?为什么PGI不假设原始公开声明贯穿“使用链”?

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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