mpirun

2012-06-24 4 views
8

के बिना ओपनएमपीआई प्रोग्राम चलाना मैं gcc और OpenMPI का उपयोग कर रहा हूं। आम तौर पर मैं mpirun आवरण का उपयोग कर एमपीआई प्रोग्राम को चलाने के - उदाहरण के लिए,mpirun

mpirun -np 4 myprogram 

4 प्रक्रियाओं शुरू करने के लिए।

हालांकि, मैं सोच रहा था कि बाइनरी आसानी से उत्पन्न करना संभव है, जो स्वचालित रूप से ऐसा करेगा (शायद कुछ हार्डकोडेड विकल्पों जैसे -np 4 ऊपर)।

मैं जानता हूँ कि मैं एक सी आवरण कि इस तरह के निम्नलिखित के रूप में मेरे कार्यक्रम कहता है, लिख सकते हैं:

#include <stdlib.h> 
#include <unistd.h> 

int main() { 
     char *options[] = { "mpirun", "-np", "4", "myprogram" }; 

     execvp("mpirun", options); 
     /* Ignoring return value to keep example simple */ 

     return EXIT_SUCCESS; 
} 

लेकिन यह थोड़ा अनाड़ी लगता है और मैं एक की जगह दो निष्पादनयोग्य के साथ खत्म।

मैं स्पष्ट रूप से की तरह

gcc -o myprogram -I/usr/lib/openmpi/include/ \ 
    -lmpi -L/usr/lib/openmpi/lib/ myprogram.c 

लेकिन जब मैं निष्पादन योग्य जिसके परिणामस्वरूप चलाने के लिए, MPI_Comm_size सेट समूह आकार के रूप में शून्य (जैसे मैं -np 0 तर्क के रूप में दिया था), एमपीआई पुस्तकालयों जोड़ने की कोशिश की है। क्या मैं समूह के आकार को पार करने के लिए पर्यावरण चर या कुछ और उपयोग कर सकता हूं? या, एक एकल निष्पादन योग्य एमपीआई प्रोग्राम (लिनक्स और gcc का उपयोग करके) बनाने का कोई और तरीका है?

+0

यह किया जा सकता है, हालांकि मुझे नहीं पता कि मेरे सिर के शीर्ष से कैसे। मुझे पता है कि मैंने जो कुछ कार्यक्रम चलाए हैं, वे ऐसा करते हैं। वहां कोई असली जादू नहीं है, यह सिर्फ दृश्यों के पीछे सामान का एक गुच्छा करता है जिसे आप स्वयं भी कर सकते हैं। –

+0

क्या मैं सही ढंग से समझता हूं - आप 'mpirun' को छोड़ना चाहते हैं या आप किसी भी तरह से' mpirun' को स्वचालित रूप से कॉल करना चाहते हैं? –

+0

@ हिस्टो इलिव: अगर मेरे पास एक स्थिर बाइनरी थी तो यह अच्छा होगा। – Jay

उत्तर

6

अगर मैं इसे सही ढंग से मिलता है, आप एक आत्म शुरू करने एमपीआई निष्पादन चाहते हैं। जैसा कि मैंने अपनी टिप्पणी में लिखा है, आप एक विशेष विकल्प के साथ जा सकते हैं जो आपके कोड को mpirun निष्पादित करता है, उदाहरण के लिए। -launchmpi। ओपन एमपीआई के साथ यह आसान है क्योंकि यह एमपीआई प्रक्रियाओं को लॉन्च करने के लिए विशेष पर्यावरण चर निर्यात करता है, उदाहरण के लिए OMPI_COMM_WORLD_RANK। यदि यह चर वातावरण में मौजूद है, तो आप जानते हैं कि प्रोग्राम mpirun से लॉन्च किया गया था और सीधे नहीं।

int main (int argc, char **argv) 
{ 
    int perform_launch = 0; 
    // Scan argv[] for special option like "-launchmpi" 
    // and set perform_launch if found 

    if (perform_launch || getenv("OMPI_COMM_WORLD_RANK") == NULL) 
    { 
     // #args = argc + 3 ("mpirun -np 4" added) + NULL 
     // #args should be reduced by one if "-launchmpi" is present 
     char **args = (char **)calloc(
      argc + (perform_launch ? 3 : 4), 
      sizeof(char *)); 
     args[0] = "mpirun"; 
     args[1] = "-np"; 
     args[2] = "4"; 
     // Copy the entire argv to the rest of args but skip "-launchmpi" 

     execvp("mpirun", args); 

     return EXIT_SUCCESS; 
    } 

    // Proceed as regular MPI code 
    MPI_Init(&argc, &argv); 
    ... 
    // Magic happens here 
    ... 
    MPI_Finalize(); 

    return EXIT_SUCCESS; 
} 

आप एमपीआई काम में प्रक्रियाओं की संख्या को नियंत्रित करना चाहते हैं, तो आप इसे एक अतिरिक्त arugment के रूप में आपूर्ति कर सकते हैं, उदाहरण के लिए: आप एक ही चैक इस में दोनों तरीकों को जोड़ सकते हैं -launchmpi 12, या पर्यावरण चर में और उपरोक्त कोड में "4" के बजाय इसका मान उपयोग करें।

ध्यान दें कि एमपीआई निष्पादन योग्य आमतौर पर mpirun के बिना लॉन्च नहीं किया जा सकता है। उत्तरार्द्ध एमपीआई रन-टाइम का एक अभिन्न अंग है और यह बहुत कुछ करता है जो एमपीआई निष्पादन योग्य की कई प्रतियां लॉन्च करता है। एमपीईजी कंपाइलर रैपर के साथ संकलित करते समय आप हमेशा एमपीआई लाइब्रेरी को स्पष्ट रूप से लिंक कर रहे हैं (mpicc -showme आज़माएं)। यद्यपि आप एमपीआई पुस्तकालयों को स्थिर रूप से लिंक कर सकते हैं (अनुशंसित नहीं, here देखें), आपको अभी भी एमपीआई नौकरियों को चलाने में सक्षम होने के लिए mpirun की आवश्यकता होगी - AFAIK कम से कम ओपन एमपीआई में नहीं, आपके प्रोग्राम में mpirun कार्यक्षमता को एम्बेड करने का कोई तरीका नहीं है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद - यह वास्तव में उपयोगी है! – Jay

1

आप एक bash स्क्रिप्ट के साथ ऐसा कर सकते हैं:

 
# If you change this script has executable (chmod +x script_name) 
# and if you have the current path in the PATH variable (add export PATH=.:$PATH in your .bashrc) 
#Then, you can run this has: script_name program_args 

mpirun -np 4 your_executable_name "[email protected]" 
+1

आप लगभग निश्चित रूप से '$ @ "', '' * 'नहीं चाहते हैं, अन्यथा आप शब्दों को लिखने पर तर्कों को जोड़ देंगे। –

+0

धन्यवाद @ChrisDown मैंने अपना जवाब सही किया। – RSFalcon7

+1

आपके तर्क अभी भी उलझ जाएंगे। उद्धरण महत्वपूर्ण हैं। –