0

ここで他の誰かのコードを操作します。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

OK、ModMpi.f90を編集しmpi_wtime、公開を宣言することで、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 に答える