2012-11-14 16 views
5

मानते हैं कि मेरे पास निम्नलिखित करने का अच्छा कारण है (मुझे लगता है कि मेरे पास है), यह कैसे काम करता है?mpi एकाधिक init अंतिम

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

ऐसा करने के लिए कारण:

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

मैं त्रुटि मिली

मैं चारों ओर सी ++ कोड अजगर रैपिंग है। कुछ लिपटे वर्ग में कन्स्ट्रक्टर होता है जो MPI_Init को कॉल करता है, और विनाशक जो MPI_Finalize को कॉल करता है। मैं पाइथन को स्वतंत्र रूप से बनाने में सक्षम होना चाहता हूं, इस सी ++ कक्षा को लपेटने वाले पायथन ऑब्जेक्ट को दोबारा हटाएं। अंतिम लक्ष्य पाइथन में पूरी तरह से एक webservice बनाना है, जो एक बार पायथन सी ++ एक्सस्टेंशन आयात करता है, और उपयोगकर्ता अनुरोध के बाद कुछ पायथन कोड निष्पादित करता है।

संपादित करें: मुझे लगता है कि मैं MPI_Init और MPI_ को कन्स्ट्रक्टर और विनाशक में परिभाषित करने की संभावना देने के लिए सी ++ कोड को दोबारा प्रतिक्रिया दूंगा, इसलिए इसे पाइथन लिपि (mpi4py का उपयोग करके) में एक बार करना संभव है।

उत्तर

4

आपको मूल रूप से सही समाधान मिला है, इसलिए मैं बस पुष्टि करूंगा। वास्तव में MPI_Init और MPI_Finalize पर कई बार कॉल करना गलत है, और यदि आपके पास ऐसी इकाई है जो आंतरिक रूप से निर्माण/विनाश पर इन्हें कॉल करती है, तो आप केवल उस इकाई को तुरंत चालू कर सकते हैं। निम्नलिखित आप कई उदाहरण बनाना चाहते हैं, तो आप में से एक करने के लिए इकाई को बदलना होगा:

  1. ऑफर Init फोन और अंतिम रूप उपयोगकर्ता द्वारा बाह्य
  2. उपयोग MPI_Initialized सेट कर सकते हैं कि नहीं करने का विकल्प और MPI_Finalized यह तय करने के लिए कि क्या इसे उपर्युक्त
पर कॉल करने की आवश्यकता है या नहीं
संबंधित मुद्दे