2012-11-14 7 views
5

Aşağıdakileri yapmak için iyi bir nedenim olduğunu varsayarsak (sanırım sahip olduğum), nasıl çalışır? Ben C++ kod etrafında Python sarma ettikmpi birden çok init sonlandır

:

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

bunu nedeni:

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

ben hata var. Bazı sarılmış sınıf, MPI_Init ve MPI_Finalize diye adlandırılan yıkıcı olarak adlandırılan kurucuya sahiptir. Python'u özgürce oluşturmak, bu C++ sınıfını saran Python nesnesini yeniden oluşturmak için silmek istiyorum. Nihai amaç, Python C++ exstension'ını bir kez içe aktaran ve kullanıcı isteği göz önüne alındığında bir Python kodu yürüten tamamen Python'da bir web hizmeti oluşturmaktır.

DÜZENLEME: Ben, MPI_Init ve MPI_Finalize yapıcı ve yok ediciye olanak vermek için C++ kodunu yeniden düzenleyeceğimi düşünüyorum, bu yüzden Python komut dosyasında (mpi4py kullanarak) tam olarak bir kez yapmak mümkündür.

cevap

4

Temel olarak doğru çözümü aldınız, bu yüzden onaylayacağım. Aslında, MPI_Init ve MPI_Finalize'u birden çok kez çağırmak yanlıştır ve bunları dahili olarak oluşturma/yok etme üzerine çağıran bir öğeniz varsa, yalnızca bu varlığı bir kereliğine gerçekleştirebilirsiniz. Eğer birden çok örneğini oluşturmak istiyorsanız, birini yapmanız varlık değiştirmeniz gerekir şunlardır:

  1. Teklif Init arayıp Kullanıcının harici
  2. Kullanım MPI_Initialized ayarlayabileceğini sonlandırın değil bir seçenek ve Yukarıdaki
'dan hangisine gerek olup olmadığına karar vermek için MPI_Finalized