0

更新: 問題がありますが、それが何かわかりません。本体に MPI_INIT と MPI_FINALIZE を含むテスト プログラムがあります。5 つのサブルーチンを含むモジュールがあります。3 つのサブルーチンは依存しており、他の 2 つのサブルーチンから独立しています。テストプログラムのMPIコードをこのモジュールに入れたいです。変数が宣言されているモジュールのサブルーチンの前に MPI_INIT を配置しました。同じエラー メッセージを含む一連のエラーが表示されます。

This statement must not appear in the specification part of a module

「MPI_INIT と MPI_FINALIZE は 1 回だけ呼び出す必要がある」は、Fortran プログラム、モジュール、およびサブルーチンにどのように影響しますか? 複数の独立したプログラムがあり、それぞれがこのモジュールのサブルーチンを複数回呼び出す場合、MPI 関数と変数をどこに置くべきですか?

~~~~~~~~~ 並列化したい do ループを含む一連のサブルーチンを含むモジュールがあります。サブルーチンは、他のプログラムが使用するパブリックです。サブルーチンの外で MPI を定義する必要があります:

module ...
call MPI_INIT
subroutine 1
... (MPI code)
subroutine 2
subroutine 3
MPI_GATHERV
call MPI_FINALIZE
module

または各サブルーチン内?

module ...
subroutine 1
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 2
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
subroutine 3
call MPI_INIT
... (MPI code)
MPI_GATHERV
call MPI_FINALIZE
module

解決策 1 で粗粒度の原則に従う利点があると思います。プログラムがサブルーチン 1 を呼び出す場合、サブルーチンの外でも MPI コードを実行しますか?

4

1 に答える 1

6

プログラムで MPI の初期化とファイナライズを 1 回だけ行う必要があります。MPI_Finalize を呼び出した後は、それ以上 MPI アクションを実行できません。標準は次のように述べています。

MPI_FINALIZE が戻ると、MPI_GET_VERSION、MPI_GET_LIBRARY_VERSION、MPI_INITIALIZED、MPI_FINALIZED、およびプレフィックス MPI_T_ を持つ関数 (セクション 14.3.4 にリストされているこのプレフィックスを持つ関数の制約内) を除いて、MPI ルーチン (MPI_INIT でさえも) を呼び出すことはできません。

(MPI3、p361、l25) MPI3 PDF

更新への返信: 実行可能ステートメントをコードの宣言部分に入れることは許可されていません。実行時に MPI_Init と MPI_Finalize を 1 回だけ呼び出す必要があるという点は、まさにそれを意味します。あなたのアプリケーションはそのようなものを読むことができます:

program mini
  use mpi
  implicit none
  integer :: iError
  call mpi_init(iError)
  call do_some_stuff()
  call mpi_finalize(iError)
end program mini

プログラムの最初に実行したいさまざまな初期化がある場合は、もちろんそれをモジュールサブルーチンで組み合わせて、そこで mpi_init を呼び出すことができます。モジュールのテスト プログラムを使用する場合は、そこで mpi_init と mpi_finalize を使用します。一部のサブルーチンでの mpi_init と mpi_finalize の呼び出しの例は、非常に一般的なものをセットアップするために使用するtreelm ライブラリの env_module などにあります。

複数の独立したプログラムがあり、それぞれがこのモジュールのサブルーチンを複数回呼び出す場合、MPI 関数と変数をどこに置くべきですか?

それを言い換えていただけますか?理解できません。MPI 関数と変数は mpi モジュールにあるはずです。それらを呼び出す独立したプログラムが複数ある場合、それらはすべて mpi モジュールを「使用」する必要があります。独立したプログラムは、MPI_Init と MPI_Finalize をそれぞれ単独で使用しても問題ありません。おそらく、短いコード例、達成したいこと、問題は何かを投稿できます。

于 2012-11-18T14:04:51.897 に答える