0

私のプログラムは次のとおりです:
モジュール x
使用 mpi !x が含ま れ てい
ます

subroutine do_something_with_mpicommworld  

    !use mpi !uncommenting this makes a difference (****)  
    call MPI_...(MPI_COMM_WORLD,...,ierr)  

end subroutine  

...
終了モジュール x

program main
use mpi use x
MPI_INIT(...)
call do_something_with_mpicommworld end program main

このプログラムは、次のエラーで失敗します: MPI_Cart_create(199): 無効なコミュニケーター。( * *) でマークされた行がコメント解除されていない限り。

さて、Fortran 90 に関する私の知識は不完全かもしれませんが、モジュール定義にuse句がある場合 (私のモジュール x を参照)、インクルードされたモジュールに存在するグローバル変数 (x の場合: インクルード モジュール mpi の MPI_COMM_WORLD) を考えました) は、含まれるサブルーチン ( do_something_with_mpicommworld ) のいずれにおいても、それらのサブルーチンがモジュールを明示的にインクルードしていない場合でも (たとえば、( * *) がコメント化されている場合)、同じ値になります。または、簡単に言えば、別のモジュール内にモジュールを含める場合、2 番目のモジュールに含まれるサブルーチンは、特別な使用ステートメントなしで、含まれるモジュールのグローバルにアクセスできます。

プログラムを実行すると、別の動作が見られました。x に含まれるサブルーチンは、'use mpi' ステートメントがない限り、エラーを作成していました。

Fortran 90 について間違った考えを持っているのでしょうか、それともそのような動作を誘発する MPI モジュールに何か特別なものがあるのでしょうか?

4

2 に答える 2

1

これらのケースで何が起こるべきで何が起こらないべきかについての正確な詳細を見つけるのは厄介なことに困難であり、私の期待はあなたのものと同じでした. だから私は次のことを試しました:

module hellompi
use mpi
implicit none
contains

subroutine hello
    integer :: ierr, nprocs, rank
    call MPI_INIT(ierr)
    call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
    call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
    print *, 'Hello world, from ', rank, ' of ', nprocs
    print *, MPI_COMM_WORLD
    call MPI_FINALIZE(ierr)
    return
end subroutine hello

end module hellompi

そして、OpenMPI を使用した gfortran と ifort の両方で正常に動作します。cart_create を追加しても何も変わりません。

あなたのケースで私が奇妙に感じるのは、 MPI_COMM_WORLD が定義されていないことを訴えていないということです。そのため、明らかに関連情報の一部がサブルーチンに伝播されています。まだ機能しない、より単純な完全な例を投稿できますか?

于 2010-10-19T16:06:34.000 に答える
-1

ジョナタン、答えてくれてありがとう。問題は本当に、本当に単純でした。「endmodule 」の後に問題のサブルーチンを追加しました
:-D、「implicit none」は現在外部サブに適用されず、コンパイラは標準の暗黙のルールに従って適切と思われるものに新しい変数MPI_COMM_WORLDを喜んで初期化しました。

これは、キーワードだけでなく、コンパイラフラグを介して「implicitnone」を強制するための単なる教訓です。すべての終了ステートメントの後に悪が潜んでいます。

テスト例を作るのに苦労してごめんなさい、できればビールを買います:-)

于 2010-10-19T18:14:48.273 に答える