2012-11-14 24 views
5

Giả sử tôi có lý do chính đáng để thực hiện những điều sau (tôi nghĩ mình có), cách làm cho nó hoạt động?mpi nhiều init hoàn thành

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

Tôi đã nhận lỗi:

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

Lý do để làm điều đó:

Tôi đã Python gói xung quanh C++. Một số lớp bọc có hàm tạo gọi là MPI_Init và hàm hủy gọi là MPI_Finalize. Tôi muốn để có thể trong Python để tự do tạo, xóa tái tạo đối tượng Python bọc lớp C++ này. Mục tiêu cuối cùng là tạo một webservice hoàn toàn bằng Python, nhập khẩu Python C++ exstension một lần, và thực hiện một số mã Python cho yêu cầu của người dùng. EDIT: Tôi nghĩ rằng tôi sẽ refactor mã C++ để cung cấp cho khả năng không MPI_Init và MPI_Finalize trong constructor và destructor, do đó, nó có thể làm điều đó một cách chính xác một thời gian trong kịch bản Python (sử dụng mpi4py).

Trả lời

4

Về cơ bản bạn đã có giải pháp đúng, vì vậy tôi sẽ chỉ xác nhận. Thực tế là có sai lầm khi gọi MPI_InitMPI_Finalize nhiều lần và nếu bạn có một thực thể gọi nội bộ này về tạo/hủy, thì bạn chỉ có thể khởi tạo thực thể đó một lần. Nếu bạn muốn tạo nhiều trường hợp, bạn sẽ cần phải thay đổi pháp nhân để làm một trong các cách sau:

  1. Offer một tùy chọn để không gọi Init và Hoàn thiện mà người dùng có thể thiết lập từ bên ngoài
  2. Sử dụng MPI_InitializedMPI_Finalized để quyết định xem có cần phải gọi một trong các số trên
này không