mpi multiple init finalize

时间:2012-11-14 17:18:20

标签: mpi

假设我有充分的理由做以下事情(我想我有),如何让它有效?

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

这样做的原因:

我用Python包装C ++代码。一些包装类具有调用MPI_Init的构造函数和调用MPI_Finalize的析构函数。我希望能够在Python中自由创建,删除重新创建包装此C ++类的Python对象。最终目标是完全用Python创建一个Web服务,导入Python C ++ exstension一次,并根据用户请求执行一些Python代码。

编辑:我想我会重构C ++代码,使得在构造函数和析构函数中没有MPI_Init和MPI_Finalize的可能性,因此可以在Python脚本中完成一次(使用mpi4py)。

1 个答案:

答案 0 :(得分:4)

你基本上得到了正确的解决方案,所以我只是确认一下。事实上,多次调用MPI_InitMPI_Finalize是错误的,如果你有一个在创建/销毁时内部调用它们的实体,那么你只能实例化那个实体一次。如果要创建多个实例,则需要更改实体以执行以下操作之一:

  1. 提供一个选项,不要调用用户可以外部设置的Init和Finalize
  2. 使用MPI_InitializedMPI_Finalized来决定是否需要调用以上任何一种