假设我有充分的理由做以下(我想我有),如何让它有效?
#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;
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
--------------------------------------------------------------------------
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!
Run Code Online (Sandbox Code Playgroud)
这样做的原因:
我用Python包装C++代码.一些包装类具有调用MPI_Init的构造函数和调用MPI_Finalize的析构函数.我希望能够在Python中自由创建,删除重新创建包装此C++类的Python对象.最终目标是完全用Python创建一个Web服务,一次导入Python C++ exstension,并根据用户请求执行一些Python代码.
编辑:我想我会重构C++代码,以便在构造函数和析构函数中不提供MPI_Init和MPI_Finalize,因此可以在Python脚本中使用mpi4py完成一次(使用mpi4py).
你基本上得到了正确的解决方案,所以我会确认一下。多次调用MPI_Init和调用实际上是错误的MPI_Finalize,如果您有一个实体在创建/销毁时在内部调用它们,那么您只能实例化该实体一次。如果要创建多个实例,则需要更改实体以执行以下操作之一:
MPI_Initialized和MPI_Finalized来决定是否需要调用以上任何一个