2012-11-14 8 views
5

私は次のことをする良い理由があると仮定します(私は持っていると思います)。私はC++コードの周りのPythonラッピングをしましたmpi複数initファイナライズ

-------------------------------------------------------------------------- 
Calling any MPI-function after calling MPI_Finalize is erroneous. 
The only exceptions are MPI_Initialized, MPI_Finalized and MPI_Get_version. 
-------------------------------------------------------------------------- 
*** An error occurred in MPI_Init 
*** after MPI was finalized 
*** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) 
[ange:13049] Abort after MPI_FINALIZE completed successfully; not able to guarantee  that all other processes were killed! 

それをする理由:

#include "mpi.h" 

int main(int argc, char *argv[]) 
{ 
    int myid, numprocs; 

    MPI_Init(&argc,&argv); 
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD,&myid); 
    // ... 
    MPI_Finalize(); 


    MPI_Init(&argc,&argv); 
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD,&myid); 
    // ... 
    MPI_Finalize(); 

    return 0; 
} 

私はエラーを得ました。いくつかのラップされたクラスには、MPI_Initを呼び出すコンストラクタと、MPI_Finalizeを呼び出すデストラクタがあります。 PythonでこのC++クラスをラップするPythonオブジェクトを自由に作成、削除して削除できるようにしたいと思います。最終的な目標は、Pythonで完全にWebサービスを作成し、Python C++エクスポンスを一度インポートし、ユーザーの要求に応じてPythonコードを実行することです。

EDIT:コンストラクタとデストラクタでMPI_InitとMPI_Finalizeを実行できないようにするために、C++コードをリファクタリングすると思いますので、Pythonスクリプト(mpi4pyを使用)で1回だけ実行できます。

答えて

4

あなたは基本的に正しい解決策を得ているので、私はただ確認します。実際にはMPI_InitMPI_Finalizeを複数回呼び出すのは間違いです。作成/破壊時にこれらを呼び出すエンティティがある場合は、そのエンティティを一度しかインスタンス化できません。

  1. オファーの初期化を呼び出し、ユーザーが使用MPI_Initialized外部
  2. を設定し、できることを確定しないオプション:あなたは複数のインスタンスを作成する場合は、次のいずれかを実行するエンティティを変更する必要がありますMPI_Finalized上記のいずれかを呼び出す必要があるかどうかを決定する