5

次のことを行う正当な理由があると仮定すると(私は持っていると思います)、どのように機能させるのですか?

#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;
}

エラーが発生しました:

--------------------------------------------------------------------------
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!

そうする理由:

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

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

4

1 に答える 1

5

あなたは基本的に正しい解決策を持っているので、確認します。MPI_Initand を複数回呼び出すのは実際には誤りでMPI_Finalizeあり、作成/破棄時にこれらを内部的に呼び出すエンティティがある場合、そのエンティティをインスタンス化できるのは 1 回だけです。複数のインスタンスを作成する場合は、次のいずれかを実行するようにエンティティを変更する必要があります。

  1. ユーザーが外部から設定できる Init と Finalize を呼び出さないオプションを提供する
  2. MPI_Initializedとを使用しMPI_Finalizedて、上記のいずれかを呼び出す必要があるかどうかを決定します
于 2012-11-14T18:44:12.683 に答える