mpi ट्यूटोरियल
एमपीआई के साथ शुरुआत करना
खोज…
टिप्पणियों
MPI वितरित (या स्थानीय) प्रक्रियाओं के समूह के बीच संचार के लिए एक मानक है। इसमें डेटा भेजने और प्राप्त करने के लिए दिनचर्या, सामूहिक रूप से संवाद और अन्य अधिक जटिल कार्य शामिल हैं।
मानक सी और फोरट्रान के लिए एक एपीआई प्रदान करता है, लेकिन विभिन्न अन्य भाषाओं में बाइंडिंग भी मौजूद हैं।
संस्करण
संस्करण | मानक | रिलीज़ की तारीख |
---|---|---|
1 | एमपीआई-रिपोर्ट-1.3-2008-05-30.pdf | 1994/05/05 |
2.0 | mpi2-report.pdf | 2003/09/15 |
2.2 | mpi22-report.pdf | 2009-09-04 |
3.0 | mpi30-report.pdf | 2012-09-21 |
3.1 | mpi31-report.pdf | 2015/06/04 |
रैंक और आकार
एक संचारक का आकार प्राप्त करने के लिए (जैसे MPI_COMM_WORLD
) और स्थानीय प्रक्रिया 'रैंक' के अंदर:
int rank, size;
int res;
MPI_Comm communicator = MPI_COMM_WORLD;
res = MPI_Comm_rank (communicator, &rank);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Comm_rank failed\n");
exit (0);
}
res = MPI_Comm_size (communicator, &size);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Comm_size failed\n");
exit (0);
}
Init / अंतिम रूप
किसी भी MPI कमांड को चलाने से पहले, पर्यावरण को प्रारंभिक रूप देने की आवश्यकता होती है, और अंत में अंतिम रूप दिया जाता है:
int main(int argc, char** argv)
{
int res;
res = MPI_Init(&argc,&argv);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Init failed\n");
exit (0);
}
...
res = MPI_Finalize();
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Finalize failed\n");
exit (0);
}
}
नमस्ते दुनिया!
एमपीआई का उपयोग करना सीखना शुरू करते समय तीन चीजें आमतौर पर महत्वपूर्ण होती हैं। सबसे पहले, आपको लाइब्रेरी को इनिशियलाइज़ करना होगा जब आप इसका उपयोग करने के लिए तैयार हों (जब आप काम कर लें तो आपको इसे अंतिम रूप देने की आवश्यकता भी हो)। दूसरा, आप अपने कम्युनिकेटर का आकार (वह चीज़ जो आप अन्य प्रक्रियाओं को संदेश भेजने के लिए उपयोग करते हैं) जानना चाहेंगे। तीसरा, आप उस कम्युनिकेटर के भीतर अपनी रैंक जानना चाहेंगे (उस कम्युनिकेटर के भीतर कौन सी प्रक्रिया संख्या है)।
#include <mpi.h>
#include <stdio.h>
int main(int argc, char **argv) {
int size, rank;
int res;
res = MPI_Init(&argc, &argv);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Init failed\n");
exit (0);
}
res = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Comm_size failed\n");
exit (0);
}
res = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Comm_rank failed\n");
exit (0);
}
fprintf(stdout, "Hello World from rank %d of %d~\n", rank, size);
res = MPI_Finalize();
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Finalize failed\n");
exit (0);
}
}
यदि आप इस कार्यक्रम को इस तरह चलाते हैं:
mpiexec -n 2 ./hello
आप इस तरह से उत्पादन प्राप्त करने की उम्मीद करेंगे:
Hello World from rank 0 of 2!
Hello World from rank 1 of 2!
इसके बारे में अधिक चर्चा के लिए आप उस आउटपुट को पिछड़ा हुआ भी देख सकते हैं ( http://stackoverflow.com/a/17571699/491687 देखें ):
Hello World from rank 1 of 2!
Hello World from rank 0 of 2!
MPI कॉल का मान लौटाएं
लगभग कोई भी MPI कॉल एक पूर्णांक त्रुटि कोड देता है, जो ऑपरेशन की सफलता को दर्शाता है। यदि कोई त्रुटि नहीं होती है, तो रिटर्न कोड MPI_SUCCESS
:
if (MPI_Some_op(...) != MPI_SUCCESS)
{
// Process error
}
यदि कोई त्रुटि होती है, तो MPI उपयोगकर्ता कोड पर लौटने से पहले संचारक, विंडो या फ़ाइल ऑब्जेक्ट से जुड़ा एक त्रुटि हैंडलर कहता है। दो पूर्वनिर्धारित त्रुटि हैंडलर हैं (उपयोगकर्ता अतिरिक्त त्रुटि हैंडलर को परिभाषित कर सकता है):
-
MPI_ERRORS_ARE_FATAL
- MPI प्रोग्राम की समाप्ति में त्रुटियों का परिणाम होता है -
MPI_ERRORS_RETURN
- त्रुटि कोड के परिणामस्वरूप उपयोगकर्ता को वापस किया जा रहा है
संचारकों और खिड़कियों के लिए डिफ़ॉल्ट त्रुटि हैंडलर MPI_ERRORS_ARE_FATAL
; फ़ाइल ऑब्जेक्ट के लिए यह MPI_ERRORS_RETURN
। MPI_COMM_WORLD
लिए त्रुटि हैंडलर उन सभी परिचालनों पर भी लागू होता है जो विशेष रूप से किसी ऑब्जेक्ट से संबंधित नहीं हैं (जैसे, MPI_Get_count
)। इस प्रकार, MPI_ERRORS_RETURN
को त्रुटि हैंडलर सेट किए बिना गैर-I / O संचालन के रिटर्न मूल्य की जांच करना अनावश्यक है क्योंकि गलत MPI कॉल वापस नहीं आएंगे।
// The execution will not reach past the following line in case of error
int res = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (res != MPI_SUCCESS)
{
// The following code will never get executed
fprintf(stderr, "MPI_Comm_size failed: %d\n", res);
exit(EXIT_FAILURE);
}
उपयोगकर्ता त्रुटि प्रसंस्करण को सक्षम करने के लिए, सबसे पहले MPI_COMM_WORLD
के त्रुटि हैंडलर को MPI_COMM_WORLD
:
MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
int res = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (res != MPI_SUCCESS)
{
fprintf(stderr, "MPI_Comm_size failed: %d\n", res);
exit(EXIT_FAILURE);
}
MPI मानक की आवश्यकता नहीं है कि MPI कार्यान्वयन त्रुटियों से उबरने और प्रोग्राम निष्पादन जारी रखने में सक्षम हो।