मैसेज पासिंग इंटरफ़ेस: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{short description|Message-passing system for parallel computers}}
{{short description|Message-passing system for parallel computers}}
संदेश पासिंग इंटरफ़ेस (MPI) मानकीकृत और पोर्टेबल [[संदेश देना]] मानक है जिसे [[समानांतर कंप्यूटिंग]] [[कंप्यूटर आर्किटेक्चर]] पर कार्य करने के लिए डिज़ाइन किया गया है।<ref>{{Cite web |title=Message Passing Interface :: High Performance Computing |url=https://hpc.nmsu.edu/discovery/mpi/introduction/ |access-date=2022-08-06 |website=hpc.nmsu.edu}}</ref> MPI मानक [[सिंटैक्स (प्रोग्रामिंग भाषाएं)]] और [[पुस्तकालय दिनचर्या]] के शब्दार्थ को परिभाषित करता है जो C (प्रोग्रामिंग लैंग्वेज), C ++ और [[फोरट्रान]] में [[सॉफ्टवेयर पोर्टेबिलिटी]] मैसेज-पासिंग प्रोग्राम लिखने वाले उपयोगकर्ताओं की विस्तृत श्रृंखला के लिए उपयोगी है। कई [[खुला स्त्रोत]] एमपीआई [[प्रोग्रामिंग भाषा कार्यान्वयन]] हैं, जो समानांतर [[सॉफ्टवेयर उद्योग]] के विकास को बढ़ावा देते हैं, और पोर्टेबल और स्केलेबल बड़े पैमाने पर समानांतर अनुप्रयोगों के विकास को प्रोत्साहित करते हैं।
संदेश पासिंग इंटरफ़ेस (एमपीआई) मानकीकृत और पोर्टेबल [[संदेश देना]] मानक है जिसे [[समानांतर कंप्यूटिंग]] [[कंप्यूटर आर्किटेक्चर]] पर कार्य करने के लिए डिज़ाइन किया गया है।<ref>{{Cite web |title=Message Passing Interface :: High Performance Computing |url=https://hpc.nmsu.edu/discovery/mpi/introduction/ |access-date=2022-08-06 |website=hpc.nmsu.edu}}</ref> एमपीआई मानक [[सिंटैक्स (प्रोग्रामिंग भाषाएं)]] और [[पुस्तकालय दिनचर्या]] के शब्दार्थ को परिभाषित करता है जो C (प्रोग्रामिंग भाषा), C ++ और [[फोरट्रान]] में [[सॉफ्टवेयर पोर्टेबिलिटी]] मैसेज-पासिंग प्रोग्राम लिखने वाले उपयोगकर्ताओं की विस्तृत श्रृंखला के लिए उपयोगी है। कई [[खुला स्त्रोत]] एमपीआई [[प्रोग्रामिंग भाषा कार्यान्वयन]] हैं, जो समानांतर [[सॉफ्टवेयर उद्योग]] के विकास को बढ़ावा देते हैं, और पोर्टेबल और स्केलेबल बड़े पैमाने पर समानांतर अनुप्रयोगों के विकास को प्रोत्साहित करते हैं।


== इतिहास ==
== इतिहास ==
सन्देश देने का प्रयास 1991 की गर्मियों में शुरू हुआ जब शोधकर्ताओं के छोटे समूह ने ऑस्ट्रिया में पर्वत वापसी पर चर्चा शुरू की। उस चर्चा से विलियम्सबर्ग, वर्जीनिया में 29-30 अप्रैल, 1992 को आयोजित वितरित स्मृति पर्यावरण में संदेश पारित करने के मानकों पर कार्यशाला आई।<ref>{{cite report |id= ORNL/TM-12147 |osti= 10170156 |author= Walker DW |date= August 1992 |title= Standards for message-passing in a distributed memory environment |url= https://technicalreports.ornl.gov/1992/3445603661204.pdf |institution= Oak Ridge National Lab., TN (United States), Center for Research on Parallel Computing (CRPC) |pages= 25 |access-date= 2019-08-18 }}</ref> विलियम्सबर्ग में उपस्थित लोगों ने मानक संदेश देने वाले इंटरफ़ेस के लिए आवश्यक बुनियादी सुविधाओं पर चर्चा की और मानकीकरण प्रक्रिया को जारी रखने के लिए कार्यदल की स्थापना की। [[जैक डोंगरा]], [[टोनी हे]], और डेविड डब्ल्यू वॉकर ने नवंबर 1992 में प्रारंभिक मसौदा प्रस्ताव, MPI1 पेश किया। नवंबर 1992 में MPI कार्यकारी समूह की बैठक मिनियापोलिस में हुई और मानकीकरण प्रक्रिया को अधिक औपचारिक स्तर पर रखने का निर्णय लिया गया। 1993 के पहले 9 महीनों में हर 6 सप्ताह में MPI कार्यकारी समूह की बैठक हुई। MPI मानक का मसौदा नवंबर 1993 में सुपरकंप्यूटिंग '93 सम्मेलन में प्रस्तुत किया गया था।<ref>{{cite conference |title= MPI: A Message Passing Interface |author= The MPI Forum, CORPORATE |date= November 15–19, 1993 |conference= Supercomputing '93 |conference-url= http://supercomputing.org/ |book-title= Proceedings of the 1993 ACM/IEEE conference on Supercomputing |publisher= ACM |location= Portland, Oregon, USA |pages= 878–883 |isbn= 0-8186-4340-4 |doi= 10.1145/169627.169855 }}</ref> सार्वजनिक टिप्पणियों की अवधि के बाद, जिसके परिणामस्वरूप MPI में कुछ बदलाव हुए, MPI का संस्करण 1.0 जून 1994 में जारी किया गया। इन बैठकों और ईमेल चर्चा ने मिलकर MPI फोरम का गठन किया, जिसकी सदस्यता उच्च के सभी सदस्यों के लिए खुली है- प्रदर्शन कंप्यूटिंग | उच्च-प्रदर्शन-कंप्यूटिंग समुदाय।
सन्देश देने का प्रयास 1991 की गर्मियों में प्रारंभ हुआ जब शोधकर्ताओं के छोटे समूह ने ऑस्ट्रिया में पर्वत वापसी पर चर्चा प्रारंभ की। उस चर्चा से विलियम्सबर्ग, वर्जीनिया में 29-30 अप्रैल, 1992 को आयोजित वितरित स्मृति पर्यावरण में संदेश पारित करने के मानकों पर कार्यशाला आई।<ref>{{cite report |id= ORNL/TM-12147 |osti= 10170156 |author= Walker DW |date= August 1992 |title= Standards for message-passing in a distributed memory environment |url= https://technicalreports.ornl.gov/1992/3445603661204.pdf |institution= Oak Ridge National Lab., TN (United States), Center for Research on Parallel Computing (CRPC) |pages= 25 |access-date= 2019-08-18 }}</ref> विलियम्सबर्ग में उपस्थित लोगों ने मानक संदेश देने वाले इंटरफ़ेस के लिए आवश्यक बुनियादी सुविधाओं पर चर्चा की और मानकीकरण प्रक्रिया को जारी रखने के लिए कार्यदल की स्थापना की। [[जैक डोंगरा]], [[टोनी हे]], और डेविड डब्ल्यू वॉकर ने नवंबर 1992 में प्रारंभिक मसौदा प्रस्ताव, एमपीआई1 प्रस्तुत किया। नवंबर 1992 में एमपीआई कार्यकारी समूह की बैठक मिनियापोलिस में हुई और मानकीकरण प्रक्रिया को अधिक औपचारिक स्तर पर रखने का निर्णय लिया गया। 1993 के पहले 9 महीनों में हर 6 सप्ताह में एमपीआई कार्यकारी समूह की बैठक हुई। एमपीआई मानक का मसौदा नवंबर 1993 में सुपरकंप्यूटिंग '93 सम्मेलन में प्रस्तुत किया गया था।<ref>{{cite conference |title= MPI: A Message Passing Interface |author= The MPI Forum, CORPORATE |date= November 15–19, 1993 |conference= Supercomputing '93 |conference-url= http://supercomputing.org/ |book-title= Proceedings of the 1993 ACM/IEEE conference on Supercomputing |publisher= ACM |location= Portland, Oregon, USA |pages= 878–883 |isbn= 0-8186-4340-4 |doi= 10.1145/169627.169855 }}</ref> सार्वजनिक टिप्पणियों की अवधि के बाद, जिसके परिणामस्वरूप एमपीआई में कुछ बदलाव हुए, एमपीआई का संस्करण 1.0 जून 1994 में जारी किया गया। इन बैठकों और ईमेल चर्चा ने मिलकर एमपीआई फोरम का गठन किया, जिसकी सदस्यता उच्च के सभी सदस्यों के लिए खुली है- प्रदर्शन कंप्यूटिंग | उच्च-प्रदर्शन-कंप्यूटिंग समुदाय।


MPI प्रयास में 40 संगठनों के लगभग 80 लोग शामिल थे, मुख्य रूप से संयुक्त राज्य अमेरिका और यूरोप में। विश्वविद्यालयों, सरकारी प्रयोगशालाओं और [[निजी उद्योग]] के शोधकर्ताओं के सहयोग से समवर्ती कंप्यूटरों के अधिकांश प्रमुख विक्रेता एमपीआई प्रयास में शामिल थे।
एमपीआई प्रयास में 40 संगठनों के लगभग 80 लोग सम्मिलित थे, मुख्य रूप से संयुक्त राज्य अमेरिका और यूरोप में। विश्वविद्यालयों, सरकारी प्रयोगशालाओं और [[निजी उद्योग]] के शोधकर्ताओं के सहयोग से समवर्ती कंप्यूटरों के अधिकांश प्रमुख विक्रेता एमपीआई प्रयास में सम्मिलित थे।


एमपीआई समानांतर हार्डवेयर विक्रेताओं को दिनचर्या के स्पष्ट रूप से परिभाषित आधार सेट प्रदान करता है जिसे कुशलतापूर्वक कार्यान्वित किया जा सकता है। नतीजतन, हार्डवेयर विक्रेता मानक [[निम्न-स्तरीय प्रोग्रामिंग भाषा]] के इस संग्रह पर निर्माण कर सकते हैं। उच्च-स्तरीय प्रोग्रामिंग भाषा बनाने के लिए निम्न-स्तरीय रूटीन। उनकी [[समानांतर मशीन]] के साथ वितरित-मेमोरी संचार वातावरण के लिए उच्च-स्तरीय रूटीन। एमपीआई मूल उपयोगकर्ता के लिए उपयोग में आसान पोर्टेबल इंटरफ़ेस प्रदान करता है, फिर भी प्रोग्रामर को उन्नत मशीनों पर उपलब्ध उच्च-प्रदर्शन संदेश पासिंग ऑपरेशंस का उपयोग करने की अनुमति देने के लिए पर्याप्त शक्तिशाली है।
एमपीआई समानांतर हार्डवेयर विक्रेताओं को दिनचर्या के स्पष्ट रूप से परिभाषित आधार सेट प्रदान करता है जिसे कुशलतापूर्वक कार्यान्वित किया जा सकता है। परिणामस्वरुप, हार्डवेयर विक्रेता मानक [[निम्न-स्तरीय प्रोग्रामिंग भाषा]] के इस संग्रह पर निर्माण कर सकते हैं। उच्च-स्तरीय प्रोग्रामिंग भाषा बनाने के लिए निम्न-स्तरीय रूटीन। उनकी [[समानांतर मशीन]] के साथ वितरित-मेमोरी संचार वातावरण के लिए उच्च-स्तरीय रूटीन। एमपीआई मूल उपयोगकर्ता के लिए उपयोग में आसान पोर्टेबल इंटरफ़ेस प्रदान करता है, फिर भी प्रोग्रामर को उन्नत मशीनों पर उपलब्ध उच्च-प्रदर्शन संदेश पासिंग ऑपरेशंस का उपयोग करने की अनुमति देने के लिए पर्याप्त शक्तिशाली है।


संदेश भेजने के लिए सार्वभौमिक मानक बनाने के प्रयास में, शोधकर्ताओं ने इसे प्रणाली के आधार पर नहीं बनाया बल्कि इसमें कई प्रणालियों की सबसे उपयोगी विशेषताओं को शामिल किया, जिनमें IBM, [[Intel]], [[nCUBE]], PVM, Express, P4 और PARMACS द्वारा डिज़ाइन किए गए शामिल हैं। . व्यापक पोर्टेबिलिटी के कारण संदेश-पासिंग प्रतिमान आकर्षक है और वितरित-मेमोरी और साझा-मेमोरी मल्टीप्रोसेसर, वर्कस्टेशन के नेटवर्क और इन तत्वों के संयोजन के लिए संचार में उपयोग किया जा सकता है। प्रतिमान कई सेटिंग्स में लागू हो सकता है, नेटवर्क गति या मेमोरी आर्किटेक्चर से स्वतंत्र।
संदेश भेजने के लिए सार्वभौमिक मानक बनाने के प्रयास में, शोधकर्ताओं ने इसे प्रणाली के आधार पर नहीं बनाया किंतु इसमें कई प्रणालियों की सबसे उपयोगी विशेषताओं को सम्मिलित किया, जिनमें IBM, [[Intel]], [[nCUBE]], पीवीएम, Express, P4 और PARMACS द्वारा डिज़ाइन किए गए सम्मिलित हैं। . व्यापक पोर्टेबिलिटी के कारण संदेश-पासिंग प्रतिमान आकर्षक है और वितरित-मेमोरी और साझा-मेमोरी बहुप्रोसेसर, वर्कस्टेशन के नेटवर्क और इन तत्वों के संयोजन के लिए संचार में उपयोग किया जा सकता है। प्रतिमान कई सेटिंग्स में प्रयुक्त हो सकता है, नेटवर्क गति या मेमोरी आर्किटेक्चर से स्वतंत्र।


MPI बैठकों के लिए समर्थन आंशिक रूप से [[DARPA]] और यूएस [[राष्ट्रीय विज्ञान संस्था]] (NSF) से अनुदान ASC-9310330, NSF विज्ञान और प्रौद्योगिकी केंद्र सहकारी समझौते संख्या CCR-8809615, और [[यूरोपीय आयोग]] से Esprit Project P6643 के माध्यम से आया। [[टेनेसी विश्वविद्यालय]] ने भी एमपीआई फोरम में वित्तीय योगदान दिया।
एमपीआई बैठकों के लिए समर्थन आंशिक रूप से [[DARPA]] और यूएस [[राष्ट्रीय विज्ञान संस्था]] (NSF) से अनुदान ASC-9310330, NSF विज्ञान और प्रौद्योगिकी केंद्र सहकारी समझौते संख्या CCR-8809615, और [[यूरोपीय आयोग]] से Esprit Project P6643 के माध्यम से आया। [[टेनेसी विश्वविद्यालय]] ने भी एमपीआई फोरम में वित्तीय योगदान दिया।


== सिंहावलोकन ==
== सिंहावलोकन ==
MPI प्रोग्रामिंग के लिए [[संचार प्रोटोकॉल]] है<ref>{{cite book |first=Frank |last=Nielsen | title=Introduction to HPC with MPI for Data Science |  year=2016 | publisher=Springer |isbn=978-3-319-21903-5 |pages=195–211
एमपीआई प्रोग्रामिंग के लिए [[संचार प्रोटोकॉल]] है<ref>{{cite book |first=Frank |last=Nielsen | title=Introduction to HPC with MPI for Data Science |  year=2016 | publisher=Springer |isbn=978-3-319-21903-5 |pages=195–211
|chapter=2. Introduction to MPI: The MessagePassing Interface | url=https://franknielsen.github.io/HPC4DS/index.html  
|chapter=2. Introduction to MPI: The MessagePassing Interface | url=https://franknielsen.github.io/HPC4DS/index.html  
|chapter-url=https://www.researchgate.net/publication/314626214_Introduction_to_MPI_The_Message_Passing_Interface }}</ref> [[समानांतर कंप्यूटर]]। पॉइंट-टू-पॉइंट और सामूहिक संचार दोनों समर्थित हैं। एमपीआई संदेश-पासिंग एप्लिकेशन प्रोग्रामर इंटरफ़ेस है, साथ में प्रोटोकॉल और सिमेंटिक विनिर्देशों के साथ किसी कार्यान्वयन में इसकी विशेषताओं को कैसे व्यवहार करना चाहिए।<ref>{{harvnb |Gropp |Lusk |Skjellum |1996 |p=3 }}</ref> एमपीआई के लक्ष्य उच्च प्रदर्शन, मापनीयता और सुवाह्यता हैं। MPI आज भी उच्च-प्रदर्शन कंप्यूटिंग में उपयोग किया जाने वाला प्रमुख मॉडल बना हुआ है।<ref>{{cite book|title=High-performance and Scalable MPI over InfiniBand with Reduced Memory Usage: An In-depth Performance Analysis|pages = 105|first1=Sayantan|last1=Sur|first2=Matthew J.|last2=Koop|first3=Dhabaleswar K.|last3=Panda|date=4 August 2017|publisher=ACM|doi=10.1145/1188455.1188565|chapter = MPI and communication---High-performance and scalable MPI over Infini ''Band'' with reduced memory usage|isbn = 978-0769527000|s2cid = 818662}}</ref>
|chapter-url=https://www.researchgate.net/publication/314626214_Introduction_to_MPI_The_Message_Passing_Interface }}</ref> [[समानांतर कंप्यूटर]]। पॉइंट-टू-पॉइंट और सामूहिक संचार दोनों समर्थित हैं। एमपीआई संदेश-पासिंग अनुप्रयोग प्रोग्रामर इंटरफ़ेस है, साथ में प्रोटोकॉल और सिमेंटिक विनिर्देशों के साथ किसी कार्यान्वयन में इसकी विशेषताओं को कैसे व्यवहार करना चाहिए।<ref>{{harvnb |Gropp |Lusk |Skjellum |1996 |p=3 }}</ref> एमपीआई के लक्ष्य उच्च प्रदर्शन, मापनीयता और सुवाह्यता हैं। एमपीआई आज भी उच्च-प्रदर्शन कंप्यूटिंग में उपयोग किया जाने वाला प्रमुख मॉडल बना हुआ है।<ref>{{cite book|title=High-performance and Scalable MPI over InfiniBand with Reduced Memory Usage: An In-depth Performance Analysis|pages = 105|first1=Sayantan|last1=Sur|first2=Matthew J.|last2=Koop|first3=Dhabaleswar K.|last3=Panda|date=4 August 2017|publisher=ACM|doi=10.1145/1188455.1188565|chapter = MPI and communication---High-performance and scalable MPI over Infini ''Band'' with reduced memory usage|isbn = 978-0769527000|s2cid = 818662}}</ref>
MPI को किसी भी प्रमुख मानक निकाय द्वारा स्वीकृत नहीं किया गया है; फिर भी, यह उन प्रक्रियाओं के बीच [[संचार]] के लिए वास्तविक मानक बन गया है जो वितरित मेमोरी सिस्टम पर चल रहे [[समानांतर प्रोग्रामिंग]] को मॉडल करते हैं। वास्तविक वितरित मेमोरी सुपरकंप्यूटर जैसे कंप्यूटर क्लस्टर अक्सर ऐसे प्रोग्राम चलाते हैं।
एमपीआई को किसी भी प्रमुख मानक निकाय द्वारा स्वीकृत नहीं किया गया है; फिर भी, यह उन प्रक्रियाओं के बीच [[संचार]] के लिए वास्तविक मानक बन गया है जो वितरित मेमोरी प्रणाली पर चल रहे [[समानांतर प्रोग्रामिंग]] को मॉडल करते हैं। वास्तविक वितरित मेमोरी सुपरकंप्यूटर जैसे कंप्यूटर क्लस्टर अधिकांशतः ऐसे प्रोग्राम चलाते हैं।


प्रमुख MPI-1 मॉडल में कोई साझा मेमोरी अवधारणा नहीं है, और MPI-2 में केवल सीमित वितरित साझा मेमोरी अवधारणा है। फिर भी, MPI प्रोग्राम नियमित रूप से साझा मेमोरी कंप्यूटर पर चलाए जाते हैं, और [[MPICH]] और [[Open MPI]] दोनों उपलब्ध होने पर संदेश हस्तांतरण के लिए साझा मेमोरी का उपयोग कर सकते हैं।<ref>[http://knem.gforge.inria.fr/ KNEM: High-Performance Intra-Node MPI Communication] "MPICH2 (since release 1.1.1) uses KNEM in the DMA LMT to improve large message performance within a single node. Open MPI also includes KNEM support in its SM BTL component since release 1.5. Additionally, NetPIPE includes a KNEM backend since version 3.7.2."</ref><ref>{{cite web|url=https://www.open-mpi.org/faq/?category=sm|title=FAQ: Tuning the run-time characteristics of MPI sm communications|website=www.open-mpi.org}}</ref> एमपीआई मॉडल के आसपास डिजाइनिंग कार्यक्रम (स्पष्ट [[साझा मेमोरी (इंटरप्रोसेस संचार)]] मॉडल के विपरीत) [[गैर-वर्दी मेमोरी एक्सेस]] आर्किटेक्चर पर चलते समय लाभ होता है क्योंकि एमपीआई संदर्भ के स्थानीयता को प्रोत्साहित करता है। MPI-3 में स्पष्ट साझा मेमोरी प्रोग्रामिंग पेश की गई थी।<ref>https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?language=en "The MPI-3 standard introduces another approach to hybrid programming that uses the new MPI Shared Memory (SHM) model"</ref><ref>[http://insidehpc.com/2016/01/shared-memory-mpi-3-0/ Shared Memory and MPI 3.0] "Various benchmarks can be run to determine which method is best for a particular application, whether using MPI + OpenMP or the MPI SHM extensions.  On a fairly simple test case,  speedups over a base version that used point to point communication were up to 5X, depending on the message."</ref><ref>[http://www.caam.rice.edu/~mk51/presentations/SIAMPP2016_4.pdf Using MPI-3 Shared Memory As a Multicore Programming System] (PDF presentation slides)</ref>
प्रमुख एमपीआई-1 मॉडल में कोई साझा मेमोरी अवधारणा नहीं है, और एमपीआई-2 में केवल सीमित वितरित साझा मेमोरी अवधारणा है। फिर भी, एमपीआई प्रोग्राम नियमित रूप से साझा मेमोरी कंप्यूटर पर चलाए जाते हैं, और [[MPICH|एमपीआईसीएच]] और [[Open MPI|Open एमपीआई]] दोनों उपलब्ध होने पर संदेश हस्तांतरण के लिए साझा मेमोरी का उपयोग कर सकते हैं।<ref>[http://knem.gforge.inria.fr/ KNEM: High-Performance Intra-Node MPI Communication] "MPICH2 (since release 1.1.1) uses KNEM in the DMA LMT to improve large message performance within a single node. Open MPI also includes KNEM support in its SM BTL component since release 1.5. Additionally, NetPIPE includes a KNEM backend since version 3.7.2."</ref><ref>{{cite web|url=https://www.open-mpi.org/faq/?category=sm|title=FAQ: Tuning the run-time characteristics of MPI sm communications|website=www.open-mpi.org}}</ref> एमपीआई मॉडल के आसपास डिजाइनिंग कार्यक्रम (स्पष्ट [[साझा मेमोरी (इंटरप्रोसेस संचार)]] मॉडल के विपरीत) [[गैर-वर्दी मेमोरी एक्सेस]] आर्किटेक्चर पर चलते समय लाभ होता है क्योंकि एमपीआई संदर्भ के स्थानीयता को प्रोत्साहित करता है। एमपीआई-3 में स्पष्ट साझा मेमोरी प्रोग्रामिंग प्रस्तुत की गई थी।<ref>https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?language=en "The MPI-3 standard introduces another approach to hybrid programming that uses the new MPI Shared Memory (SHM) model"</ref><ref>[http://insidehpc.com/2016/01/shared-memory-mpi-3-0/ Shared Memory and MPI 3.0] "Various benchmarks can be run to determine which method is best for a particular application, whether using MPI + OpenMP or the MPI SHM extensions.  On a fairly simple test case,  speedups over a base version that used point to point communication were up to 5X, depending on the message."</ref><ref>[http://www.caam.rice.edu/~mk51/presentations/SIAMPP2016_4.pdf Using MPI-3 Shared Memory As a Multicore Programming System] (PDF presentation slides)</ref>
हालाँकि MPI OSI संदर्भ मॉडल की 5 और उच्चतर परतों से संबंधित है, कार्यान्वयन में अधिकांश परतें शामिल हो सकती हैं, जिसमें [[इंटरनेट सॉकेट]] और [[प्रसारण नियंत्रण प्रोटोकॉल]] (TCP) का उपयोग ट्रांसपोर्ट लेयर में किया जाता है।
चूँकि एमपीआई OSI संदर्भ मॉडल की 5 और उच्चतर परतों से संबंधित है, कार्यान्वयन में अधिकांश परतें सम्मिलित हो सकती हैं, जिसमें [[इंटरनेट सॉकेट]] और [[प्रसारण नियंत्रण प्रोटोकॉल]] (TCP) का उपयोग ट्रांसपोर्ट लेयर में किया जाता है।


अधिकांश एमपीआई कार्यान्वयन में सी (प्रोग्रामिंग भाषा), सी ++, फोरट्रान (यानी, एपीआई) से सीधे कॉल करने योग्य दिनचर्या का विशिष्ट सेट होता है और सी शार्प (प्रोग्रामिंग भाषा) सहित ऐसी पुस्तकालयों के साथ इंटरफेस करने में सक्षम कोई भी भाषा शामिल है। सी#, [[जावा (प्रोग्रामिंग भाषा)]] भाषा) या [[पायथन (प्रोग्रामिंग भाषा)]]। पुराने संदेश पासिंग पुस्तकालयों पर एमपीआई के फायदे पोर्टेबिलिटी हैं (क्योंकि एमपीआई लगभग हर वितरित मेमोरी आर्किटेक्चर के लिए कार्यान्वित किया गया है) और गति (क्योंकि प्रत्येक कार्यान्वयन हार्डवेयर के लिए सिद्धांत रूप से अनुकूलित है जिस पर यह चलता है)।
अधिकांश एमपीआई कार्यान्वयन में सी (प्रोग्रामिंग भाषा), सी ++, फोरट्रान (अर्थात, एपीआई) से सीधे कॉल करने योग्य दिनचर्या का विशिष्ट सेट होता है और सी शार्प (प्रोग्रामिंग भाषा) सहित ऐसी पुस्तकालयों के साथ इंटरफेस करने में सक्षम कोई भी भाषा सम्मिलित है। सी#, [[जावा (प्रोग्रामिंग भाषा)]] भाषा) या [[पायथन (प्रोग्रामिंग भाषा)]]। पुराने संदेश पासिंग पुस्तकालयों पर एमपीआई के लाभ पोर्टेबिलिटी हैं (क्योंकि एमपीआई लगभग हर वितरित मेमोरी आर्किटेक्चर के लिए कार्यान्वित किया गया है) और गति (क्योंकि प्रत्येक कार्यान्वयन हार्डवेयर के लिए सिद्धांत रूप से अनुकूलित है जिस पर यह चलता है)।


एमपीआई कॉल और भाषा बाइंडिंग के लिए [[भाषा स्वतंत्र विशिष्टता]] (एलआईएस) का उपयोग करता है। पहले MPI मानक ने [[ANSI C]] और फोरट्रान-77 बाइंडिंग को LIS के साथ निर्दिष्ट किया। मसौदा सुपरकंप्यूटिंग 1994 (नवंबर 1994) में प्रस्तुत किया गया था<ref name="SC94">[http://hpc.sagepub.com/content/8/3-4.toc Table of Contents — September 1994, 8 (3-4)]. Hpc.sagepub.com. Retrieved on 2014-03-24.</ref> और उसके तुरंत बाद अंतिम रूप दिया। लगभग 128 कार्य MPI-1.3 मानक का गठन करते हैं जो 2008 में MPI-1 श्रृंखला के अंतिम अंत के रूप में जारी किया गया था।<ref name="MPI_Docs">[http://www.mpi-forum.org/docs/MPI दस्तावेज़]। एमपीआई-forum.org। 2014-03-24 को पुनःप्राप्त।</ref>
एमपीआई कॉल और भाषा बाइंडिंग के लिए [[भाषा स्वतंत्र विशिष्टता]] (एलआईएस) का उपयोग करता है। पहले एमपीआई मानक ने [[ANSI C]] और फोरट्रान-77 बाइंडिंग को LIS के साथ निर्दिष्ट किया। मसौदा सुपरकंप्यूटिंग 1994 (नवंबर 1994) में प्रस्तुत किया गया था<ref name="SC94">[http://hpc.sagepub.com/content/8/3-4.toc Table of Contents — September 1994, 8 (3-4)]. Hpc.sagepub.com. Retrieved on 2014-03-24.</ref> और उसके तुरंत बाद अंतिम रूप दिया। लगभग 128 कार्य एमपीआई-1.3 मानक का गठन करते हैं जो 2008 में एमपीआई-1 श्रृंखला के अंतिम अंत के रूप में जारी किया गया था।<ref name="MPI_Docs">[http://www.mpi-forum.org/docs/MPI दस्तावेज़]। एमपीआई-forum.org। 2014-03-24 को पुनःप्राप्त।</ref>


वर्तमान में, मानक के कई संस्करण हैं: संस्करण 1.3 (आमतौर पर संक्षिप्त MPI-1), जो संदेश पारित करने पर जोर देता है और स्थिर रनटाइम वातावरण, MPI-2.2 (MPI-2) है, जिसमें समानांतर I/O जैसी नई सुविधाएँ शामिल हैं, गतिशील प्रक्रिया प्रबंधन और दूरस्थ स्मृति संचालन,<ref name="Gropp99adv-pp4-5">{{harvnb|Gropp|Lusk|Skjellum|1999b|pp=4–5}}</ref> और MPI-3.1 (MPI-3), जिसमें गैर-अवरुद्ध संस्करणों के साथ सामूहिक संचालन के विस्तार और एकतरफा संचालन के विस्तार शामिल हैं।<ref name="MPI_3.1">[http://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf MPI: एक संदेश-पासिंग इंटरफ़ेस मानक<br/>संस्करण 3.1, संदेश पासिंग इंटरफ़ेस फ़ोरम, 4 जून, 2015]। http://www.mpi-forum.org. 2015-06-16 को पुनःप्राप्त।</ref>
वर्तमान में, मानक के कई संस्करण हैं: संस्करण 1.3 (सामान्यतः संक्षिप्त एमपीआई-1), जो संदेश पारित करने पर जोर देता है और स्थिर रनटाइम वातावरण, एमपीआई-2.2 (एमपीआई-2) है, जिसमें समानांतर आई/जैसी नई सुविधाएँ सम्मिलित हैं, गतिशील प्रक्रिया प्रबंधन और दूरस्थ स्मृति संचालन,<ref name="Gropp99adv-pp4-5">{{harvnb|Gropp|Lusk|Skjellum|1999b|pp=4–5}}</ref> और एमपीआई-3.1 (एमपीआई-3), जिसमें गैर-अवरुद्ध संस्करणों के साथ सामूहिक संचालन के विस्तार और एकतरफा संचालन के विस्तार सम्मिलित हैं।<ref name="MPI_3.1">[http://www.mpi-forum.org/docs/mpi-3.1/mpi31-report.pdf MPI: एक संदेश-पासिंग इंटरफ़ेस मानक<br/>संस्करण 3.1, संदेश पासिंग इंटरफ़ेस फ़ोरम, 4 जून, 2015]। http://www.mpi-forum.org. 2015-06-16 को पुनःप्राप्त।</ref>
MPI-2 का LIS 500 से अधिक कार्यों को निर्दिष्ट करता है और ISO C (प्रोग्रामिंग लैंग्वेज), ISO C++, और [[फोरट्रान 90]] के लिए लैंग्वेज बाइंडिंग प्रदान करता है। आसान मिश्रित-भाषा संदेश पासिंग प्रोग्रामिंग की अनुमति देने के लिए ऑब्जेक्ट इंटरऑपरेबिलिटी भी जोड़ी गई थी। MPI-2 के मानकीकरण का दुष्परिणाम, जो 1996 में पूरा हुआ, MPI-1 मानक को स्पष्ट कर रहा था, जिससे MPI-1.2 का निर्माण हुआ।


MPI-2 ज्यादातर MPI-1 का सुपरसेट है, हालांकि कुछ कार्यों को हटा दिया गया है। MPI-1.3 प्रोग्राम अभी भी MPI-2 मानक के अनुरूप MPI कार्यान्वयन के तहत काम करते हैं।
एमपीआई-2 का LIS 500 से अधिक कार्यों को निर्दिष्ट करता है और ISO C (प्रोग्रामिंग भाषा), ISO C++, और [[फोरट्रान 90]] के लिए भाषा बाइंडिंग प्रदान करता है। आसान मिश्रित-भाषा संदेश पासिंग प्रोग्रामिंग की अनुमति देने के लिए ऑब्जेक्ट इंटरऑपरेबिलिटी भी जोड़ी गई थी। एमपीआई-2 के मानकीकरण का दुष्परिणाम, जो 1996 में पूरा हुआ, एमपीआई-1 मानक को स्पष्ट कर रहा था, जिससे एमपीआई-1.2 का निर्माण हुआ।


MPI-3 में नए फोरट्रान 2008 बाइंडिंग शामिल हैं, जबकि यह पदावनत C++ बाइंडिंग के साथ-साथ कई पदावनत रूटीन और MPI ऑब्जेक्ट्स को हटाता है।
एमपीआई-2 अधिकतर एमपीआई-1 का सुपरसेट है, चूंकि कुछ कार्यों को हटा दिया गया है। एमपीआई-1.3 प्रोग्राम अभी भी एमपीआई-2 मानक के अनुरूप एमपीआई कार्यान्वयन के अनुसार काम करते हैं।


MPI की तुलना अक्सर [[समानांतर वर्चुअल मशीन]] (PVM) से की जाती है, जो 1989 में विकसित लोकप्रिय वितरित वातावरण और संदेश पासिंग सिस्टम है, और जो उन प्रणालियों में से एक थी जो मानक समानांतर संदेश पासिंग की आवश्यकता को प्रेरित करती थी। थ्रेडेड साझा मेमोरी प्रोग्रामिंग मॉडल (जैसे [[Pthreads]] और [[OpenMP]]) और मैसेज पासिंग प्रोग्रामिंग (MPI/PVM) को पूरक माना जा सकता है और उदाहरण के लिए, कई बड़े साझा-मेमोरी नोड्स वाले सर्वर में एक साथ उपयोग किया गया है।
एमपीआई-3 में नए फोरट्रान 2008 बाइंडिंग सम्मिलित हैं, जबकि यह पदावनत C++ बाइंडिंग के साथ-साथ कई पदावनत रूटीन और एमपीआई ऑब्जेक्ट्स को हटाता है।
 
एमपीआई की तुलना अधिकांशतः [[समानांतर वर्चुअल मशीन]] (पीवीएम) से की जाती है, जो 1989 में विकसित लोकप्रिय वितरित वातावरण और संदेश पासिंग प्रणाली है, और जो उन प्रणालियों में से एक थी जो मानक समानांतर संदेश पासिंग की आवश्यकता को प्रेरित करती थी। थ्रेडेड साझा मेमोरी प्रोग्रामिंग मॉडल (जैसे [[Pthreads]] और [[OpenMP]]) और मैसेज पासिंग प्रोग्रामिंग (एमपीआई/पीवीएम) को पूरक माना जा सकता है और उदाहरण के लिए, कई बड़े साझा-मेमोरी नोडों वाले सर्वर में एक साथ उपयोग किया गया है।


== कार्यक्षमता ==
== कार्यक्षमता ==
MPI इंटरफ़ेस भाषा-विशिष्ट सिंटैक्स (बाइंडिंग) के साथ भाषा-स्वतंत्र तरीके से प्रक्रियाओं के सेट (जो नोड्स/सर्वर/कंप्यूटर उदाहरणों के लिए मैप किया गया है) के बीच आवश्यक आभासी टोपोलॉजी, सिंक्रनाइज़ेशन और संचार कार्यक्षमता प्रदान करने के लिए है। साथ ही कुछ भाषा-विशिष्ट सुविधाएँ। एमपीआई प्रोग्राम हमेशा प्रक्रियाओं के साथ काम करते हैं, लेकिन प्रोग्रामर आमतौर पर प्रक्रियाओं को प्रोसेसर के रूप में संदर्भित करते हैं। आमतौर पर, अधिकतम प्रदर्शन के लिए, प्रत्येक [[CPU]] (या मल्टी-कोर मशीन में [[मल्टी-कोर (कम्प्यूटिंग)]]) को केवल एक ही प्रक्रिया सौंपी जाएगी। यह असाइनमेंट रनटाइम पर उस एजेंट के माध्यम से होता है जो MPI प्रोग्राम शुरू करता है, जिसे आमतौर पर mpirun या mpiexec कहा जाता है।
एमपीआई इंटरफ़ेस भाषा-विशिष्ट सिंटैक्स (बाइंडिंग) के साथ भाषा-स्वतंत्र तरीके से प्रक्रियाओं के सेट (जो नोड/सर्वर/कंप्यूटर उदाहरणों के लिए मैप किया गया है) के बीच आवश्यक आभासी टोपोलॉजी, सिंक्रनाइज़ेशन और संचार कार्यक्षमता प्रदान करने के लिए है। साथ ही कुछ भाषा-विशिष्ट सुविधाएँ। एमपीआई प्रोग्राम हमेशा प्रक्रियाओं के साथ काम करते हैं, लेकिन प्रोग्रामर सामान्यतः प्रक्रियाओं को प्रोसेसर के रूप में संदर्भित करते हैं। सामान्यतः, अधिकतम प्रदर्शन के लिए, प्रत्येक [[CPU]] (या बहु-कोर मशीन में [[मल्टी-कोर (कम्प्यूटिंग)|बहु-कोर (कम्प्यूटिंग)]]) को केवल एक ही प्रक्रिया सौंपी जाएगी। यह असाइनमेंट रनटाइम पर उस एजेंट के माध्यम से होता है जो एमपीआई प्रोग्राम प्रारंभ करता है, जिसे सामान्यतः एमपीआईरन या एमपीआईनिष्पादन कहा जाता है।


MPI लाइब्रेरी फ़ंक्शंस में शामिल हैं, लेकिन पॉइंट-टू-पॉइंट रेंडेवस-टाइप सेंड / रिसीव ऑपरेशंस तक सीमित नहीं हैं, [[कार्तीय वृक्ष]] या ग्राफ़ (डेटा स्ट्रक्चर) के बीच चयन करना - जैसे लॉजिकल प्रोसेस टोपोलॉजी, प्रोसेस जोड़े के बीच डेटा का आदान-प्रदान करना (भेजना / प्राप्त करना) संचालन), संगणनाओं के आंशिक परिणामों का संयोजन (संचालन इकट्ठा करना और कम करना), नोड्स को सिंक्रनाइज़ करना (बाधा संचालन) साथ ही साथ नेटवर्क से संबंधित जानकारी प्राप्त करना जैसे कि कंप्यूटिंग सत्र में प्रक्रियाओं की संख्या, वर्तमान प्रोसेसर पहचान जो प्रक्रिया को मैप की जाती है, तार्किक टोपोलॉजी में पड़ोसी प्रक्रियाएं सुलभ हैं, और इसी तरह। पॉइंट-टू-पॉइंट ऑपरेशंस [[तादात्म्य]] (कंप्यूटर साइंस), एसिंक्रोनस आई / ओ, बफ़र्ड और रेडी फॉर्म में आते हैं, जो मिलन-स्थल-भेजने के सिंक्रोनाइज़ेशन पहलुओं के लिए अपेक्षाकृत मजबूत और कमजोर शब्दार्थ दोनों की अनुमति देते हैं। कई बकाया अधिकांश कार्यान्वयनों में एसिंक्रोनस मोड में संचालन संभव है।
एमपीआई पुस्तकालय फलनों में सम्मिलित हैं, लेकिन पॉइंट-टू-पॉइंट रेंडेवस-टाइप सेंड / रिसीव ऑपरेशंस तक सीमित नहीं हैं, [[कार्तीय वृक्ष]] या ग्राफ़ (डेटा स्ट्रक्चर) के बीच चयन करना - जैसे लॉजिकल प्रोसेस टोपोलॉजी, प्रोसेस जोड़े के बीच डेटा का आदान-प्रदान करना (भेजना / प्राप्त करना) संचालन), संगणनाओं के आंशिक परिणामों का संयोजन (संचालन इकट्ठा करना और कम करना), नोडों को सिंक्रनाइज़ करना (बाधा संचालन) साथ ही साथ नेटवर्क से संबंधित जानकारी प्राप्त करना जैसे कि कंप्यूटिंग सत्र में प्रक्रियाओं की संख्या, वर्तमान प्रोसेसर पहचान जो प्रक्रिया को मैप की जाती है, तार्किक टोपोलॉजी में पड़ोसी प्रक्रियाएं सुलभ हैं, और इसी तरह। पॉइंट-टू-पॉइंट ऑपरेशंस [[तादात्म्य]] (कंप्यूटर साइंस), एसिंक्रोनस आई / ओ, बफ़र्ड और रेडी फॉर्म में आते हैं, जो मिलन-स्थल-भेजने के सिंक्रोनाइज़ेशन पहलुओं के लिए अपेक्षाकृत मजबूत और कमजोर शब्दार्थ दोनों की अनुमति देते हैं। कई बकाया अधिकांश कार्यान्वयनों में एसिंक्रोनस मोड में संचालन संभव है।


MPI-1 और MPI-2 दोनों कार्यान्वयन को सक्षम करते हैं जो संचार और संगणना को ओवरलैप करते हैं, लेकिन अभ्यास और सिद्धांत भिन्न होते हैं। एमपीआई थ्रेड सुरक्षित इंटरफेस भी निर्दिष्ट करता है, जिसमें [[सामंजस्य (कंप्यूटर विज्ञान)]] और [[युग्मन (कंप्यूटर विज्ञान)]] रणनीतियां होती हैं जो इंटरफ़ेस के भीतर छिपे हुए राज्य से बचने में मदद करती हैं। मल्टीथ्रेडेड पॉइंट-टू-पॉइंट एमपीआई कोड लिखना अपेक्षाकृत आसान है, और कुछ कार्यान्वयन ऐसे कोड का समर्थन करते हैं। [[मल्टीथ्रेडिंग (कंप्यूटर आर्किटेक्चर)]] सामूहिक संचार कम्युनिकेटर्स की कई प्रतियों के साथ सबसे अच्छा होता है, जैसा कि नीचे बताया गया है।
एमपीआई-1 और एमपीआई-2 दोनों कार्यान्वयन को सक्षम करते हैं जो संचार और संगणना को ओवरलैप करते हैं, लेकिन अभ्यास और सिद्धांत भिन्न होते हैं। एमपीआई थ्रेड सुरक्षित इंटरफेस भी निर्दिष्ट करता है, जिसमें [[सामंजस्य (कंप्यूटर विज्ञान)]] और [[युग्मन (कंप्यूटर विज्ञान)]] रणनीतियां होती हैं जो इंटरफ़ेस के अंदर छिपे हुए राज्य से बचने में सहायता करती हैं। बहुथ्रेडेड पॉइंट-टू-पॉइंट एमपीआई कोड लिखना अपेक्षाकृत आसान है, और कुछ कार्यान्वयन ऐसे कोड का समर्थन करते हैं। [[मल्टीथ्रेडिंग (कंप्यूटर आर्किटेक्चर)|बहुथ्रेडिंग (कंप्यूटर आर्किटेक्चर)]] सामूहिक संचार संचारक की कई प्रतियों के साथ सबसे अच्छा होता है, जैसा कि नीचे बताया गया है।


== अवधारणाएं ==
== अवधारणाएं ==
MPI कई सुविधाएँ प्रदान करता है। निम्नलिखित अवधारणाएं उन सभी क्षमताओं के लिए संदर्भ प्रदान करती हैं और प्रोग्रामर को यह तय करने में मदद करती हैं कि उनके एप्लिकेशन प्रोग्राम में किस कार्यक्षमता का उपयोग किया जाए। MPI की आठ बुनियादी अवधारणाओं में से चार MPI-2 के लिए अद्वितीय हैं।
एमपीआई कई सुविधाएँ प्रदान करता है। निम्नलिखित अवधारणाएं उन सभी क्षमताओं के लिए संदर्भ प्रदान करती हैं और प्रोग्रामर को यह तय करने में सहायता करती हैं कि उनके अनुप्रयोग प्रोग्राम में किस कार्यक्षमता का उपयोग किया जाए। एमपीआई की आठ बुनियादी अवधारणाओं में से चार एमपीआई-2 के लिए अद्वितीय हैं।


=== कम्युनिकेटर ===
=== संचारक ===
कम्युनिकेटर ऑब्जेक्ट MPI सत्र में प्रक्रियाओं के समूह को जोड़ता है। प्रत्येक कम्युनिकेटर प्रत्येक निहित प्रक्रिया को स्वतंत्र पहचानकर्ता देता है और आदेशित [[टोपोलॉजी (बहुविकल्पी)]] में अपनी निहित प्रक्रियाओं को व्यवस्थित करता है। MPI में स्पष्ट समूह भी हैं, लेकिन ये मुख्य रूप से किसी अन्य संचारक के बनने से पहले प्रक्रियाओं के समूहों को व्यवस्थित और पुनर्गठित करने के लिए अच्छे हैं। MPI सिंगल ग्रुप इंट्राकम्यूनिकेटर ऑपरेशंस और द्विपक्षीय इंटरकम्युनिकेटर कम्युनिकेशन को समझता है। MPI-1 में, एकल समूह संचालन सबसे अधिक प्रचलित हैं। [[द्विपक्षीय तुल्यकालन]] संचालन ज्यादातर MPI-2 में दिखाई देते हैं जहां वे सामूहिक संचार और गतिशील इन-प्रोसेस प्रबंधन शामिल करते हैं।
संचारक ऑब्जेक्ट एमपीआई सत्र में प्रक्रियाओं के समूह को जोड़ता है। प्रत्येक संचारक प्रत्येक निहित प्रक्रिया को स्वतंत्र पहचानकर्ता देता है और आदेशित [[टोपोलॉजी (बहुविकल्पी)]] में अपनी निहित प्रक्रियाओं को व्यवस्थित करता है। एमपीआई में स्पष्ट समूह भी हैं, लेकिन ये मुख्य रूप से किसी अन्य संचारक के बनने से पहले प्रक्रियाओं के समूहों को व्यवस्थित और पुनर्गठित करने के लिए अच्छे हैं। एमपीआई एकल ग्रुप इंट्राकम्यूनिकेटर ऑपरेशंस और द्विपक्षीय संचारक संचार को समझता है। एमपीआई-1 में, एकल समूह संचालन सबसे अधिक प्रचलित हैं। [[द्विपक्षीय तुल्यकालन]] संचालन अधिकतर एमपीआई-2 में दिखाई देते हैं जहां वे सामूहिक संचार और गतिशील इन-प्रोसेस प्रबंधन सम्मिलित करते हैं।


कई MPI कमांड का उपयोग करके संचारकों को विभाजित किया जा सकता है। इन आदेशों में शामिल हैं <code>MPI_COMM_SPLIT</code>, जहां प्रत्येक प्रक्रिया स्वयं को वह रंग होने की घोषणा करके कई रंगीन उप-संचारकों में से एक से जोड़ती है।
कई एमपीआई कमांड का उपयोग करके संचारकों को विभाजित किया जा सकता है। इन आदेशों में सम्मिलित हैं <code>MPI_COMM_SPLIT</code>, जहां प्रत्येक प्रक्रिया स्वयं को वह रंग होने की घोषणा करके कई रंगीन उप-संचारकों में से एक से जोड़ती है।


=== पॉइंट-टू-पॉइंट बेसिक्स ===
=== पॉइंट-टू-पॉइंट बेसिक्स ===
कई महत्वपूर्ण एमपीआई कार्यों में दो विशिष्ट प्रक्रियाओं के बीच संचार शामिल है। प्रचलित उदाहरण है <code>MPI_Send</code>, जो निर्दिष्ट प्रक्रिया को दूसरी निर्दिष्ट प्रक्रिया को संदेश भेजने की अनुमति देता है। पॉइंट-टू-पॉइंट ऑपरेशंस, जैसा कि इन्हें कहा जाता है, विशेष रूप से पैटर्न या अनियमित संचार में उपयोगी होते हैं, उदाहरण के लिए, [[डेटा समानता]] | डेटा-समानांतर आर्किटेक्चर जिसमें प्रत्येक प्रोसेसर नियमित रूप से गणना चरणों के बीच विशिष्ट अन्य प्रोसेसर के साथ डेटा के क्षेत्रों को स्वैप करता है, या मास्टर/स्लेव (प्रौद्योगिकी) | मास्टर-स्लेव आर्किटेक्चर जिसमें मास्टर दास को नया कार्य डेटा भेजता है जब भी पूर्व कार्य पूरा हो जाता है।
कई महत्वपूर्ण एमपीआई कार्यों में दो विशिष्ट प्रक्रियाओं के बीच संचार सम्मिलित है। प्रचलित उदाहरण है <code>MPI_Send</code>, जो निर्दिष्ट प्रक्रिया को दूसरी निर्दिष्ट प्रक्रिया को संदेश भेजने की अनुमति देता है। पॉइंट-टू-पॉइंट ऑपरेशंस, जैसा कि इन्हें कहा जाता है, विशेष रूप से पैटर्न या अनियमित संचार में उपयोगी होते हैं, उदाहरण के लिए, [[डेटा समानता]] | डेटा-समानांतर आर्किटेक्चर जिसमें प्रत्येक प्रोसेसर नियमित रूप से गणना चरणों के बीच विशिष्ट अन्य प्रोसेसर के साथ डेटा के क्षेत्रों को स्वैप करता है, या मास्टर/स्लेव (प्रौद्योगिकी) | मास्टर-स्लेव आर्किटेक्चर जिसमें मास्टर दास को नया कार्य डेटा भेजता है जब भी पूर्व कार्य पूरा हो जाता है।


MPI-1 [[अवरोधन (कंप्यूटिंग)]] और नॉन-ब्लॉकिंग पॉइंट-टू-पॉइंट कम्युनिकेशन मैकेनिज्म के साथ-साथ तथाकथित 'रेडी-सेंड' मैकेनिज्म दोनों के लिए मैकेनिज्म को निर्दिष्ट करता है, जिससे सेंड रिक्वेस्ट तभी की जा सकती है, जब मैचिंग रिसीव रिक्वेस्ट हो पहले ही बना दिया गया है।
एमपीआई-1 [[अवरोधन (कंप्यूटिंग)]] और नॉन-ब्लॉकिंग पॉइंट-टू-पॉइंट संचार मैकेनिज्म के साथ-साथ तथाकथित 'रेडी-सेंड' मैकेनिज्म दोनों के लिए मैकेनिज्म को निर्दिष्ट करता है, जिससे सेंड रिक्वेस्ट तभी की जा सकती है, जब मैचिंग रिसीव रिक्वेस्ट हो पहले ही बना दिया गया है।


=== सामूहिक मूल बातें ===
=== सामूहिक मूल बातें ===
[[सामूहिक संचालन]] में प्रक्रिया समूह में सभी प्रक्रियाओं के बीच संचार शामिल होता है (जिसका अर्थ संपूर्ण प्रक्रिया पूल या प्रोग्राम-परिभाषित सबसेट हो सकता है)। विशिष्ट कार्य है <code>MPI_Bcast</code> कॉल (प्रसारण (कंप्यूटिंग) के लिए संक्षिप्त)। यह फ़ंक्शन नोड से डेटा लेता है और इसे प्रक्रिया समूह में सभी प्रक्रियाओं को भेजता है। रिवर्स ऑपरेशन है <code>MPI_Reduce</code> कॉल, जो समूह में सभी प्रक्रियाओं से डेटा लेता है, ऑपरेशन (जैसे योग) करता है, और परिणामों को नोड पर संग्रहीत करता है। <code>MPI_Reduce</code> बड़ी वितरित गणना की शुरुआत या अंत में अक्सर उपयोगी होता है, जहां प्रत्येक प्रोसेसर डेटा के एक हिस्से पर काम करता है और फिर इसे परिणाम में जोड़ता है।
[[सामूहिक संचालन]] में प्रक्रिया समूह में सभी प्रक्रियाओं के बीच संचार सम्मिलित होता है (जिसका अर्थ संपूर्ण प्रक्रिया पूल या प्रोग्राम-परिभाषित सबसेट हो सकता है)। विशिष्ट कार्य है <code>MPI_Bcast</code> कॉल (प्रसारण (कंप्यूटिंग) के लिए संक्षिप्त)। यह फलन नोड से डेटा लेता है और इसे प्रक्रिया समूह में सभी प्रक्रियाओं को भेजता है। रिवर्स संचालन है <code>MPI_Reduce</code> कॉल, जो समूह में सभी प्रक्रियाओं से डेटा लेता है, संचालन (जैसे योग) करता है, और परिणामों को नोड पर संग्रहीत करता है। <code>MPI_Reduce</code> बड़ी वितरित गणना की प्रारंभ या अंत में अधिकांशतः उपयोगी होता है, जहां प्रत्येक प्रोसेसर डेटा के एक हिस्से पर काम करता है और फिर इसे परिणाम में जोड़ता है।


अन्य ऑपरेशन अधिक परिष्कृत कार्य करते हैं, जैसे <code>MPI_Alltoall</code> जो डेटा के n आइटम को पुनर्व्यवस्थित करता है जैसे कि nth नोड को प्रत्येक से डेटा का nth आइटम मिलता है।
अन्य संचालन अधिक परिष्कृत कार्य करते हैं, जैसे <code>MPI_Alltoall</code> जो डेटा के n आइटम को पुनर्व्यवस्थित करता है जैसे कि nth नोड को प्रत्येक से डेटा का nth आइटम मिलता है।


=== व्युत्पन्न डेटा प्रकार ===
=== व्युत्पन्न डेटा प्रकार ===
कई एमपीआई कार्यों के लिए आवश्यक है कि आप प्रक्रियाओं के बीच भेजे जाने वाले डेटा के प्रकार को निर्दिष्ट करें। ऐसा इसलिए है क्योंकि एमपीआई का लक्ष्य विषम वातावरणों का समर्थन करना है जहां विभिन्न नोड्स पर अलग-अलग प्रकारों का प्रतिनिधित्व किया जा सकता है<ref name="node37">{{cite web|url=http://mpi-forum.org/docs/mpi-1.1/mpi-11-html/node37.html|title=Type matching rules|website=mpi-forum.org}}</ref> (उदाहरण के लिए वे अलग-अलग सीपीयू आर्किटेक्चर चला रहे होंगे जिनमें अलग-अलग अंतराल हैं), जिस स्थिति में एमपीआई कार्यान्वयन डेटा रूपांतरण कर सकता है।<ref name="node37" />चूंकि सी भाषा एक प्रकार को पैरामीटर के रूप में पारित करने की अनुमति नहीं देती है, एमपीआई स्थिरांक को पूर्वनिर्धारित करता है <code>MPI_INT</code>, <code>MPI_CHAR</code>, <code>MPI_DOUBLE</code> के साथ मेल खाना <code>int</code>, <code>char</code>, <code>double</code>, वगैरह।
कई एमपीआई कार्यों के लिए आवश्यक है कि आप प्रक्रियाओं के बीच भेजे जाने वाले डेटा के प्रकार को निर्दिष्ट करें। ऐसा इसलिए है क्योंकि एमपीआई का लक्ष्य विषम वातावरणों का समर्थन करना है जहां विभिन्न नोडों पर अलग-अलग प्रकारों का प्रतिनिधित्व किया जा सकता है<ref name="node37">{{cite web|url=http://mpi-forum.org/docs/mpi-1.1/mpi-11-html/node37.html|title=Type matching rules|website=mpi-forum.org}}</ref> (उदाहरण के लिए वे अलग-अलग सीपीयू आर्किटेक्चर चला रहे होंगे जिनमें अलग-अलग अंतराल हैं), जिस स्थिति में एमपीआई कार्यान्वयन डेटा रूपांतरण कर सकता है।<ref name="node37" /> चूंकि सी भाषा एक प्रकार को पैरामीटर के रूप में पारित करने की अनुमति नहीं देती है, एमपीआई स्थिरांक को पूर्वनिर्धारित करता है <code>MPI_INT</code>, <code>MPI_CHAR</code>, <code>MPI_DOUBLE</code> के साथ मेल खाना <code>int</code>, <code>char</code>, <code>double</code>, वगैरह।
 
यहाँ C में उदाहरण दिया गया है जो सरणियों को पास करता है <code>int</code>सभी प्रक्रियाओं से एक तक। प्राप्त करने वाली प्रक्रिया को रूट प्रक्रिया कहा जाता है, और यह कोई भी नामित प्रक्रिया हो सकती है लेकिन सामान्यतः यह प्रक्रिया 0 होगी। सभी प्रक्रियाएं अपने सरणियों को रूट के साथ भेजने के लिए कहती हैं <code>MPI_Gather</code>, जो प्रत्येक प्रक्रिया (रूट सहित) कॉल करने के बराबर है <code>MPI_Send</code> और रूट ऑर्डर की इसी संख्या को बनाते हैं <code>MPI_Recv</code> इन सभी सरणियों को बड़े में इकट्ठा करने के लिए कहता है:<ref>{{cite web|url=https://www.open-mpi.org/doc/v1.8/man3/MPI_Gather.3.php|title=MPI_Gather(3) man page (version 1.8.8)|website=www.open-mpi.org}}</ref>


यहाँ C में उदाहरण दिया गया है जो सरणियों को पास करता है <code>int</code>सभी प्रक्रियाओं से एक तक। प्राप्त करने वाली प्रक्रिया को रूट प्रक्रिया कहा जाता है, और यह कोई भी नामित प्रक्रिया हो सकती है लेकिन आम तौर पर यह प्रक्रिया 0 होगी। सभी प्रक्रियाएं अपने सरणियों को रूट के साथ भेजने के लिए कहती हैं <code>MPI_Gather</code>, जो प्रत्येक प्रक्रिया (रूट सहित) कॉल करने के बराबर है <code>MPI_Send</code> और रूट ऑर्डर की इसी संख्या को बनाते हैं <code>MPI_Recv</code> इन सभी सरणियों को बड़े में इकट्ठा करने के लिए कहता है:<ref>{{cite web|url=https://www.open-mpi.org/doc/v1.8/man3/MPI_Gather.3.php|title=MPI_Gather(3) man page (version 1.8.8)|website=www.open-mpi.org}}</ref>
<वाक्यविन्यास प्रकाश लैंग = सी>
<वाक्यविन्यास प्रकाश लैंग = सी>
int send_array [100];
int send_array [100];
इंट रूट = 0; /* या जो कुछ भी */
इंट रूट = 0; /* या जो कुछ भी */
int num_procs, *recv_array;
int num_procs, *recv_array;
MPI_Comm_size (कॉम, और num_procs);
MPI_Comm_size (कॉम, और num_procs);
recv_array = malloc (num_procs * sizeof (send_array));
recv_array = malloc (num_procs * sizeof (send_array));
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
           recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
           recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
Line 75: Line 82:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


हालाँकि, आप इसके बजाय 100 के विपरीत ब्लॉक के रूप में डेटा भेजना चाह सकते हैं <code>int</code>एस। ऐसा करने के लिए सन्निहित ब्लॉक व्युत्पन्न डेटा प्रकार परिभाषित करें:
चूँकि, आप इसके अतिरिक्त 100 के विपरीत ब्लॉक के रूप में डेटा भेजना चाह सकते हैं <code>int</code>एस। ऐसा करने के लिए सन्निहित ब्लॉक व्युत्पन्न डेटा प्रकार परिभाषित करें:
 
<वाक्यविन्यास प्रकाश लैंग = सी>
<वाक्यविन्यास प्रकाश लैंग = सी>
एमपीआई_डेटा प्रकार नया प्रकार;
एमपीआई_डेटा प्रकार नया प्रकार;
MPI_Type_contiguous(100, MPI_INT, &newtype);
MPI_Type_contiguous(100, MPI_INT, &newtype);
MPI_Type_commit (&newtype);
MPI_Type_commit (&newtype);
MPI_Gather (सरणी, 1, नया प्रकार, प्राप्त_सरणी, 1, नया प्रकार, जड़, कॉम);
MPI_Gather (सरणी, 1, नया प्रकार, प्राप्त_सरणी, 1, नया प्रकार, जड़, कॉम);
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


कक्षा या डेटा संरचना पास करने के लिए, <code>MPI_Type_create_struct</code> से MPI व्युत्पन्न डेटा प्रकार बनाता है <code>MPI_predefined</code> डेटा प्रकार, इस प्रकार है:
कक्षा या डेटा संरचना पास करने के लिए, <code>MPI_Type_create_struct</code> से एमपीआई व्युत्पन्न डेटा प्रकार बनाता है <code>MPI_predefined</code> डेटा प्रकार, इस प्रकार है:
 
<वाक्यविन्यास प्रकाश लैंग = सी>
<वाक्यविन्यास प्रकाश लैंग = सी>
int MPI_Type_create_struct (int गिनती,
int MPI_Type_create_struct (int गिनती,
                           इंट *ब्लॉकलेन,
                           इंट *ब्लॉकलेन,
Line 93: Line 108:
कहाँ:
कहाँ:
* <code>count</code> कई ब्लॉक हैं, और सरणियों की लंबाई (तत्वों में) निर्दिष्ट करते हैं <code>blocklen</code>, <code>disp</code>, और <code>type</code>.
* <code>count</code> कई ब्लॉक हैं, और सरणियों की लंबाई (तत्वों में) निर्दिष्ट करते हैं <code>blocklen</code>, <code>disp</code>, और <code>type</code>.
* <code>blocklen</code> प्रत्येक ब्लॉक में तत्वों की संख्या शामिल है,
* <code>blocklen</code> प्रत्येक ब्लॉक में तत्वों की संख्या सम्मिलित है,
* <code>disp</code> प्रत्येक ब्लॉक के बाइट विस्थापन शामिल हैं,
* <code>disp</code> प्रत्येक ब्लॉक के बाइट विस्थापन सम्मिलित हैं,
* <code>type</code> प्रत्येक ब्लॉक में तत्व के प्रकार होते हैं।
* <code>type</code> प्रत्येक ब्लॉक में तत्व के प्रकार होते हैं।
* <code>newtype</code> (एक आउटपुट) में इस फ़ंक्शन द्वारा बनाया गया नया व्युत्पन्न प्रकार होता है <code>disp</code> ई> (विस्थापन) सरणी [[डेटा संरचना संरेखण]] के लिए आवश्यक है, क्योंकि संकलक वर्ग या डेटा संरचना में चर को पैड कर सकता है। विभिन्न क्षेत्रों के बीच की दूरी का पता लगाने का सबसे सुरक्षित तरीका उनके पते को स्मृति में प्राप्त करना है। इसके साथ किया जाता है <code>MPI_Get_address</code>, जो आमतौर पर C के समान होता है <code>&</code> ऑपरेटर लेकिन [[स्मृति विभाजन]] से निपटने के दौरान यह सच नहीं हो सकता है।<ref>{{cite web|url=http://www.mpich.org/static/docs/v3.1/www3/MPI_Get_address.html|title=MPI_Get_address|website=www.mpich.org}}</ref>
* <code>newtype</code> (एक आउटपुट) में इस फलन द्वारा बनाया गया नया व्युत्पन्न प्रकार होता है <code>disp</code> ई> (विस्थापन) सरणी [[डेटा संरचना संरेखण]] के लिए आवश्यक है, क्योंकि संकलक वर्ग या डेटा संरचना में चर को पैड कर सकता है। विभिन्न क्षेत्रों के बीच की दूरी का पता लगाने का सबसे सुरक्षित विधि उनके पते को स्मृति में प्राप्त करना है। इसके साथ किया जाता है <code>MPI_Get_address</code>, जो सामान्यतः C के समान होता है <code>&</code> ऑपरेटर लेकिन [[स्मृति विभाजन]] से निपटने के समय यह सच नहीं हो सकता है।<ref>{{cite web|url=http://www.mpich.org/static/docs/v3.1/www3/MPI_Get_address.html|title=MPI_Get_address|website=www.mpich.org}}</ref>
डेटा संरचना को ब्लॉक के रूप में पास करना एक समय में एक आइटम को पास करने की तुलना में काफी तेज है, खासकर अगर ऑपरेशन को दोहराया जाना है। ऐसा इसलिए है क्योंकि निश्चित आकार के ब्लॉक को स्थानांतरण के दौरान क्रमांकन की आवश्यकता नहीं होती है।<ref>[http://www.boost.org/doc/libs/1_55_0/doc/html/mpi/python.html#mpi.python_skeleton_content Boost.MPI Skeleton/Content Mechanism rationale] (performance comparison graphs were produced using [[NetPIPE]])</ref>
डेटा संरचना को ब्लॉक के रूप में पास करना एक समय में एक आइटम को पास करने की तुलना में अधिक तेज है, खासकर अगर संचालन को दोहराया जाना है। ऐसा इसलिए है क्योंकि निश्चित आकार के ब्लॉक को स्थानांतरण के समय क्रमांकन की आवश्यकता नहीं होती है।<ref>[http://www.boost.org/doc/libs/1_55_0/doc/html/mpi/python.html#mpi.python_skeleton_content Boost.MPI Skeleton/Content Mechanism rationale] (performance comparison graphs were produced using [[NetPIPE]])</ref>
 
निम्नलिखित डेटा संरचनाओं को देखते हुए:
निम्नलिखित डेटा संरचनाओं को देखते हुए:
<वाक्यविन्यास प्रकाश लैंग = सी>
<वाक्यविन्यास प्रकाश लैंग = सी>
संरचना ए {
संरचना ए {
Line 109: Line 126:
     इंट पीपी, वीपी;
     इंट पीपी, वीपी;
};
};
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


यहाँ MPI-व्युत्पन्न डेटा प्रकार बनाने के लिए C कोड दिया गया है:
यहाँ एमपीआई-व्युत्पन्न डेटा प्रकार बनाने के लिए C कोड दिया गया है:
 
<वाक्यविन्यास प्रकाश लैंग = सी>
<वाक्यविन्यास प्रकाश लैंग = सी>
स्टेटिक कास्ट इंट ब्लॉकन [] = {1, 1, 1, 1};
स्टेटिक कास्ट इंट ब्लॉकन [] = {1, 1, 1, 1};
स्थिर स्थिरांक MPI_Aint विवाद [] = {
स्थिर स्थिरांक MPI_Aint विवाद [] = {
     ऑफसेट (संरचना बी, ए) + ऑफसेट (संरचना ए, एफ),
     ऑफसेट (संरचना बी, ए) + ऑफसेट (संरचना ए, एफ),
Line 120: Line 141:
     ऑफसेट (संरचना बी, वीपी)
     ऑफसेट (संरचना बी, वीपी)
};
};
स्थिर MPI_Datatype प्रकार [] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};
स्थिर MPI_Datatype प्रकार [] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};
एमपीआई_डेटा प्रकार नया प्रकार;
एमपीआई_डेटा प्रकार नया प्रकार;
MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype);
MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype);
MPI_Type_commit (&newtype);
MPI_Type_commit (&newtype);
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


Line 129: Line 155:


=== एकतरफा संचार ===
=== एकतरफा संचार ===
MPI-2 तीन एकतरफा संचार संचालन को परिभाषित करता है, <code>MPI_Put</code>, <code>MPI_Get</code>, और <code>MPI_Accumulate</code>, दूरस्थ स्मृति के लिए लेखन, दूरस्थ स्मृति से पठन, और क्रमशः कई कार्यों में एक ही स्मृति पर कमी संचालन। इस संचार को सिंक्रनाइज़ करने के लिए तीन अलग-अलग तरीकों को भी परिभाषित किया गया है (वैश्विक, जोड़ीदार और रिमोट लॉक) क्योंकि विनिर्देश गारंटी नहीं देता है कि ये ऑपरेशन सिंक्रनाइज़ेशन बिंदु तक हो चुके हैं।
एमपीआई-2 तीन एकतरफा संचार संचालन को परिभाषित करता है, <code>MPI_Put</code>, <code>MPI_Get</code>, और <code>MPI_Accumulate</code>, दूरस्थ स्मृति के लिए लेखन, दूरस्थ स्मृति से पठन, और क्रमशः कई कार्यों में एक ही स्मृति पर कमी संचालन। इस संचार को सिंक्रनाइज़ करने के लिए तीन अलग-अलग तरीकों को भी परिभाषित किया गया है (वैश्विक, जोड़ीदार और रिमोट लॉक) क्योंकि विनिर्देश गारंटी नहीं देता है कि ये संचालन सिंक्रनाइज़ेशन बिंदु तक हो चुके हैं।


इस प्रकार की कॉल अक्सर कलनविधि के लिए उपयोगी हो सकती हैं जिसमें सिंक्रनाइज़ेशन असुविधाजनक होगा (जैसे वितरित [[मैट्रिक्स गुणन]]), या जहां यह वांछनीय है कि कार्य अपने लोड को संतुलित करने में सक्षम हों जबकि अन्य प्रोसेसर डेटा पर काम कर रहे हों।
इस प्रकार की कॉल अधिकांशतः कलनविधि के लिए उपयोगी हो सकती हैं जिसमें सिंक्रनाइज़ेशन असुविधाजनक होगा (जैसे वितरित [[मैट्रिक्स गुणन]]), या जहां यह वांछनीय है कि कार्य अपने लोड को संतुलित करने में सक्षम हों जबकि अन्य प्रोसेसर डेटा पर काम कर रहे हों।


===गतिशील प्रक्रिया प्रबंधन===
===गतिशील प्रक्रिया प्रबंधन===
मुख्य पहलू नई एमपीआई प्रक्रियाओं के निर्माण में भाग लेने या एमपीआई प्रक्रियाओं के साथ संचार स्थापित करने के लिए एमपीआई प्रक्रिया की क्षमता है जो अलग से शुरू की गई है। MPI-2 विनिर्देश तीन मुख्य इंटरफेस का वर्णन करता है जिसके द्वारा MPI प्रक्रियाएं गतिशील रूप से संचार स्थापित कर सकती हैं, <code>MPI_Comm_spawn</code>, <code>MPI_Comm_accept</code>/<code>MPI_Comm_connect</code> और <code>MPI_Comm_join</code>. <code>MPI_Comm_spawn</code> ई> इंटरफ़ेस एमपीआई प्रक्रिया को नामित एमपीआई प्रक्रिया के कई उदाहरणों को उत्पन्न करने की अनुमति देता है। MPI प्रक्रियाओं का नव निर्मित सेट नया रूप बनाता है <code>MPI_COMM_WORLD</code> इंट्राकम्यूनिकेटर लेकिन माता-पिता के साथ संवाद कर सकता है और इंटरकम्युनिकेटर फ़ंक्शन लौटाता है। <code>MPI_Comm_spawn_multiple</code> वैकल्पिक इंटरफ़ेस है जो अलग-अलग उदाहरणों को अलग-अलग तर्कों के साथ अलग-अलग बाइनरी बनाने की अनुमति देता है।<ref name="Gropp99adv-p7">{{harvnb |Gropp |Lusk |Skjelling |1999b |p=7 }}</ref>
मुख्य पहलू नई एमपीआई प्रक्रियाओं के निर्माण में भाग लेने या एमपीआई प्रक्रियाओं के साथ संचार स्थापित करने के लिए एमपीआई प्रक्रिया की क्षमता है जो अलग से प्रारंभ की गई है। एमपीआई-2 विनिर्देश तीन मुख्य इंटरफेस का वर्णन करता है जिसके द्वारा एमपीआई प्रक्रियाएं गतिशील रूप से संचार स्थापित कर सकती हैं, <code>MPI_Comm_spawn</code>, <code>MPI_Comm_accept</code>/<code>MPI_Comm_connect</code> और <code>MPI_Comm_join</code>. <code>MPI_Comm_spawn</code> ई> इंटरफ़ेस एमपीआई प्रक्रिया को नामित एमपीआई प्रक्रिया के कई उदाहरणों को उत्पन्न करने की अनुमति देता है। एमपीआई प्रक्रियाओं का नव निर्मित सेट नया रूप बनाता है <code>MPI_COMM_WORLD</code> इंट्राकम्यूनिकेटर लेकिन माता-पिता के साथ संवाद कर सकता है और संचारक फलन लौटाता है। <code>MPI_Comm_spawn_multiple</code> वैकल्पिक इंटरफ़ेस है जो अलग-अलग उदाहरणों को अलग-अलग तर्कों के साथ अलग-अलग बाइनरी बनाने की अनुमति देता है।<ref name="Gropp99adv-p7">{{harvnb |Gropp |Lusk |Skjelling |1999b |p=7 }}</ref>




=== एन/ओ ===
=== एन/ओ ===
समांतर I/O सुविधा को कभी-कभी MPI-IO कहा जाता है,<ref name="Gropp99adv-pp5-6">{{harvnb |Gropp |Lusk |Skjelling |1999b |pp=5–6 }}</ref> और MPI को वितरित सिस्टम पर अमूर्त I/O प्रबंधन के लिए डिज़ाइन किए गए कार्यों के सेट को संदर्भित करता है, और मौजूदा व्युत्पन्न डेटाटाइप कार्यक्षमता का उपयोग करके फ़ाइलों को आसानी से पैटर्न तरीके से एक्सेस करने की अनुमति देता है।
समांतर आई/सुविधा को कभी-कभी एमपीआई-आईओ कहा जाता है,<ref name="Gropp99adv-pp5-6">{{harvnb |Gropp |Lusk |Skjelling |1999b |pp=5–6 }}</ref> और एमपीआई को वितरित प्रणाली पर अमूर्त आई/प्रबंधन के लिए डिज़ाइन किए गए कार्यों के सेट को संदर्भित करता है, और वर्तमान व्युत्पन्न डेटाटाइप कार्यक्षमता का उपयोग करके फ़ाइलों को आसानी से पैटर्न तरीके से एक्सेस करने की अनुमति देता है।


इस सुविधा पर किए गए छोटे शोध से संकेत मिलता है कि MPI-IO का उपयोग करके उच्च प्रदर्शन लाभ प्राप्त करना तुच्छ नहीं हो सकता है। उदाहरण के लिए, विरल मैट्रिक्स गुणन | मैट्रिक्स-वेक्टर गुणन का कार्यान्वयन MPI I/O लाइब्रेरी का उपयोग करके मामूली प्रदर्शन लाभ का सामान्य व्यवहार दिखाता है, लेकिन ये परिणाम अनिर्णायक हैं।<ref>{{cite web|url=http://marcovan.hulten.org/report.pdf|title=Sparse matrix-vector multiplications using the MPI I/O library}}</ref> यह नहीं था
इस सुविधा पर किए गए छोटे शोध से संकेत मिलता है कि एमपीआई-आईओ का उपयोग करके उच्च प्रदर्शन लाभ प्राप्त करना तुच्छ नहीं हो सकता है। उदाहरण के लिए, विरल मैट्रिक्स गुणन | मैट्रिक्स-वेक्टर गुणन का कार्यान्वयन एमपीआई आई/ओ पुस्तकालय का उपयोग करके सामान्य प्रदर्शन लाभ का सामान्य व्यवहार दिखाता है, लेकिन ये परिणाम अनिर्णायक हैं।<ref>{{cite web|url=http://marcovan.hulten.org/report.pdf|title=Sparse matrix-vector multiplications using the MPI I/O library}}</ref> यह नहीं था
सामूहिक I/O के विचार तक<ref>{{cite web|title=Data Sieving and Collective I/O in ROMIO|url=http://www.mcs.anl.gov/~thakur/papers/romio-coll.pdf|publisher=IEEE|date=Feb 1999}}</ref> MPI-IO में लागू किया गया कि MPI-IO व्यापक रूप से अपनाना शुरू कर दिया। सामूहिक I/O प्रक्रियाओं को सामूहिक रूप से छोटे और गैर-सन्निहित I/O संचालन को बड़े और सन्निहित लोगों में परिवर्तित करके अनुप्रयोगों के I/O बैंडविड्थ को काफी हद तक बढ़ा देता है, जिससे [[रिकॉर्ड लॉकिंग]] और डिस्क ओवरहेड कम हो जाता है। अपने विशाल प्रदर्शन लाभों के कारण, MPI-IO कई अत्याधुनिक I/O पुस्तकालयों, जैसे [[HDF5]] और [[NetCDF]] के लिए अंतर्निहित I/O परत भी बन गया। इसकी लोकप्रियता ने सामूहिक I/O अनुकूलन पर अनुसंधान को भी गति प्रदान की, जैसे कि लेआउट-जागरूक I/O<ref>{{cite book|chapter=LACIO: A New Collective I/O Strategy for Parallel I/O Systems|publisher=IEEE|date=Sep 2011|doi=10.1109/IPDPS.2011.79|isbn=978-1-61284-372-8|citeseerx=10.1.1.699.8972|title=2011 IEEE International Parallel & Distributed Processing Symposium|last1=Chen|first1=Yong|last2=Sun|first2=Xian-He|last3=Thakur|first3=Rajeev|last4=Roth|first4=Philip C.|last5=Gropp|first5=William D.|pages=794–804|s2cid=7110094}}</ref> और क्रॉस-फ़ाइल एकत्रीकरण।<ref>{{cite journal|author1=Teng Wang|author2=Kevin Vasko|author3=Zhuo Liu|author4=Hui Chen|author5=Weikuan Yu|title=Enhance parallel input/output with cross-bundle aggregation|journal=The International Journal of High Performance Computing Applications|volume=30|issue=2|pages=241–256|date=2016|doi=10.1177/1094342015618017|s2cid=12067366}}</ref><ref>{{cite book|chapter=BPAR: A Bundle-Based Parallel Aggregation Framework for Decoupled I/O Execution|publisher=IEEE|date=Nov 2014|doi=10.1109/DISCS.2014.6|isbn=978-1-4673-6750-9|title=2014 International Workshop on Data Intensive Scalable Computing Systems|last1=Wang|first1=Teng|last2=Vasko|first2=Kevin|last3=Liu|first3=Zhuo|last4=Chen|first4=Hui|last5=Yu|first5=Weikuan|pages=25–32|s2cid=2402391}}</ref>
सामूहिक आई/के विचार तक<ref>{{cite web|title=Data Sieving and Collective I/O in ROMIO|url=http://www.mcs.anl.gov/~thakur/papers/romio-coll.pdf|publisher=IEEE|date=Feb 1999}}</ref> एमपीआई-आईओ में प्रयुक्त किया गया कि एमपीआई-आईओ व्यापक रूप से अपनाना प्रारंभ कर दिया। सामूहिक आई/प्रक्रियाओं को सामूहिक रूप से छोटे और गैर-सन्निहित आई/संचालन को बड़े और सन्निहित लोगों में परिवर्तित करके अनुप्रयोगों के आई/बैंडविड्थ को अधिक सीमा तक बढ़ा देता है, जिससे [[रिकॉर्ड लॉकिंग]] और डिस्क ओवरहेड कम हो जाता है। अपने विशाल प्रदर्शन लाभों के कारण, एमपीआई-आईओ कई अत्याधुनिक आई/पुस्तकालयों, जैसे [[HDF5]] और [[NetCDF]] के लिए अंतर्निहित आई/परत भी बन गया। इसकी लोकप्रियता ने सामूहिक आई/अनुकूलन पर अनुसंधान को भी गति प्रदान की, जैसे कि लेआउट-जागरूक आई/<ref>{{cite book|chapter=LACIO: A New Collective I/O Strategy for Parallel I/O Systems|publisher=IEEE|date=Sep 2011|doi=10.1109/IPDPS.2011.79|isbn=978-1-61284-372-8|citeseerx=10.1.1.699.8972|title=2011 IEEE International Parallel & Distributed Processing Symposium|last1=Chen|first1=Yong|last2=Sun|first2=Xian-He|last3=Thakur|first3=Rajeev|last4=Roth|first4=Philip C.|last5=Gropp|first5=William D.|pages=794–804|s2cid=7110094}}</ref> और क्रॉस-फ़ाइल एकत्रीकरण।<ref>{{cite journal|author1=Teng Wang|author2=Kevin Vasko|author3=Zhuo Liu|author4=Hui Chen|author5=Weikuan Yu|title=Enhance parallel input/output with cross-bundle aggregation|journal=The International Journal of High Performance Computing Applications|volume=30|issue=2|pages=241–256|date=2016|doi=10.1177/1094342015618017|s2cid=12067366}}</ref><ref>{{cite book|chapter=BPAR: A Bundle-Based Parallel Aggregation Framework for Decoupled I/O Execution|publisher=IEEE|date=Nov 2014|doi=10.1109/DISCS.2014.6|isbn=978-1-4673-6750-9|title=2014 International Workshop on Data Intensive Scalable Computing Systems|last1=Wang|first1=Teng|last2=Vasko|first2=Kevin|last3=Liu|first3=Zhuo|last4=Chen|first4=Hui|last5=Yu|first5=Weikuan|pages=25–32|s2cid=2402391}}</ref>




== आधिकारिक कार्यान्वयन ==
== आधिकारिक कार्यान्वयन ==


* MPI 1.x मानक का प्रारंभिक कार्यान्वयन [[Argonne National Laboratory]] (ANL) और [[मिसिसिपी स्टेट यूनिवर्सिटी]] से MPICH था। [[आईबीएम]] भी शुरुआती कार्यान्वयनकर्ता था, और 90 के दशक की शुरुआती सुपरकंप्यूटर कंपनियों ने या तो MPICH का व्यावसायीकरण किया, या अपने स्वयं के कार्यान्वयन का निर्माण किया। [[ओहियो सुपरकंप्यूटर सेंटर]] से एलएएम/एमपीआई एक और शुरुआती खुला कार्यान्वयन था। ANL ने एक दशक से अधिक समय से MPICH का विकास जारी रखा है, और अब MPICH-3.2 प्रदान करता है, MPI-3.1 मानक को लागू करता है।
* एमपीआई 1.x मानक का प्रारंभिक कार्यान्वयन [[Argonne National Laboratory|आर्गन राष्ट्रीय प्रयोगशाला]] (ANL) और [[मिसिसिपी स्टेट यूनिवर्सिटी]] से एमपीआईसीएच था। [[आईबीएम]] भी प्रारंभिक कार्यान्वयनकर्ता था, और 90 के दशक की प्रारंभिक सुपरकंप्यूटर कंपनियों ने या तो एमपीआईसीएच का व्यावसायीकरण किया, या अपने स्वयं के कार्यान्वयन का निर्माण किया। [[ओहियो सुपरकंप्यूटर सेंटर]] से एलएएम/एमपीआई एक और प्रारंभिक खुला कार्यान्वयन था। ANL ने एक दशक से अधिक समय से एमपीआईसीएच का विकास जारी रखा है, और अब एमपीआईसीएच-3.2 प्रदान करता है, एमपीआई-3.1 मानक को प्रयुक्त करता है।
* ओपन एमपीआई (ओपनएमपी के साथ भ्रमित नहीं होना चाहिए) एफटी-एमपीआई, एलए-एमपीआई, एलएएम/एमपीआई और पैक्स-एमपीआई को मिलाकर बनाया गया था, और यह कई [[शीर्ष 500]] [[सुपर कंप्यूटर]] में पाया जाता है।
* ओपन एमपीआई (ओपनएमपी के साथ भ्रमित नहीं होना चाहिए) एफटी-एमपीआई, एलए-एमपीआई, एलएएम/एमपीआई और पैक्स-एमपीआई को मिलाकर बनाया गया था, और यह कई [[शीर्ष 500]] [[सुपर कंप्यूटर]] में पाया जाता है।


कई अन्य प्रयास MPICH, LAM, और अन्य कार्यों के डेरिवेटिव हैं, जिनमें [[Hewlett-Packard]], Intel, [[Microsoft]] और [[NEC]] के व्यावसायिक कार्यान्वयन शामिल हैं, लेकिन इन तक सीमित नहीं हैं।
कई अन्य प्रयास एमपीआईसीएच, LAM, और अन्य कार्यों के डेरिवेटिव हैं, जिनमें [[Hewlett-Packard]], Intel, [[Microsoft]] और [[NEC]] के व्यावसायिक कार्यान्वयन सम्मिलित हैं, लेकिन इन तक सीमित नहीं हैं।


जबकि विनिर्देश एक सी और फोरट्रान इंटरफ़ेस को अनिवार्य करते हैं, एमपीआई को लागू करने के लिए इस्तेमाल की जाने वाली भाषा रनटाइम पर समर्थन करने वाली भाषा या भाषाओं से मेल खाने के लिए बाध्य नहीं है। अधिकांश कार्यान्वयन सी, सी ++ और असेंबली भाषा को जोड़ते हैं, और सी, सी ++ और फोरट्रान प्रोग्रामर को लक्षित करते हैं। पर्ल, पायथन, आर, रूबी, जावा और [[नियंत्रण भाषा]] सहित कई अन्य भाषाओं के लिए बाइंडिंग उपलब्ध हैं (#Language बाइंडिंग देखें)।
जबकि विनिर्देश एक सी और फोरट्रान इंटरफ़ेस को अनिवार्य करते हैं, एमपीआई को प्रयुक्त करने के लिए इस्तेमाल की जाने वाली भाषा रनटाइम पर समर्थन करने वाली भाषा या भाषाओं से मेल खाने के लिए बाध्य नहीं है। अधिकांश कार्यान्वयन सी, सी ++ और असेंबली भाषा को जोड़ते हैं, और सी, सी ++ और फोरट्रान प्रोग्रामर को लक्षित करते हैं। पर्ल, पायथन, आर, रूबी, जावा और [[नियंत्रण भाषा]] सहित कई अन्य भाषाओं के लिए बाइंडिंग उपलब्ध हैं (#भाषा बाइंडिंग देखें)।


MPI कार्यान्वयन के [[अनुप्रयोग बाइनरी इंटरफ़ेस]] मोटे तौर पर MPICH और Open MPI डेरिवेटिव के बीच विभाजित होते हैं, ताकि परिवार से पुस्तकालय एक ही परिवार से एक के ड्रॉप-इन प्रतिस्थापन के रूप में काम करे, लेकिन परिवारों में प्रत्यक्ष प्रतिस्थापन असंभव है। फ्रांसीसी [[फ्रेंच वैकल्पिक ऊर्जा और परमाणु ऊर्जा आयोग]] ऐसे स्विच की सुविधा के लिए आवरण इंटरफ़ेस रखता है।<ref>{{cite web |author1=cea-hpc |title=cea-hpc/wi4mpi: Wrapper interface for MPI |url=https://github.com/cea-hpc/wi4mpi |website=GitHub |language=en}}</ref>
एमपीआई कार्यान्वयन के [[अनुप्रयोग बाइनरी इंटरफ़ेस]] मोटे तौर पर एमपीआईसीएच और Open एमपीआई डेरिवेटिव के बीच विभाजित होते हैं, जिससे परिवार से पुस्तकालय एक ही परिवार से एक के ड्रॉप-इन प्रतिस्थापन के रूप में काम करे, लेकिन परिवारों में प्रत्यक्ष प्रतिस्थापन असंभव है। फ्रांसीसी [[फ्रेंच वैकल्पिक ऊर्जा और परमाणु ऊर्जा आयोग]] ऐसे स्विच की सुविधा के लिए आवरण इंटरफ़ेस रखता है।<ref>{{cite web |author1=cea-hpc |title=cea-hpc/wi4mpi: Wrapper interface for MPI |url=https://github.com/cea-hpc/wi4mpi |website=GitHub |language=en}}</ref>




=== हार्डवेयर ===
=== हार्डवेयर ===
एमपीआई हार्डवेयर अनुसंधान एमपीआई को सीधे हार्डवेयर में लागू करने पर ध्यान केंद्रित करता है, उदाहरण के लिए [[प्रोसेसर-इन-मेमोरी]] के माध्यम से, प्रत्येक नोड में [[रैंडम एक्सेस मेमोरी]] चिप्स के माइक्रोक्रिकिट्री में एमपीआई संचालन का निर्माण। निहितार्थ से, यह दृष्टिकोण भाषा, ऑपरेटिंग सिस्टम और सीपीयू से स्वतंत्र है, लेकिन इसे आसानी से अपडेट या हटाया नहीं जा सकता है।
एमपीआई हार्डवेयर अनुसंधान एमपीआई को सीधे हार्डवेयर में प्रयुक्त करने पर ध्यान केंद्रित करता है, उदाहरण के लिए [[प्रोसेसर-इन-मेमोरी]] के माध्यम से, प्रत्येक नोड में [[रैंडम एक्सेस मेमोरी]] चिप्स के माइक्रोक्रिकिट्री में एमपीआई संचालन का निर्माण। निहितार्थ से, यह दृष्टिकोण भाषा, ऑपरेटिंग प्रणाली और सीपीयू से स्वतंत्र है, लेकिन इसे आसानी से अपडेट या हटाया नहीं जा सकता है।


ऑपरेशन के एक या एक से अधिक भागों में हार्डवेयर त्वरण जोड़ने के लिए एक अन्य दृष्टिकोण रहा है, जिसमें एमपीआई कतारों के हार्डवेयर प्रसंस्करण और सीपीयू या ओएस कर्नेल हस्तक्षेप के बिना मेमोरी और [[नेटवर्क इंटरफ़ेस नियंत्रक]] के बीच डेटा को सीधे स्थानांतरित करने के लिए [[रिमोट डायरेक्ट मेमोरी एक्सेस]] का उपयोग करना शामिल है।
संचालन के एक या एक से अधिक भागों में हार्डवेयर त्वरण जोड़ने के लिए एक अन्य दृष्टिकोण रहा है, जिसमें एमपीआई कतारों के हार्डवेयर प्रसंस्करण और सीपीयू या ओएस कर्नेल हस्तक्षेप के बिना मेमोरी और [[नेटवर्क इंटरफ़ेस नियंत्रक]] के बीच डेटा को सीधे स्थानांतरित करने के लिए [[रिमोट डायरेक्ट मेमोरी एक्सेस]] का उपयोग करना सम्मिलित है।


=== कंपाइलर रैपर ===
=== कंपाइलर रैपर ===
mpicc (और इसी तरह mpic++, mpif90, आदि) प्रोग्राम है जो MPI का उपयोग करने वाले कोड को संकलित करते समय आवश्यक कमांड-लाइन फ़्लैग सेट करने के लिए मौजूदा कंपाइलर पर लपेटता है। आम तौर पर, यह कुछ झंडे जोड़ता है जो कोड को संकलित करने और एमपीआई लाइब्रेरी के खिलाफ लिंक करने में सक्षम बनाता है।<ref>[http://www.mpich.org/static/docs/latest/www1/mpicc.html mpicc]. Mpich.org. Retrieved on 2014-03-24.</ref>
mpicc (और इसी तरह mpic++, mpif90, आदि) प्रोग्राम है जो एमपीआई का उपयोग करने वाले कोड को संकलित करते समय आवश्यक कमांड-लाइन फ़्लैग सेट करने के लिए वर्तमान कंपाइलर पर लपेटता है। सामान्यतः, यह कुछ झंडे जोड़ता है जो कोड को संकलित करने और एमपीआई पुस्तकालय के विरुद्ध लिंक करने में सक्षम बनाता है।<ref>[http://www.mpich.org/static/docs/latest/www1/mpicc.html mpicc]. Mpich.org. Retrieved on 2014-03-24.</ref>




== [[भाषा बंधन]] ==
== [[भाषा बंधन]] ==
भाषा बाध्यकारी पुस्तकालय हैं जो एमपीआईसी या ओपन एमपीआई जैसे मौजूदा एमपीआई कार्यान्वयन को लपेटकर एमपीआई समर्थन को अन्य भाषाओं में विस्तारित करते हैं।
भाषा बाध्यकारी पुस्तकालय हैं जो एमपीआईसी या ओपन एमपीआई जैसे वर्तमान एमपीआई कार्यान्वयन को लपेटकर एमपीआई समर्थन को अन्य भाषाओं में विस्तारित करते हैं।


=== [[सामान्य भाषा अवसंरचना]] ===
=== [[सामान्य भाषा अवसंरचना]] ===
दो प्रबंधित कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर .NET Framework|.NET कार्यान्वयन शुद्ध Mpi.NET हैं<ref>
दो प्रबंधित सामान्य भाषा इन्फ्रास्ट्रक्चर .नेट कार्यान्वयन शुद्ध एमपीआई.नेट<ref>
[http://www.purempi.net Pure Mpi.NET]</ref> और एमपीआई.नेट,<ref>{{cite web|url=http://www.osl.iu.edu/research/mpi.net/|title=MPI.NET: High-Performance C# Library for Message Passing|website=www.osl.iu.edu}}</ref> [[बीएसडी]]-शैली लाइसेंस के तहत लाइसेंस प्राप्त [[इंडियाना विश्वविद्यालय]] में एक शोध प्रयास। यह [[मोनो (सॉफ्टवेयर)]] के साथ संगत है, और अंतर्निहित निम्न-विलंबता MPI नेटवर्क फैब्रिक्स का पूर्ण उपयोग कर सकता है।
[http://www.purempi.net Pure Mpi.NET]</ref> और एमपीआई.नेट हैं,<ref>{{cite web|url=http://www.osl.iu.edu/research/mpi.net/|title=MPI.NET: High-Performance C# Library for Message Passing|website=www.osl.iu.edu}}</ref> '''[[बीएसडी]]-शैली लाइसेंस के अनुसार लाइसेंस प्राप्त''' [[इंडियाना विश्वविद्यालय]] में एक शोध प्रयास है जिसे [[बीएसडी]]-शैली लाइसेंस के अनुसार लाइसेंस दिया गया है। यह [[मोनो (सॉफ्टवेयर)]] के साथ संगत है, और अंतर्निहित निम्न-विलंबता एमपीआई नेटवर्क फैब्रिक्स का पूर्ण उपयोग कर सकता है।


=== जावा ===
=== जावा ===
'''हालांकि''' जावा (प्रोग्रामिंग भाषा) में आधिकारिक एमपीआई बाध्यकारी नहीं है, कई समूह सफलता और अनुकूलता के विभिन्न स्तरों के साथ दोनों को पाटने का प्रयास करते हैं। पहले प्रयासों में से एक था ब्रायन कारपेंटर का mpiJava,<ref>{{cite web|url=http://www.hpjava.org/mpiJava.html|title=mpiJava Home Page|website=www.hpjava.org}}</ref> अनिवार्य रूप से स्थानीय सी एमपीआई लाइब्रेरी के लिए [[जावा मूल इंटरफ़ेस]] (जेएनआई) रैपर का सेट, जिसके परिणामस्वरूप सीमित पोर्टेबिलिटी के साथ हाइब्रिड कार्यान्वयन होता है, जिसे उपयोग की जा रही विशिष्ट एमपीआई लाइब्रेरी के '''खिलाफ''' भी संकलित किया जाना है।
चूंकि जावा (प्रोग्रामिंग भाषा) में आधिकारिक एमपीआई बाध्यकारी नहीं है, कई समूह सफलता और अनुकूलता के विभिन्न स्तरों के साथ दोनों को पाटने का प्रयास करते हैं। पहले प्रयासों में से ब्रायन कारपेंटर का एमपीआईजावा एक था ,<ref>{{cite web|url=http://www.hpjava.org/mpiJava.html|title=mpiJava Home Page|website=www.hpjava.org}}</ref> अनिवार्य रूप से स्थानीय C एमपीआई पुस्तकालय के लिए [[जावा मूल इंटरफ़ेस]] (जेएनआई) रैपर का सेट, जिसके परिणामस्वरूप सीमित पोर्टेबिलिटी के साथ हाइब्रिड कार्यान्वयन होता है, जिसे उपयोग की जा रही विशिष्ट एमपीआई पुस्तकालय के विरुद्ध भी संकलित किया जाना है।


'''हालाँकि''', इस मूल परियोजना ने mpiJava API को भी परिभाषित किया<ref>{{cite web|url=http://www.hpjava.org/theses/shko/thesis_paper/node33.html|title=Introduction to the mpiJava API|website=www.hpjava.org}}</ref> (जावा के लिए वास्तविक एमपीआई [[एपीआई]] जो समतुल्य सी ++ बाइंडिंग का बारीकी से पालन करता है) जिसे अन्य बाद के जावा एमपीआई परियोजनाओं ने अपनाया। एक कम उपयोग किया जाने वाला एपीआई एमपीजे एपीआई है, जिसे अधिक [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] और [[सन माइक्रोसिस्टम्स]] के कोडिंग सम्मेलनों के '''करीब''' होने के लिए डिज़ाइन किया गया था।<ref>{{cite web|url=http://www.hpjava.org/papers/MPJ-CPE/cpempi/node6.html|title=The MPJ API Specification|website=www.hpjava.org}}</ref> एपीआई से परे, जावा एमपीआई पुस्तकालय या तो स्थानीय एमपीआई पुस्तकालय पर निर्भर हो सकते हैं, या जावा में संदेश पासिंग '''फ़ंक्शन''' को '''लागू''' कर सकते हैं, जबकि कुछ पी 2 [[P2P-एमपीआई]] भी [[पीयर टू पीयर]] कार्यक्षमता प्रदान करते हैं और मिश्रित-प्लेटफ़ॉर्म ऑपरेशन की अनुमति देते हैं।
चूँकि, इस मूल परियोजना ने एमपीआईजावा एपीआई (जावा के लिए वास्तविक एमपीआई [[एपीआई]] जो समतुल्य सी ++ बाइंडिंग का बारीकी से पालन करता है) को भी परिभाषित किया,<ref>{{cite web|url=http://www.hpjava.org/theses/shko/thesis_paper/node33.html|title=Introduction to the mpiJava API|website=www.hpjava.org}}</ref> जिसे बाद की अन्य जावा एमपीआई परियोजनाओं ने अपनाया है। एक कम उपयोग किया जाने वाला एपीआई एमपीजे एपीआई है, जिसे अधिक [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] और [[सन माइक्रोसिस्टम्स|सन माइक्रोप्रणाली]] के कोडिंग सम्मेलनों के निकट होने के लिए डिज़ाइन किया गया था।<ref>{{cite web|url=http://www.hpjava.org/papers/MPJ-CPE/cpempi/node6.html|title=The MPJ API Specification|website=www.hpjava.org}}</ref> एपीआई से परे, जावा एमपीआई पुस्तकालय या तो स्थानीय एमपीआई पुस्तकालय पर निर्भर हो सकते हैं, या जावा में संदेश पासिंग फलन को प्रयुक्त कर सकते हैं, जबकि कुछ [[P2P-एमपीआई|पी2पी-एमपीआई]] भी [[पीयर टू पीयर|सहकर्मी से सहकर्मी]] कार्यक्षमता प्रदान करते हैं और मिश्रित-प्लेटफ़ॉर्म संचालन की अनुमति देते हैं।


जावा/एमपीआई के कुछ सबसे चुनौतीपूर्ण हिस्से जावा विशेषताओं से उत्पन्न होते हैं जैसे स्पष्ट डेटा पॉइंटर की कमी और इसकी वस्तुओं के लिए [[फ्लैट मेमोरी मॉडल]] एड्रेस स्पेस, जो बहुआयामी सरणियों और जटिल वस्तुओं को अक्षम बनाता है। वर्कअराउंड में '''आमतौर पर''' एक समय में एक पंक्ति को स्थानांतरित करना और / या स्पष्ट डी-सीरियलाइज़ेशन और [[कास्ट (कंप्यूटर साइंस)]] दोनों भेजने और प्राप्त करने के अंत में, एक-आयामी सरणी, और पॉइंटर्स के उपयोग से सी या फोरट्रान-जैसे सरणियों का अनुकरण करना '''शामिल''' है। एकल-तत्व सरणियों के उपयोग से आदिम प्रकारों के लिए, इस प्रकार प्रोग्रामिंग शैलियों को जावा सम्मेलनों से काफी दूर कर दिया गया।
जावा/एमपीआई के कुछ सबसे चुनौतीपूर्ण हिस्से जावा विशेषताओं से उत्पन्न होते हैं जैसे स्पष्ट डेटा पॉइंटर की कमी और इसकी वस्तुओं के लिए [[फ्लैट मेमोरी मॉडल]] एड्रेस स्पेस, जो बहुआयामी सरणियों और जटिल वस्तुओं को अक्षम बनाता है। वैकल्पिक हल में सामान्यतः एक समय में एक पंक्ति को स्थानांतरित करना या स्पष्ट डी-सीरियलाइज़ेशन और [[कास्ट (कंप्यूटर साइंस)]] दोनों भेजने और प्राप्त करने के अंत में, एक-आयामी सरणी, और पॉइंटर्स के उपयोग से सी या फोरट्रान-जैसे सरणियों का अनुकरण करना सम्मिलित है। एकल-तत्व सरणियों के उपयोग से आदिम प्रकारों के लिए, इस प्रकार प्रोग्रामिंग शैलियों को जावा सम्मेलनों से अधिक दूर कर दिया गया।


एक अन्य जावा संदेश पासिंग '''सिस्टम''' एमपीजे एक्सप्रेस है।<ref>{{cite web|url=http://mpj-express.org/|title=MPJ Express Project|website=mpj-express.org}}</ref> हाल के संस्करणों को क्लस्टर और मल्टीकोर कॉन्फ़िगरेशन में निष्पादित किया जा सकता है। क्लस्टर कॉन्फ़िगरेशन में, यह क्लस्टर और बादलों पर समांतर जावा अनुप्रयोगों को निष्पादित कर सकता है। यहाँ जावा सॉकेट्स या विशेष I/O इंटरकनेक्ट जैसे [[Myrinet]] MPJ एक्सप्रेस प्रक्रियाओं के बीच संदेश भेजने का समर्थन कर सकते हैं। यह अपने मूल डिवाइस का उपयोग करके एमपीआई के मूल सी कार्यान्वयन का भी उपयोग कर सकता है। मल्टीकोर कॉन्फ़िगरेशन में, समानांतर जावा एप्लिकेशन को मल्टीकोर प्रोसेसर पर निष्पादित किया जाता है। इस मोड में, एमपीजे एक्सप्रेस प्रक्रियाओं को जावा थ्रेड्स द्वारा दर्शाया जाता है।
एक अन्य जावा संदेश पासिंग प्रणाली एमपीजे एक्सप्रेस है।<ref>{{cite web|url=http://mpj-express.org/|title=MPJ Express Project|website=mpj-express.org}}</ref> हाल के संस्करणों को क्लस्टर और बहुकोर विन्यास में निष्पादित किया जा सकता है। क्लस्टर विन्यास में, यह क्लस्टर और क्लाउड पर समांतर जावा अनुप्रयोगों को निष्पादित कर सकता है। यहाँ जावा सॉकेट्स या विशेष आई/इंटरकनेक्ट जैसे [[Myrinet|मायरिनेट]] एमपीजे एक्सप्रेस प्रक्रियाओं के बीच संदेश भेजने का समर्थन कर सकते हैं। यह अपने मूल उपकरण का उपयोग करके एमपीआई के मूल सी कार्यान्वयन का भी उपयोग कर सकता है। बहुकोर विन्यास में, समानांतर जावा अनुप्रयोग को बहुकोर प्रोसेसर पर निष्पादित किया जाता है। इस मोड में, एमपीजे एक्सप्रेस प्रक्रियाओं को जावा थ्रेड द्वारा दर्शाया जाता है।


=== जूलिया ===
=== जूलिया ===
MPI के लिए जूलिया (प्रोग्रामिंग लैंग्वेज) '''लैंग्वेज''' रैपर है।<ref>{{Citation|title=JuliaParallel/MPI.jl|date=2019-10-03|url=https://github.com/JuliaParallel/MPI.jl|publisher=Parallel Julia|access-date=2019-10-08}}</ref>
एमपीआई के लिए जूलिया (प्रोग्रामिंग भाषा) भाषा रैपर है।<ref>{{Citation|title=JuliaParallel/MPI.jl|date=2019-10-03|url=https://github.com/JuliaParallel/MPI.jl|publisher=Parallel Julia|access-date=2019-10-08}}</ref>




=== [[MATLAB]] ===
=== [[MATLAB|मैटलैब]] ===
MATLAB का उपयोग करके MPI के कुछ अकादमिक कार्यान्वयन हैं। MATLAB की अपनी समानांतर एक्सटेंशन लाइब्रेरी है जिसे MPI और समानांतर वर्चुअल मशीन का उपयोग करके लागू किया गया है।
मैटलैब का उपयोग करके एमपीआई के कुछ अकादमिक कार्यान्वयन हैं। मैटलैब की अपनी समानांतर विस्तार पुस्तकालय है जिसे एमपीआई और समानांतर वर्चुअल मशीन का उपयोग करके प्रयुक्त किया गया है।


=== ओकैमल ===
=== ओकैमल ===
OCamlMPI मॉड्यूल<ref>{{cite web|url=http://cristal.inria.fr/~xleroy/software.html#ocamlmpi|title=Xavier Leroy - Software|website=cristal.inria.fr}}</ref> एमपीआई कार्यों का बड़ा सबसेट लागू करता है और वैज्ञानिक कंप्यूटिंग में सक्रिय उपयोग में है। 11,000-लाइन [[OCaml]] प्रोग्राम मॉड्यूल का उपयोग करके एमपीआई-इफीड था, कोड की अतिरिक्त 500 लाइनों और मामूली पुनर्गठन के साथ और सुपरकंप्यूटर में 170 नोड्स तक उत्कृष्ट परिणाम के साथ चला।<ref>[http://caml.inria.fr/pub/ml-archives/caml-list/2003/07/155910c4eeb09e684f02ea4ae342873b.en.html Archives of the Caml mailing list > Message from Yaron M. Minsky]. Caml.inria.fr (2003-07-15). Retrieved on 2014-03-24.</ref>
ओकैमलएमपीआई मॉड्यूल<ref>{{cite web|url=http://cristal.inria.fr/~xleroy/software.html#ocamlmpi|title=Xavier Leroy - Software|website=cristal.inria.fr}}</ref> एमपीआई कार्यों का बड़ा सबसेट प्रयुक्त करता है और वैज्ञानिक कंप्यूटिंग में सक्रिय उपयोग में है। 11,000-लाइन [[OCaml|ओकैमल]] प्रोग्राम मॉड्यूल का उपयोग करके एमपीआई-इफीड था, कोड की अतिरिक्त 500 लाइनों और सामान्य पुनर्गठन के साथ और सुपरकंप्यूटर में 170 नोडों तक उत्कृष्ट परिणाम के साथ चला था।<ref>[http://caml.inria.fr/pub/ml-archives/caml-list/2003/07/155910c4eeb09e684f02ea4ae342873b.en.html Archives of the Caml mailing list > Message from Yaron M. Minsky]. Caml.inria.fr (2003-07-15). Retrieved on 2014-03-24.</ref>




===पारी/जीपी===
===पीएआरआई/जीपी===


पारी/जीपी बनाया जा सकता है<ref>{{cite web|url=https://pari.math.u-bordeaux.fr/pub/pari/manuals/2.13.3/parallel.pdf|title=Introduction to parallel GP|website=pari.math.u-bordeaux.fr}}</ref> MPI को अपने मल्टी-थ्रेड इंजन के रूप में उपयोग करने के लिए, MPI क्लस्टर पर समानांतर PARI और GP प्रोग्राम चलाने की अनुमति देता है।
पीएआरआई/जीपी को एमपीआई को अपने बहु-थ्रेड इंजन के रूप में उपयोग करने के लिए बनाया जा सकता है,<ref>{{cite web|url=https://pari.math.u-bordeaux.fr/pub/pari/manuals/2.13.3/parallel.pdf|title=Introduction to parallel GP|website=pari.math.u-bordeaux.fr}}</ref> जिससे एमपीआई क्लस्टर पर समानांतर पीएआरआई और जीपी प्रोग्राम चलाने की अनुमति मिलती है।


===पायथन===
===पायथन===
पायथन (प्रोग्रामिंग भाषा) में MPI कार्यान्वयन में शामिल हैं: [[pyMPI]], mpi4py,<ref>{{cite web|url=https://code.google.com/p/mpi4py/|title=Google Code Archive - Long-term storage for Google Code Project Hosting.|website=code.google.com}}</ref> पीपर,<ref>{{cite web|url=https://code.google.com/p/pypar/|title=Google Code Archive - Long-term storage for Google Code Project Hosting.|website=code.google.com}}</ref> एमआईएमपीआई,<ref>
पायथन (प्रोग्रामिंग भाषा) में एमपीआई कार्यान्वयन में [[pyMPI|पीआईएमपीआई]],<ref>{{cite web|url=https://code.google.com/p/mpi4py/|title=Google Code Archive - Long-term storage for Google Code Project Hosting.|website=code.google.com}}</ref> एमपीआई4पीवाई, पीपर,<ref>{{cite web|url=https://code.google.com/p/pypar/|title=Google Code Archive - Long-term storage for Google Code Project Hosting.|website=code.google.com}}</ref> एमआईएमपीआई,<ref>
Now part of [http://sourceforge.net/projects/pydusa/ Pydusa]</ref> और साइंटिफिकपायथन में एमपीआई सबमॉड्यूल। पीआईएमपीआई उल्लेखनीय है क्योंकि यह एक प्रकार का अजगर दुभाषिया है, जबकि पाइपर, एमवायएमपीआई और [[वैज्ञानिक अजगर]] के मॉड्यूल आयात मॉड्यूल हैं। वे यह तय करने के लिए कोडर का काम करते हैं कि कॉल कहां करें <code>MPI_Init</code> संबंधित है।
Now part of [http://sourceforge.net/projects/pydusa/ Pydusa]</ref> और साइंटिफिकपायथन में एमपीआई सबमॉड्यूल सम्मिलित हैं''': , mpi4py, पीपर, एमआईएमपीआई, और साइंटिफिकपायथन में एमपीआई सबमॉड्यूल'''। पीआईएमपीआई उल्लेखनीय है क्योंकि यह एक प्रकार का पायथन दुभाषिया है, जबकि पाइपर, एमवायएमपीआई और [[वैज्ञानिक अजगर|वैज्ञानिक पायथन]] के मॉड्यूल आयात मॉड्यूल हैं। वे यह तय करने के लिए कोडर का काम करते हैं कि <code>MPI_Init</code> को कॉल कहां करें।


2006 में<ref>{{cite web|url=https://www.boost.org/doc/libs/1_80_0/doc/html/mpi/history.html|title=Boost.MPI Revision History|website=www.boost.org}}</ref> [[सी ++ पुस्तकालयों को बढ़ावा दें]] ने बूस्ट:एमपीआई का अधिग्रहण किया जिसमें एमपीआई पायथन बाइंडिंग शामिल थी।<ref>{{cite web|url=http://www.boost.org/doc/libs/1_35_0/doc/html/mpi/python.html|title=Python Bindings - 1.35.0|website=www.boost.org}}</ref> यह C++ और Python को मिलाने के लिए विशेष रूप से मददगार है। {{As of|2016|10}} बूस्ट: MPI के पायथन बाइंडिंग में अभी भी [[CentOS]] में अनफिक्स पैकेजिंग बग हैं।<ref>{{cite web|url=https://bugs.centos.org/view.php?id=6498|title=0006498: Package boost-*mpi-python is missing python module - CentOS Bug Tracker|website=bugs.centos.org}}</ref>
2006 में<ref>{{cite web|url=https://www.boost.org/doc/libs/1_80_0/doc/html/mpi/history.html|title=Boost.MPI Revision History|website=www.boost.org}}</ref> बूस्ट [[सी ++ पुस्तकालयों को बढ़ावा दें|सी ++ पुस्तकालयों]] ने बूस्ट-एमपीआई का अधिग्रहण किया जिसमें एमपीआई पायथन बाइंडिंग सम्मिलित थी।<ref>{{cite web|url=http://www.boost.org/doc/libs/1_35_0/doc/html/mpi/python.html|title=Python Bindings - 1.35.0|website=www.boost.org}}</ref> यह सी++ और पायथन को मिलाने के लिए विशेष रूप से सहायक है। {{As of|2016|10}} बूस्ट: एमपीआई के पायथन बाइंडिंग में अभी भी [[CentOS|सेंटओएस]] में अनफिक्स पैकेजिंग बग हैं।<ref>{{cite web|url=https://bugs.centos.org/view.php?id=6498|title=0006498: Package boost-*mpi-python is missing python module - CentOS Bug Tracker|website=bugs.centos.org}}</ref>




===आर ===
===आर ===
MPI की R (प्रोग्रामिंग भाषा) बाइंडिंग में [[Rmpi]] ​​शामिल है<ref>{{cite journal |last=Yu |first=Hao |title=Rmpi: Parallel Statistical Computing in R |year=2002 |url=https://cran.r-project.org/package=Rmpi |journal=R News }}</ref> और [[आर में बिग डेटा के साथ प्रोग्रामिंग]],<ref>{{cite web |last1=Chen |first1=Wei-Chen |last2=Ostrouchov |first2=George |last3=Schmidt |first3=Drew |last4=Patel |first4=Pragneshkumar |last5=Yu |first5=Hao |title=pbdMPI: Programming with Big Data -- Interface to MPI |year=2012 |url=https://cran.r-project.org/package=pbdMPI }}</ref> जहां आरएमपीआई मास्टर/स्लेव (प्रौद्योगिकी) पर ध्यान केंद्रित करता है। प्रबंधक-श्रमिक समानता जबकि पीबीडीएमपीआई [[एसपीएमडी]] समानता पर केंद्रित है। दोनों कार्यान्वयन Open MPI या [[MPICH2]] का पूरी तरह से समर्थन करते हैं।
एमपीआई की आर (प्रोग्रामिंग भाषा) बाइंडिंग में [[Rmpi|आरएमपीआई]] ​​सम्मिलित है<ref>{{cite journal |last=Yu |first=Hao |title=Rmpi: Parallel Statistical Computing in R |year=2002 |url=https://cran.r-project.org/package=Rmpi |journal=R News }}</ref> और [[आर में बिग डेटा के साथ प्रोग्रामिंग]],<ref>{{cite web |last1=Chen |first1=Wei-Chen |last2=Ostrouchov |first2=George |last3=Schmidt |first3=Drew |last4=Patel |first4=Pragneshkumar |last5=Yu |first5=Hao |title=pbdMPI: Programming with Big Data -- Interface to MPI |year=2012 |url=https://cran.r-project.org/package=pbdMPI }}</ref> जहां आरएमपीआई मास्टर/स्लेव (प्रौद्योगिकी) पर ध्यान केंद्रित करता है। प्रबंधक-श्रमिक समानता जबकि पीबीडीएमपीआई [[एसपीएमडी]] समानता पर केंद्रित है। दोनों कार्यान्वयन खुले एमपीआई या [[MPICH2|एमपीआईसीएच2]] का पूरी तरह से समर्थन करते हैं।


== उदाहरण कार्यक्रम ==
== उदाहरण कार्यक्रम ==
यहाँ हैलो, विश्व है! MPI में प्रोग्राम C में लिखा गया है। इस उदाहरण में, हम प्रत्येक प्रोसेसर को हैलो संदेश भेजते हैं, इसे तुच्छ रूप से हेरफेर करते हैं, परिणाम को मुख्य प्रक्रिया में लौटाते हैं, और संदेशों को प्रिंट करते हैं।
यहाँ एमपीआई में "Hello, World!" प्रोग्राम सी में लिखा गया है। इस उदाहरण में, हम प्रत्येक प्रोसेसर को "Hello" संदेश भेजते हैं, इसे तुच्छ रूप से हेरफेर करते हैं, परिणाम को मुख्य प्रक्रिया में लौटाते हैं, और संदेशों को प्रिंट करते हैं।
  /*


<वाक्यविन्यास प्रकाश लैंग = सी>
  "Hello World" MPI Test Program
/*
*/
  हैलो वर्ल्ड एमपीआई टेस्ट प्रोग्राम
#include <assert.h>
*/
#include <stdio.h>
#शामिल <assert.h>
#include <string.h>
#शामिल <stdio.h>
#include <mpi.h>
#शामिल <string.h>
#शामिल <mpi.h>
int main(int argc, char **argv)
{
    char buf[256];
    int my_rank, num_procs;
    /* Initialize the infrastructure necessary for communication */
    MPI_Init(&argc, &argv);
    /* Identify this process */
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
    /* Find out how many total processes are active */
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
    /* Until this point, all programs have been doing exactly the same.
        Here, we check the rank to distinguish the roles of the programs */
    if (my_rank == 0) {
        int other_rank;
        printf("We have %i processes.\n", num_procs);
        /* Send messages to all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            sprintf(buf, "Hello %i!", other_rank);
            MPI_Send(buf, 256, MPI_CHAR, other_rank,
                      0, MPI_COMM_WORLD);
        }
        /* Receive messages from all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            MPI_Recv(buf, 256, MPI_CHAR, other_rank,
                      0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("%s\n", buf);
        }
    } else {
        /* Receive message from process #0 */
        MPI_Recv(buf, 256, MPI_CHAR, 0,
                  0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        assert(memcmp(buf, "Hello ", 6) == 0);
        /* Send message to process #0 */
        sprintf(buf, "Process %i reporting for duty.", my_rank);
        MPI_Send(buf, 256, MPI_CHAR, 0,
                  0, MPI_COMM_WORLD);
    }
    /* Tear down the communication infrastructure */
    MPI_Finalize();
    return 0;
*'''/'''
#'''सम्मिलित <assert.h>'''
#'''सम्मिलित <stdio.h>'''
#'''सम्मिलित <string.h>'''
#'''सम्मिलित <mpi.h>'''


इंट मेन (इंट एआरजीसी, चार ** एआरजीवी)
'''इंट मेन (इंट एआरजीसी, चार ** एआरजीवी)
{
{'''
     चार बुफ [256];
     '''चार बुफ [256];
     int my_rank, num_procs;
     int my_rank, num_procs;'''


     /* संचार के लिए आवश्यक बुनियादी ढाँचे को प्रारंभ करें */
     '''/* संचार के लिए आवश्यक बुनियादी ढाँचे को प्रारंभ करें */
     MPI_Init(&argc, &argv);
     MPI_Init(&argc, &argv);'''


     /* इस प्रक्रिया को पहचानें */
     '''/* इस प्रक्रिया को पहचानें */
     MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
     MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);'''


     / * पता करें कि कुल कितनी प्रक्रियाएँ सक्रिय हैं * /
     '''/ * पता करें कि कुल कितनी प्रक्रियाएँ सक्रिय हैं * /
     MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
     MPI_Comm_size(MPI_COMM_WORLD, &num_procs);'''


     /* इस बिंदु तक, सभी प्रोग्राम ठीक वैसा ही करते रहे हैं।
     '''/* इस बिंदु तक, सभी प्रोग्राम ठीक वैसा ही करते रहे हैं।
       यहां, हम प्रोग्राम की भूमिकाओं में अंतर करने के लिए रैंक की जांच करते हैं */
       यहां, हम प्रोग्राम की भूमिकाओं में अंतर करने के लिए रैंक की जांच करते हैं */
     अगर (my_rank == 0) {
     अगर (my_rank == 0) {
         int अन्य रैंक;
         int अन्य रैंक;
         प्रिंटफ (हमारे पास% i प्रक्रियाएं हैं। \ n, num_procs);
         प्रिंटफ (हमारे पास% i प्रक्रियाएं हैं। \ n, num_procs);'''


         /* अन्य सभी प्रक्रियाओं को संदेश भेजें */
         '''/* अन्य सभी प्रक्रियाओं को संदेश भेजें */
         के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++)
         के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++)
         {
         {
Line 244: Line 328:
             MPI_Send (buf, 256, MPI_CHAR, अन्य_रैंक,
             MPI_Send (buf, 256, MPI_CHAR, अन्य_रैंक,
                     0, MPI_COMM_WORLD);
                     0, MPI_COMM_WORLD);
         }
         }'''


         /* अन्य सभी प्रक्रियाओं से संदेश प्राप्त करें */
         '''/* अन्य सभी प्रक्रियाओं से संदेश प्राप्त करें */
         के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++)
         के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++)
         {
         {
Line 252: Line 336:
                     0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
                     0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
             प्रिंटफ (% s \ n, बीयूएफ);
             प्रिंटफ (% s \ n, बीयूएफ);
         }
         }'''


     } अन्य {
     '''} अन्य {'''


         /* प्रक्रिया #0 से संदेश प्राप्त करें */
         '''/* प्रक्रिया #0 से संदेश प्राप्त करें */
         MPI_Recv(buf, 256, MPI_CHAR, 0,
         MPI_Recv(buf, 256, MPI_CHAR, 0,
                 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
                 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
         जोर दें (memcmp (buf, हैलो, 6) == 0);
         जोर दें (memcmp (buf, हैलो, 6) == 0);'''


         /* प्रोसेस करने के लिए संदेश भेजें #0 */
         '''/* प्रोसेस करने के लिए संदेश भेजें #0 */
         sprintf(buf, ड्यूटी के लिए %i रिपोर्टिंग प्रोसेस करें। , my_rank);
         sprintf(buf, ड्यूटी के लिए %i रिपोर्टिंग प्रोसेस करें। , my_rank);
         MPI_Send(buf, 256, MPI_CHAR, 0,
         MPI_Send(buf, 256, MPI_CHAR, 0,
                 0, MPI_COMM_WORLD);
                 0, MPI_COMM_WORLD);'''


     }
     '''}'''


     /* कम्युनिकेशन इंफ्रास्ट्रक्चर को खत्म करें */
     '''/* संचार इंफ्रास्ट्रक्चर को खत्म करें */
     MPI_Finalize ();
     MPI_Finalize ();
     वापसी 0;
     वापसी 0;'''
}
'''}'''
</वाक्यविन्यास हाइलाइट>
 
'''</वाक्यविन्यास हाइलाइट>'''


जब 4 प्रक्रियाओं के साथ चलाया जाता है, तो इसे निम्न आउटपुट का उत्पादन करना चाहिए:<ref>The output snippet was produced on an ordinary Linux desktop system with Open MPI installed. [[Linux distribution|Distro]]s usually place the mpicc command into an openmpi-devel or libopenmpi-dev package, and sometimes make it necessary to run "module add mpi/openmpi-x86_64" or similar before mpicc and mpiexec are available.</ref>
जब 4 प्रक्रियाओं के साथ चलाया जाता है, तो इसे निम्न आउटपुट का उत्पादन करना चाहिए:<ref>The output snippet was produced on an ordinary Linux desktop system with Open MPI installed. [[Linux distribution|Distro]]s usually place the mpicc command into an openmpi-devel or libopenmpi-dev package, and sometimes make it necessary to run "module add mpi/openmpi-x86_64" or similar before mpicc and mpiexec are available.</ref>
<पूर्व>
$ mpicc example.c && mpiexec -n 4 ./a.out
हमारे पास 4 प्रक्रियाएँ हैं।
प्रक्रिया 1 ड्यूटी के लिए रिपोर्टिंग।
प्रक्रिया 2 ड्यूटी के लिए रिपोर्टिंग।
प्रक्रिया 3 ड्यूटी के लिए रिपोर्टिंग।
</पूर्व>
यहाँ, <code>mpiexec</code> कमांड है जिसका उपयोग 4 प्रक्रियाओं (कंप्यूटिंग) के साथ उदाहरण कार्यक्रम को निष्पादित करने के लिए किया जाता है, जिनमें से प्रत्येक रन टाइम पर प्रोग्राम का स्वतंत्र उदाहरण है और निर्दिष्ट रैंक (यानी संख्यात्मक आईडी) 0, 1, 2 और 3 है। नाम <code>mpiexec</code> एमपीआई मानक द्वारा अनुशंसित है, हालांकि कुछ कार्यान्वयन नाम के तहत एक समान आदेश प्रदान करते हैं <code>mpirun</code>. <code>MPI_COMM_WORLD</code> e> कम्युनिकेटर है जिसमें सभी प्रक्रियाएं शामिल हैं।


इस प्रकार एकल कार्यक्रम, एकाधिक डेटा (एसपीएमडी) प्रोग्रामिंग मॉडल को सुगम बनाया गया है, लेकिन इसकी आवश्यकता नहीं है; कई एमपीआई कार्यान्वयन एक ही एमपीआई नौकरी में एकाधिक, अलग-अलग निष्पादन योग्य शुरू करने की अनुमति देते हैं। प्रत्येक प्रक्रिया की अपनी रैंक होती है, दुनिया में प्रक्रियाओं की कुल संख्या, और उनके बीच संचार करने की क्षमता बिंदु से बिंदु (भेजें / प्राप्त करें) संचार, या समूह के बीच सामूहिक संचार द्वारा। एमपीआई के लिए एसपीएमडी-शैली कार्यक्रम प्रदान करना पर्याप्त है <code>MPI_COMM_WORLD</code>, इसकी अपनी रैंक, और दुनिया का आकार कलनविधि को यह तय करने की अनुमति देता है कि क्या करना है। अधिक यथार्थवादी स्थितियों में, I/O को इस उदाहरण की तुलना में अधिक सावधानी से प्रबंधित किया जाता है। MPI यह निर्धारित नहीं करता है कि किसी दिए गए सिस्टम पर मानक I/O (stdin, stdout, stderr) को कैसे काम करना चाहिए। यह आम तौर पर रैंक-0 प्रक्रिया पर उम्मीद के मुताबिक काम करता है, और कुछ कार्यान्वयन अन्य प्रक्रियाओं से आउटपुट को कैप्चर और फ़नल भी करते हैं।
''$ mpicc example.c && mpiexec -n 4 ./a.out''
 
''We have 4 processes.''
 
''Process 1 reporting for duty.''
 
''Process 2 reporting for duty.''
 
''Process 3 reporting for duty.''
 
यहाँ, <code>mpiexec</code> 4 प्रक्रियाओं (कंप्यूटिंग) के साथ उदाहरण कार्यक्रम को निष्पादित करने के लिए उपयोग किया जाने वाला कमांड है, जिनमें से प्रत्येक रन टाइम पर प्रोग्राम का स्वतंत्र उदाहरण है और निर्दिष्ट रैंक (अर्थात संख्यात्मक आईडी) 0, 1, 2 और 3 है। एमपीआई मानक द्वारा <code>mpiexec</code> नाम अनुशंसित है, चूंकि कुछ कार्यान्वयन <code>mpirun</code> नाम के अनुसार एक समान आदेश प्रदान करते हैं। <code>MPI_COMM_WORLD</code> संचारक है जिसमें सभी प्रक्रियाएं सम्मिलित हैं।
 
इस प्रकार एकल कार्यक्रम, एकाधिक डेटा (एसपीएमडी) प्रोग्रामिंग मॉडल को सुगम बनाया गया है, लेकिन इसकी आवश्यकता नहीं है; कई एमपीआई कार्यान्वयन एक ही एमपीआई नौकरी में एकाधिक, अलग-अलग निष्पादन योग्य प्रारंभ करने की अनुमति देते हैं। प्रत्येक प्रक्रिया की अपनी रैंक होती है, विश्व में प्रक्रियाओं की कुल संख्या, और उनके बीच संचार करने की क्षमता बिंदु से बिंदु (भेजें / प्राप्त करें) संचार, या समूह के बीच सामूहिक संचार द्वारा होती है। एमपीआई के लिए <code>MPI_COMM_WORLD</code> अपनी रैंक, और विश्व के आकार के साथ एसपीएमडी-शैली कार्यक्रम प्रदान करना पर्याप्त है, जिससे कलनविधि को यह तय करने की अनुमति मिल सके कि क्या करना है। अधिक यथार्थवादी स्थितियों में, आई/को इस उदाहरण की तुलना में अधिक सावधानी से प्रबंधित किया जाता है। एमपीआई यह निर्धारित नहीं करता है कि किसी दिए गए प्रणाली पर मानक आई/(स्टडिन, स्टडआउट, स्टेडर) को कैसे काम करना चाहिए। यह सामान्यतः रैंक-0 प्रक्रिया पर आशा के अनुसार काम करता है, और कुछ कार्यान्वयन अन्य प्रक्रियाओं से आउटपुट को कैप्चर और फ़नल भी करते हैं।


एमपीआई प्रोसेसर के बजाय प्रक्रिया की धारणा का उपयोग करता है। MPI [[रनटाइम सिस्टम|रनटाइम प्रणाली]] द्वारा प्रोग्राम कॉपी को प्रोसेसर से मैप किया जाता है। इस अर्थ में, समानांतर मशीन भौतिक प्रोसेसर या एन प्रोसेसर के लिए मैप कर सकती है, जहां एन उपलब्ध प्रोसेसर की संख्या है, या बीच में कुछ भी है। अधिकतम समांतर स्पीडअप के लिए, अधिक भौतिक प्रोसेसर का उपयोग किया जाता है। यह उदाहरण विश्व एन के आकार के लिए अपने व्यवहार को समायोजित करता है, इसलिए यह प्रत्येक आकार भिन्नता के संकलन के बिना रनटाइम कॉन्फ़िगरेशन को स्केल करने का भी प्रयास करता है, हालांकि रनटाइम के निर्णय उपलब्ध संगामिति की पूर्ण मात्रा के आधार पर भिन्न हो सकते हैं।
एमपीआई प्रोसेसर के अतिरिक्त प्रक्रिया की धारणा का उपयोग करता है। एमपीआई [[रनटाइम सिस्टम|रनटाइम प्रणाली]] द्वारा प्रोग्राम कॉपी को प्रोसेसर से मैप किया जाता है। इस अर्थ में, समानांतर मशीन भौतिक प्रोसेसर या n प्रोसेसर के लिए मैप कर सकती है, जहां n उपलब्ध प्रोसेसर की संख्या है, या बीच में कुछ भी है। अधिकतम समांतर स्पीडअप के लिए, अधिक भौतिक प्रोसेसर का उपयोग किया जाता है। यह उदाहरण विश्व n के आकार के लिए अपने व्यवहार को समायोजित करता है, इसलिए यह प्रत्येक आकार भिन्नता के संकलन के बिना रनटाइम विन्यास को स्केल करने का भी प्रयास करता है, चूंकि रनटाइम के निर्णय उपलब्ध संगामिति की पूर्ण मात्रा के आधार पर भिन्न हो सकते हैं।


==MPI-2 गोद लेने ==
==एमपीआई-2 गोद लेने ==
MPI-1.2 को अपनाना सार्वभौमिक रहा है, विशेष रूप से क्लस्टर कंप्यूटिंग में, लेकिन MPI-2.1 की स्वीकृति अधिक सीमित रही है। मुद्दों में शामिल हैं:
एमपीआई-1.2 को अपनाना सार्वभौमिक रहा है, विशेष रूप से क्लस्टर कंप्यूटिंग में, लेकिन एमपीआई-2.1 की स्वीकृति अधिक सीमित रही है। उद्देश्यों में सम्मिलित हैं:


# MPI-2 कार्यान्वयन में I/O और गतिशील प्रक्रिया प्रबंधन शामिल है, और मिडलवेयर का आकार काफी बड़ा है। अधिकांश साइटें जो बैच शेड्यूलिंग सिस्टम का उपयोग करती हैं, गतिशील प्रक्रिया प्रबंधन का समर्थन नहीं कर सकती हैं। MPI-2 का समानांतर I/O अच्छी तरह से स्वीकृत है।
# एमपीआई-2 कार्यान्वयन में आई/और गतिशील प्रक्रिया प्रबंधन सम्मिलित है, और मिडलवेयर का आकार अधिक बड़ा है। अधिकांश साइटें जो बैच समयबद्धन प्रणाली का उपयोग करती हैं, गतिशील प्रक्रिया प्रबंधन का समर्थन नहीं कर सकती हैं। एमपीआई-2 का समानांतर आई/अच्छी तरह से स्वीकृत है।
# MPI-2 से पहले कई MPI-1.2 प्रोग्राम विकसित किए गए थे। सुवाह्यता की चिंताओं ने शुरुआत में अपनाने को धीमा कर दिया, हालांकि व्यापक समर्थन ने इसे कम कर दिया है।
# एमपीआई-2 से पहले कई एमपीआई-1.2 प्रोग्राम विकसित किए गए थे। सुवाह्यता की चिंताओं ने प्रारंभ में अपनाने को धीमा कर दिया, चूंकि व्यापक समर्थन ने इसे कम कर दिया है।
# कई MPI-1.2 एप्लिकेशन उस मानक (16-25 फ़ंक्शंस) के केवल एक सबसेट का उपयोग करते हैं, जिसमें MPI-2 कार्यक्षमता की कोई वास्तविक आवश्यकता नहीं होती है।
# कई एमपीआई-1.2 अनुप्रयोग उस मानक (16-25 फलनों) के केवल एक सबसेट का उपयोग करते हैं, जिसमें एमपीआई-2 कार्यक्षमता की कोई वास्तविक आवश्यकता नहीं होती है।


== भविष्य ==
== भविष्य ==
MPI के भविष्य के कुछ पहलू ठोस दिखाई देते हैं; दूसरों को इतना कम। MPI फोरम ने कुछ MPI-2 मुद्दों को स्पष्ट करने और संभावित MPI-3 के विकास का पता लगाने के लिए 2007 में फिर से बैठक की, जिसके परिणामस्वरूप MPI-3.0 (सितंबर 2012) और MPI-3.1 (जून 2015) के संस्करण सामने आए।
एमपीआई के भविष्य के कुछ पहलू ठोस और दूसरों को इतना कम दिखाई देते हैं'''; दूसरों को इतना कम'''। एमपीआई फोरम ने कुछ एमपीआई-2 उद्देश्यों को स्पष्ट करने और संभावित एमपीआई-3 के विकास का पता लगाने के लिए 2007 में फिर से बैठक की, जिसके परिणामस्वरूप एमपीआई-3.0 (सितंबर 2012) और एमपीआई-3.1 (जून 2015) के संस्करण सामने आए थे।


आर्किटेक्चर बदल रहे हैं, अधिक आंतरिक संगामिति ([[मल्टी-कोर प्रोसेसर]] | मल्टी-कोर), बेहतर सूक्ष्म संगामिति नियंत्रण (थ्रेडिंग, एफ़िनिटी), और मेमोरी पदानुक्रम के अधिक स्तर। मल्टीथ्रेडिंग (कंप्यूटर आर्किटेक्चर) प्रोग्राम सिंगल-थ्रेडेड एप्लिकेशन की तुलना में इन विकासों का अधिक आसानी से लाभ उठा सकते हैं। यह पहले से ही [[सममित बहु प्रसंस्करण]], अर्थात् ओपनएमपी के लिए अलग, पूरक मानकों को प्राप्त कर चुका है। MPI-2 परिभाषित करता है कि मानक-अनुरूप कार्यान्वयन को बहुप्रचारित मुद्दों से कैसे निपटना चाहिए, लेकिन इसके लिए यह आवश्यक नहीं है कि कार्यान्वयन बहुप्रचारित या थ्रेड-सुरक्षित हो। MPI-3 नोड के भीतर साझा-स्मृति समानता का उपयोग करने की क्षमता जोड़ता है। एमपीआई के कार्यान्वयन जैसे अनुकूली एमपीआई, हाइब्रिड एमपीआई, फाइन-ग्रेन्ड एमपीआई, एमपीसी और अन्य एमपीआई मानक के विस्तार की पेशकश करते हैं जो एमपीआई में विभिन्न चुनौतियों का समाधान करते हैं।
अधिक आंतरिक संगामिति ([[मल्टी-कोर प्रोसेसर|बहु-कोर प्रोसेसर]]), उत्तम सूक्ष्म संगामिति नियंत्रण (थ्रेडिंग, एफ़िनिटी), और मेमोरी पदानुक्रम के अधिक स्तरों के साथ आर्किटेक्चर बदल रहे हैं। बहुथ्रेडिंग (कंप्यूटर आर्किटेक्चर) प्रोग्राम एकल-थ्रेडेड अनुप्रयोग की तुलना में इन विकासों का अधिक आसानी से लाभ उठा सकते हैं। यह पहले से ही [[सममित बहु प्रसंस्करण]], अर्थात् ओपनएमपी के लिए अलग, पूरक मानकों को प्राप्त कर चुका है। एमपीआई-2 परिभाषित करता है कि मानक-अनुरूप कार्यान्वयन को बहुप्रचारित उद्देश्यों से कैसे निपटना चाहिए, लेकिन इसके लिए यह आवश्यक नहीं है कि कार्यान्वयन बहुप्रचारित या थ्रेड-सुरक्षित हो। एमपीआई-3 नोड के अंदर साझा-स्मृति समानता का उपयोग करने की क्षमता जोड़ता है। एमपीआई के कार्यान्वयन जैसे अनुकूली एमपीआई, हाइब्रिड एमपीआई, फाइन-ग्रेन्ड एमपीआई, एमपीसी और अन्य एमपीआई मानक के विस्तार की प्रस्तुति करते हैं जो एमपीआई में विभिन्न चुनौतियों का समाधान करते हैं।


एस्ट्रोफिजिसिस्ट जोनाथन डर्सी ने [[एमपीआई फोरम]] अप्रचलित कहते हुए राय लिखी, जिसमें चैपल (प्रोग्रामिंग लैंग्वेज) लैंग्वेज, [[एकीकृत समानांतर सी]], [[अपाचे हडूप]], [[अपाचे स्पार्क]] और [[अपाचे फ्लैश]] जैसी नई तकनीकों की ओर इशारा किया गया।<ref>{{cite web|url=https://www.dursi.ca/post/hpc-is-dying-and-mpi-is-killing-it|title=HPC is dying, and MPI is killing it|website=www.dursi.ca}}</ref> इसी समय, [[एक्सास्केल कंप्यूटिंग]] में लगभग सभी परियोजनाएं एमपीआई पर स्पष्ट रूप से निर्मित होती हैं; MPI को 2020 की शुरुआत तक सबसे बड़ी मशीनों के पैमाने पर दिखाया गया है और आने वाले लंबे समय तक प्रासंगिक रहने के लिए व्यापक रूप से माना जाता है।
एस्ट्रोफिजिसिस्ट जोनाथन डर्सी ने [[एमपीआई फोरम]] को अप्रचलित कहते हुए विचार लिखी, जिसमें चैपल (प्रोग्रामिंग भाषा) भाषा, [[एकीकृत समानांतर सी]], [[अपाचे हडूप]], [[अपाचे स्पार्क]] और [[अपाचे फ्लैश]] जैसी नई विधियों की ओर संकेत किया गया।<ref>{{cite web|url=https://www.dursi.ca/post/hpc-is-dying-and-mpi-is-killing-it|title=HPC is dying, and MPI is killing it|website=www.dursi.ca}}</ref> इसी समय, [[एक्सास्केल कंप्यूटिंग]] में लगभग सभी परियोजनाएं एमपीआई पर स्पष्ट रूप से निर्मित होती हैं; एमपीआई को 2020 की प्रारंभ तक सबसे बड़ी मशीनों के पैमाने पर दिखाया गया है और आने वाले लंबे समय तक प्रासंगिक रहने के लिए व्यापक रूप से माना जाता है।


== यह भी देखें ==
== यह भी देखें ==
Line 313: Line 402:
* एमवापीच
* एमवापीच
* [[ओपनएचएमपीपी]]
* [[ओपनएचएमपीपी]]
* समानांतर वर्चुअल मशीन (PVM)
* समानांतर वर्चुअल मशीन (पीवीएम)
* [[विभाजित वैश्विक पता स्थान]]
* [[विभाजित वैश्विक पता स्थान]]
* एकीकृत समानांतर सी
* एकीकृत समानांतर सी
* [[X10 (प्रोग्रामिंग भाषा)]]
* [[एक्स10 (प्रोग्रामिंग भाषा)]]
{{div col end}}
{{div col end}}


Line 374: Line 463:
* [http://polaris.cs.uiuc.edu/~padua/cs320/mpi/tutorial.pdf Tutorial on MPI: The Message-Passing Interface]
* [http://polaris.cs.uiuc.edu/~padua/cs320/mpi/tutorial.pdf Tutorial on MPI: The Message-Passing Interface]
* [http://moss.csc.ncsu.edu/~mueller/cluster/mpi.guide.pdf A User's Guide to MPI]
* [http://moss.csc.ncsu.edu/~mueller/cluster/mpi.guide.pdf A User's Guide to MPI]
* [https://www.citutor.org/bounce.php?course=21 Tutorial: Introduction to MPI (self-paced, includes self-tests and exercises)]
* [https://www.citutor.org/bounce.php?course=21 Tutorial: Introduction to एमपीआई (self-paced, includes self-tests and exercises)]
{{Parallel computing|state=collapsed}}
{{Parallel computing|state=collapsed}}
[[Category: एप्लिकेशन प्रोग्रामिंग इंटरफेस]] [[Category: समानांतर कंप्यूटिंग]] [[Category: उदाहरण सी कोड वाले लेख]]  
[[Category: एप्लिकेशन प्रोग्रामिंग इंटरफेस]] [[Category: समानांतर कंप्यूटिंग]] [[Category: उदाहरण सी कोड वाले लेख]]  

Revision as of 13:25, 26 February 2023

संदेश पासिंग इंटरफ़ेस (एमपीआई) मानकीकृत और पोर्टेबल संदेश देना मानक है जिसे समानांतर कंप्यूटिंग कंप्यूटर आर्किटेक्चर पर कार्य करने के लिए डिज़ाइन किया गया है।[1] एमपीआई मानक सिंटैक्स (प्रोग्रामिंग भाषाएं) और पुस्तकालय दिनचर्या के शब्दार्थ को परिभाषित करता है जो C (प्रोग्रामिंग भाषा), C ++ और फोरट्रान में सॉफ्टवेयर पोर्टेबिलिटी मैसेज-पासिंग प्रोग्राम लिखने वाले उपयोगकर्ताओं की विस्तृत श्रृंखला के लिए उपयोगी है। कई खुला स्त्रोत एमपीआई प्रोग्रामिंग भाषा कार्यान्वयन हैं, जो समानांतर सॉफ्टवेयर उद्योग के विकास को बढ़ावा देते हैं, और पोर्टेबल और स्केलेबल बड़े पैमाने पर समानांतर अनुप्रयोगों के विकास को प्रोत्साहित करते हैं।

इतिहास

सन्देश देने का प्रयास 1991 की गर्मियों में प्रारंभ हुआ जब शोधकर्ताओं के छोटे समूह ने ऑस्ट्रिया में पर्वत वापसी पर चर्चा प्रारंभ की। उस चर्चा से विलियम्सबर्ग, वर्जीनिया में 29-30 अप्रैल, 1992 को आयोजित वितरित स्मृति पर्यावरण में संदेश पारित करने के मानकों पर कार्यशाला आई।[2] विलियम्सबर्ग में उपस्थित लोगों ने मानक संदेश देने वाले इंटरफ़ेस के लिए आवश्यक बुनियादी सुविधाओं पर चर्चा की और मानकीकरण प्रक्रिया को जारी रखने के लिए कार्यदल की स्थापना की। जैक डोंगरा, टोनी हे, और डेविड डब्ल्यू वॉकर ने नवंबर 1992 में प्रारंभिक मसौदा प्रस्ताव, एमपीआई1 प्रस्तुत किया। नवंबर 1992 में एमपीआई कार्यकारी समूह की बैठक मिनियापोलिस में हुई और मानकीकरण प्रक्रिया को अधिक औपचारिक स्तर पर रखने का निर्णय लिया गया। 1993 के पहले 9 महीनों में हर 6 सप्ताह में एमपीआई कार्यकारी समूह की बैठक हुई। एमपीआई मानक का मसौदा नवंबर 1993 में सुपरकंप्यूटिंग '93 सम्मेलन में प्रस्तुत किया गया था।[3] सार्वजनिक टिप्पणियों की अवधि के बाद, जिसके परिणामस्वरूप एमपीआई में कुछ बदलाव हुए, एमपीआई का संस्करण 1.0 जून 1994 में जारी किया गया। इन बैठकों और ईमेल चर्चा ने मिलकर एमपीआई फोरम का गठन किया, जिसकी सदस्यता उच्च के सभी सदस्यों के लिए खुली है- प्रदर्शन कंप्यूटिंग | उच्च-प्रदर्शन-कंप्यूटिंग समुदाय।

एमपीआई प्रयास में 40 संगठनों के लगभग 80 लोग सम्मिलित थे, मुख्य रूप से संयुक्त राज्य अमेरिका और यूरोप में। विश्वविद्यालयों, सरकारी प्रयोगशालाओं और निजी उद्योग के शोधकर्ताओं के सहयोग से समवर्ती कंप्यूटरों के अधिकांश प्रमुख विक्रेता एमपीआई प्रयास में सम्मिलित थे।

एमपीआई समानांतर हार्डवेयर विक्रेताओं को दिनचर्या के स्पष्ट रूप से परिभाषित आधार सेट प्रदान करता है जिसे कुशलतापूर्वक कार्यान्वित किया जा सकता है। परिणामस्वरुप, हार्डवेयर विक्रेता मानक निम्न-स्तरीय प्रोग्रामिंग भाषा के इस संग्रह पर निर्माण कर सकते हैं। उच्च-स्तरीय प्रोग्रामिंग भाषा बनाने के लिए निम्न-स्तरीय रूटीन। उनकी समानांतर मशीन के साथ वितरित-मेमोरी संचार वातावरण के लिए उच्च-स्तरीय रूटीन। एमपीआई मूल उपयोगकर्ता के लिए उपयोग में आसान पोर्टेबल इंटरफ़ेस प्रदान करता है, फिर भी प्रोग्रामर को उन्नत मशीनों पर उपलब्ध उच्च-प्रदर्शन संदेश पासिंग ऑपरेशंस का उपयोग करने की अनुमति देने के लिए पर्याप्त शक्तिशाली है।

संदेश भेजने के लिए सार्वभौमिक मानक बनाने के प्रयास में, शोधकर्ताओं ने इसे प्रणाली के आधार पर नहीं बनाया किंतु इसमें कई प्रणालियों की सबसे उपयोगी विशेषताओं को सम्मिलित किया, जिनमें IBM, Intel, nCUBE, पीवीएम, Express, P4 और PARMACS द्वारा डिज़ाइन किए गए सम्मिलित हैं। . व्यापक पोर्टेबिलिटी के कारण संदेश-पासिंग प्रतिमान आकर्षक है और वितरित-मेमोरी और साझा-मेमोरी बहुप्रोसेसर, वर्कस्टेशन के नेटवर्क और इन तत्वों के संयोजन के लिए संचार में उपयोग किया जा सकता है। प्रतिमान कई सेटिंग्स में प्रयुक्त हो सकता है, नेटवर्क गति या मेमोरी आर्किटेक्चर से स्वतंत्र।

एमपीआई बैठकों के लिए समर्थन आंशिक रूप से DARPA और यूएस राष्ट्रीय विज्ञान संस्था (NSF) से अनुदान ASC-9310330, NSF विज्ञान और प्रौद्योगिकी केंद्र सहकारी समझौते संख्या CCR-8809615, और यूरोपीय आयोग से Esprit Project P6643 के माध्यम से आया। टेनेसी विश्वविद्यालय ने भी एमपीआई फोरम में वित्तीय योगदान दिया।

सिंहावलोकन

एमपीआई प्रोग्रामिंग के लिए संचार प्रोटोकॉल है[4] समानांतर कंप्यूटर। पॉइंट-टू-पॉइंट और सामूहिक संचार दोनों समर्थित हैं। एमपीआई संदेश-पासिंग अनुप्रयोग प्रोग्रामर इंटरफ़ेस है, साथ में प्रोटोकॉल और सिमेंटिक विनिर्देशों के साथ किसी कार्यान्वयन में इसकी विशेषताओं को कैसे व्यवहार करना चाहिए।[5] एमपीआई के लक्ष्य उच्च प्रदर्शन, मापनीयता और सुवाह्यता हैं। एमपीआई आज भी उच्च-प्रदर्शन कंप्यूटिंग में उपयोग किया जाने वाला प्रमुख मॉडल बना हुआ है।[6] एमपीआई को किसी भी प्रमुख मानक निकाय द्वारा स्वीकृत नहीं किया गया है; फिर भी, यह उन प्रक्रियाओं के बीच संचार के लिए वास्तविक मानक बन गया है जो वितरित मेमोरी प्रणाली पर चल रहे समानांतर प्रोग्रामिंग को मॉडल करते हैं। वास्तविक वितरित मेमोरी सुपरकंप्यूटर जैसे कंप्यूटर क्लस्टर अधिकांशतः ऐसे प्रोग्राम चलाते हैं।

प्रमुख एमपीआई-1 मॉडल में कोई साझा मेमोरी अवधारणा नहीं है, और एमपीआई-2 में केवल सीमित वितरित साझा मेमोरी अवधारणा है। फिर भी, एमपीआई प्रोग्राम नियमित रूप से साझा मेमोरी कंप्यूटर पर चलाए जाते हैं, और एमपीआईसीएच और Open एमपीआई दोनों उपलब्ध होने पर संदेश हस्तांतरण के लिए साझा मेमोरी का उपयोग कर सकते हैं।[7][8] एमपीआई मॉडल के आसपास डिजाइनिंग कार्यक्रम (स्पष्ट साझा मेमोरी (इंटरप्रोसेस संचार) मॉडल के विपरीत) गैर-वर्दी मेमोरी एक्सेस आर्किटेक्चर पर चलते समय लाभ होता है क्योंकि एमपीआई संदर्भ के स्थानीयता को प्रोत्साहित करता है। एमपीआई-3 में स्पष्ट साझा मेमोरी प्रोग्रामिंग प्रस्तुत की गई थी।[9][10][11] चूँकि एमपीआई OSI संदर्भ मॉडल की 5 और उच्चतर परतों से संबंधित है, कार्यान्वयन में अधिकांश परतें सम्मिलित हो सकती हैं, जिसमें इंटरनेट सॉकेट और प्रसारण नियंत्रण प्रोटोकॉल (TCP) का उपयोग ट्रांसपोर्ट लेयर में किया जाता है।

अधिकांश एमपीआई कार्यान्वयन में सी (प्रोग्रामिंग भाषा), सी ++, फोरट्रान (अर्थात, एपीआई) से सीधे कॉल करने योग्य दिनचर्या का विशिष्ट सेट होता है और सी शार्प (प्रोग्रामिंग भाषा) सहित ऐसी पुस्तकालयों के साथ इंटरफेस करने में सक्षम कोई भी भाषा सम्मिलित है। सी#, जावा (प्रोग्रामिंग भाषा) भाषा) या पायथन (प्रोग्रामिंग भाषा)। पुराने संदेश पासिंग पुस्तकालयों पर एमपीआई के लाभ पोर्टेबिलिटी हैं (क्योंकि एमपीआई लगभग हर वितरित मेमोरी आर्किटेक्चर के लिए कार्यान्वित किया गया है) और गति (क्योंकि प्रत्येक कार्यान्वयन हार्डवेयर के लिए सिद्धांत रूप से अनुकूलित है जिस पर यह चलता है)।

एमपीआई कॉल और भाषा बाइंडिंग के लिए भाषा स्वतंत्र विशिष्टता (एलआईएस) का उपयोग करता है। पहले एमपीआई मानक ने ANSI C और फोरट्रान-77 बाइंडिंग को LIS के साथ निर्दिष्ट किया। मसौदा सुपरकंप्यूटिंग 1994 (नवंबर 1994) में प्रस्तुत किया गया था[12] और उसके तुरंत बाद अंतिम रूप दिया। लगभग 128 कार्य एमपीआई-1.3 मानक का गठन करते हैं जो 2008 में एमपीआई-1 श्रृंखला के अंतिम अंत के रूप में जारी किया गया था।[13]

वर्तमान में, मानक के कई संस्करण हैं: संस्करण 1.3 (सामान्यतः संक्षिप्त एमपीआई-1), जो संदेश पारित करने पर जोर देता है और स्थिर रनटाइम वातावरण, एमपीआई-2.2 (एमपीआई-2) है, जिसमें समानांतर आई/ओ जैसी नई सुविधाएँ सम्मिलित हैं, गतिशील प्रक्रिया प्रबंधन और दूरस्थ स्मृति संचालन,[14] और एमपीआई-3.1 (एमपीआई-3), जिसमें गैर-अवरुद्ध संस्करणों के साथ सामूहिक संचालन के विस्तार और एकतरफा संचालन के विस्तार सम्मिलित हैं।[15]

एमपीआई-2 का LIS 500 से अधिक कार्यों को निर्दिष्ट करता है और ISO C (प्रोग्रामिंग भाषा), ISO C++, और फोरट्रान 90 के लिए भाषा बाइंडिंग प्रदान करता है। आसान मिश्रित-भाषा संदेश पासिंग प्रोग्रामिंग की अनुमति देने के लिए ऑब्जेक्ट इंटरऑपरेबिलिटी भी जोड़ी गई थी। एमपीआई-2 के मानकीकरण का दुष्परिणाम, जो 1996 में पूरा हुआ, एमपीआई-1 मानक को स्पष्ट कर रहा था, जिससे एमपीआई-1.2 का निर्माण हुआ।

एमपीआई-2 अधिकतर एमपीआई-1 का सुपरसेट है, चूंकि कुछ कार्यों को हटा दिया गया है। एमपीआई-1.3 प्रोग्राम अभी भी एमपीआई-2 मानक के अनुरूप एमपीआई कार्यान्वयन के अनुसार काम करते हैं।

एमपीआई-3 में नए फोरट्रान 2008 बाइंडिंग सम्मिलित हैं, जबकि यह पदावनत C++ बाइंडिंग के साथ-साथ कई पदावनत रूटीन और एमपीआई ऑब्जेक्ट्स को हटाता है।

एमपीआई की तुलना अधिकांशतः समानांतर वर्चुअल मशीन (पीवीएम) से की जाती है, जो 1989 में विकसित लोकप्रिय वितरित वातावरण और संदेश पासिंग प्रणाली है, और जो उन प्रणालियों में से एक थी जो मानक समानांतर संदेश पासिंग की आवश्यकता को प्रेरित करती थी। थ्रेडेड साझा मेमोरी प्रोग्रामिंग मॉडल (जैसे Pthreads और OpenMP) और मैसेज पासिंग प्रोग्रामिंग (एमपीआई/पीवीएम) को पूरक माना जा सकता है और उदाहरण के लिए, कई बड़े साझा-मेमोरी नोडों वाले सर्वर में एक साथ उपयोग किया गया है।

कार्यक्षमता

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

एमपीआई पुस्तकालय फलनों में सम्मिलित हैं, लेकिन पॉइंट-टू-पॉइंट रेंडेवस-टाइप सेंड / रिसीव ऑपरेशंस तक सीमित नहीं हैं, कार्तीय वृक्ष या ग्राफ़ (डेटा स्ट्रक्चर) के बीच चयन करना - जैसे लॉजिकल प्रोसेस टोपोलॉजी, प्रोसेस जोड़े के बीच डेटा का आदान-प्रदान करना (भेजना / प्राप्त करना) संचालन), संगणनाओं के आंशिक परिणामों का संयोजन (संचालन इकट्ठा करना और कम करना), नोडों को सिंक्रनाइज़ करना (बाधा संचालन) साथ ही साथ नेटवर्क से संबंधित जानकारी प्राप्त करना जैसे कि कंप्यूटिंग सत्र में प्रक्रियाओं की संख्या, वर्तमान प्रोसेसर पहचान जो प्रक्रिया को मैप की जाती है, तार्किक टोपोलॉजी में पड़ोसी प्रक्रियाएं सुलभ हैं, और इसी तरह। पॉइंट-टू-पॉइंट ऑपरेशंस तादात्म्य (कंप्यूटर साइंस), एसिंक्रोनस आई / ओ, बफ़र्ड और रेडी फॉर्म में आते हैं, जो मिलन-स्थल-भेजने के सिंक्रोनाइज़ेशन पहलुओं के लिए अपेक्षाकृत मजबूत और कमजोर शब्दार्थ दोनों की अनुमति देते हैं। कई बकाया अधिकांश कार्यान्वयनों में एसिंक्रोनस मोड में संचालन संभव है।

एमपीआई-1 और एमपीआई-2 दोनों कार्यान्वयन को सक्षम करते हैं जो संचार और संगणना को ओवरलैप करते हैं, लेकिन अभ्यास और सिद्धांत भिन्न होते हैं। एमपीआई थ्रेड सुरक्षित इंटरफेस भी निर्दिष्ट करता है, जिसमें सामंजस्य (कंप्यूटर विज्ञान) और युग्मन (कंप्यूटर विज्ञान) रणनीतियां होती हैं जो इंटरफ़ेस के अंदर छिपे हुए राज्य से बचने में सहायता करती हैं। बहुथ्रेडेड पॉइंट-टू-पॉइंट एमपीआई कोड लिखना अपेक्षाकृत आसान है, और कुछ कार्यान्वयन ऐसे कोड का समर्थन करते हैं। बहुथ्रेडिंग (कंप्यूटर आर्किटेक्चर) सामूहिक संचार संचारक की कई प्रतियों के साथ सबसे अच्छा होता है, जैसा कि नीचे बताया गया है।

अवधारणाएं

एमपीआई कई सुविधाएँ प्रदान करता है। निम्नलिखित अवधारणाएं उन सभी क्षमताओं के लिए संदर्भ प्रदान करती हैं और प्रोग्रामर को यह तय करने में सहायता करती हैं कि उनके अनुप्रयोग प्रोग्राम में किस कार्यक्षमता का उपयोग किया जाए। एमपीआई की आठ बुनियादी अवधारणाओं में से चार एमपीआई-2 के लिए अद्वितीय हैं।

संचारक

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

कई एमपीआई कमांड का उपयोग करके संचारकों को विभाजित किया जा सकता है। इन आदेशों में सम्मिलित हैं MPI_COMM_SPLIT, जहां प्रत्येक प्रक्रिया स्वयं को वह रंग होने की घोषणा करके कई रंगीन उप-संचारकों में से एक से जोड़ती है।

पॉइंट-टू-पॉइंट बेसिक्स

कई महत्वपूर्ण एमपीआई कार्यों में दो विशिष्ट प्रक्रियाओं के बीच संचार सम्मिलित है। प्रचलित उदाहरण है MPI_Send, जो निर्दिष्ट प्रक्रिया को दूसरी निर्दिष्ट प्रक्रिया को संदेश भेजने की अनुमति देता है। पॉइंट-टू-पॉइंट ऑपरेशंस, जैसा कि इन्हें कहा जाता है, विशेष रूप से पैटर्न या अनियमित संचार में उपयोगी होते हैं, उदाहरण के लिए, डेटा समानता | डेटा-समानांतर आर्किटेक्चर जिसमें प्रत्येक प्रोसेसर नियमित रूप से गणना चरणों के बीच विशिष्ट अन्य प्रोसेसर के साथ डेटा के क्षेत्रों को स्वैप करता है, या मास्टर/स्लेव (प्रौद्योगिकी) | मास्टर-स्लेव आर्किटेक्चर जिसमें मास्टर दास को नया कार्य डेटा भेजता है जब भी पूर्व कार्य पूरा हो जाता है।

एमपीआई-1 अवरोधन (कंप्यूटिंग) और नॉन-ब्लॉकिंग पॉइंट-टू-पॉइंट संचार मैकेनिज्म के साथ-साथ तथाकथित 'रेडी-सेंड' मैकेनिज्म दोनों के लिए मैकेनिज्म को निर्दिष्ट करता है, जिससे सेंड रिक्वेस्ट तभी की जा सकती है, जब मैचिंग रिसीव रिक्वेस्ट हो पहले ही बना दिया गया है।

सामूहिक मूल बातें

सामूहिक संचालन में प्रक्रिया समूह में सभी प्रक्रियाओं के बीच संचार सम्मिलित होता है (जिसका अर्थ संपूर्ण प्रक्रिया पूल या प्रोग्राम-परिभाषित सबसेट हो सकता है)। विशिष्ट कार्य है MPI_Bcast कॉल (प्रसारण (कंप्यूटिंग) के लिए संक्षिप्त)। यह फलन नोड से डेटा लेता है और इसे प्रक्रिया समूह में सभी प्रक्रियाओं को भेजता है। रिवर्स संचालन है MPI_Reduce कॉल, जो समूह में सभी प्रक्रियाओं से डेटा लेता है, संचालन (जैसे योग) करता है, और परिणामों को नोड पर संग्रहीत करता है। MPI_Reduce बड़ी वितरित गणना की प्रारंभ या अंत में अधिकांशतः उपयोगी होता है, जहां प्रत्येक प्रोसेसर डेटा के एक हिस्से पर काम करता है और फिर इसे परिणाम में जोड़ता है।

अन्य संचालन अधिक परिष्कृत कार्य करते हैं, जैसे MPI_Alltoall जो डेटा के n आइटम को पुनर्व्यवस्थित करता है जैसे कि nth नोड को प्रत्येक से डेटा का nth आइटम मिलता है।

व्युत्पन्न डेटा प्रकार

कई एमपीआई कार्यों के लिए आवश्यक है कि आप प्रक्रियाओं के बीच भेजे जाने वाले डेटा के प्रकार को निर्दिष्ट करें। ऐसा इसलिए है क्योंकि एमपीआई का लक्ष्य विषम वातावरणों का समर्थन करना है जहां विभिन्न नोडों पर अलग-अलग प्रकारों का प्रतिनिधित्व किया जा सकता है[16] (उदाहरण के लिए वे अलग-अलग सीपीयू आर्किटेक्चर चला रहे होंगे जिनमें अलग-अलग अंतराल हैं), जिस स्थिति में एमपीआई कार्यान्वयन डेटा रूपांतरण कर सकता है।[16] चूंकि सी भाषा एक प्रकार को पैरामीटर के रूप में पारित करने की अनुमति नहीं देती है, एमपीआई स्थिरांक को पूर्वनिर्धारित करता है MPI_INT, MPI_CHAR, MPI_DOUBLE के साथ मेल खाना int, char, double, वगैरह।

यहाँ C में उदाहरण दिया गया है जो सरणियों को पास करता है intसभी प्रक्रियाओं से एक तक। प्राप्त करने वाली प्रक्रिया को रूट प्रक्रिया कहा जाता है, और यह कोई भी नामित प्रक्रिया हो सकती है लेकिन सामान्यतः यह प्रक्रिया 0 होगी। सभी प्रक्रियाएं अपने सरणियों को रूट के साथ भेजने के लिए कहती हैं MPI_Gather, जो प्रत्येक प्रक्रिया (रूट सहित) कॉल करने के बराबर है MPI_Send और रूट ऑर्डर की इसी संख्या को बनाते हैं MPI_Recv इन सभी सरणियों को बड़े में इकट्ठा करने के लिए कहता है:[17]

<वाक्यविन्यास प्रकाश लैंग = सी> int send_array [100];

इंट रूट = 0; /* या जो कुछ भी */

int num_procs, *recv_array;

MPI_Comm_size (कॉम, और num_procs);

recv_array = malloc (num_procs * sizeof (send_array));

MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,

          recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
          रूट, कॉम);

</वाक्यविन्यास हाइलाइट>

चूँकि, आप इसके अतिरिक्त 100 के विपरीत ब्लॉक के रूप में डेटा भेजना चाह सकते हैं intएस। ऐसा करने के लिए सन्निहित ब्लॉक व्युत्पन्न डेटा प्रकार परिभाषित करें:

<वाक्यविन्यास प्रकाश लैंग = सी>

एमपीआई_डेटा प्रकार नया प्रकार;

MPI_Type_contiguous(100, MPI_INT, &newtype);

MPI_Type_commit (&newtype);

MPI_Gather (सरणी, 1, नया प्रकार, प्राप्त_सरणी, 1, नया प्रकार, जड़, कॉम);

</वाक्यविन्यास हाइलाइट>

कक्षा या डेटा संरचना पास करने के लिए, MPI_Type_create_struct से एमपीआई व्युत्पन्न डेटा प्रकार बनाता है MPI_predefined डेटा प्रकार, इस प्रकार है:

<वाक्यविन्यास प्रकाश लैंग = सी>

int MPI_Type_create_struct (int गिनती,

                          इंट *ब्लॉकलेन,
                          MPI_Aint *डिस्प,
                          एमपीआई_डेटा प्रकार * प्रकार,
                          MPI_Datatype *newtype)

</वाक्यविन्यास हाइलाइट> कहाँ:

  • count कई ब्लॉक हैं, और सरणियों की लंबाई (तत्वों में) निर्दिष्ट करते हैं blocklen, disp, और type.
  • blocklen प्रत्येक ब्लॉक में तत्वों की संख्या सम्मिलित है,
  • disp प्रत्येक ब्लॉक के बाइट विस्थापन सम्मिलित हैं,
  • type प्रत्येक ब्लॉक में तत्व के प्रकार होते हैं।
  • newtype (एक आउटपुट) में इस फलन द्वारा बनाया गया नया व्युत्पन्न प्रकार होता है disp ई> (विस्थापन) सरणी डेटा संरचना संरेखण के लिए आवश्यक है, क्योंकि संकलक वर्ग या डेटा संरचना में चर को पैड कर सकता है। विभिन्न क्षेत्रों के बीच की दूरी का पता लगाने का सबसे सुरक्षित विधि उनके पते को स्मृति में प्राप्त करना है। इसके साथ किया जाता है MPI_Get_address, जो सामान्यतः C के समान होता है & ऑपरेटर लेकिन स्मृति विभाजन से निपटने के समय यह सच नहीं हो सकता है।[18]

डेटा संरचना को ब्लॉक के रूप में पास करना एक समय में एक आइटम को पास करने की तुलना में अधिक तेज है, खासकर अगर संचालन को दोहराया जाना है। ऐसा इसलिए है क्योंकि निश्चित आकार के ब्लॉक को स्थानांतरण के समय क्रमांकन की आवश्यकता नहीं होती है।[19]

निम्नलिखित डेटा संरचनाओं को देखते हुए:

<वाक्यविन्यास प्रकाश लैंग = सी> संरचना ए {

   इंट एफ;
   लघु पी;

};

संरचना बी {

   संरचना ए ए;
   इंट पीपी, वीपी;

};

</वाक्यविन्यास हाइलाइट>

यहाँ एमपीआई-व्युत्पन्न डेटा प्रकार बनाने के लिए C कोड दिया गया है:

<वाक्यविन्यास प्रकाश लैंग = सी>

स्टेटिक कास्ट इंट ब्लॉकन [] = {1, 1, 1, 1};

स्थिर स्थिरांक MPI_Aint विवाद [] = {

   ऑफसेट (संरचना बी, ए) + ऑफसेट (संरचना ए, एफ),
   ऑफसेट (संरचना बी, ए) + ऑफसेट (संरचना ए, पी),
   ऑफसेट (संरचना बी, पीपी),
   ऑफसेट (संरचना बी, वीपी)

};

स्थिर MPI_Datatype प्रकार [] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};

एमपीआई_डेटा प्रकार नया प्रकार;

MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype);

MPI_Type_commit (&newtype);

</वाक्यविन्यास हाइलाइट>

एमपीआई-2 अवधारणाएं

एकतरफा संचार

एमपीआई-2 तीन एकतरफा संचार संचालन को परिभाषित करता है, MPI_Put, MPI_Get, और MPI_Accumulate, दूरस्थ स्मृति के लिए लेखन, दूरस्थ स्मृति से पठन, और क्रमशः कई कार्यों में एक ही स्मृति पर कमी संचालन। इस संचार को सिंक्रनाइज़ करने के लिए तीन अलग-अलग तरीकों को भी परिभाषित किया गया है (वैश्विक, जोड़ीदार और रिमोट लॉक) क्योंकि विनिर्देश गारंटी नहीं देता है कि ये संचालन सिंक्रनाइज़ेशन बिंदु तक हो चुके हैं।

इस प्रकार की कॉल अधिकांशतः कलनविधि के लिए उपयोगी हो सकती हैं जिसमें सिंक्रनाइज़ेशन असुविधाजनक होगा (जैसे वितरित मैट्रिक्स गुणन), या जहां यह वांछनीय है कि कार्य अपने लोड को संतुलित करने में सक्षम हों जबकि अन्य प्रोसेसर डेटा पर काम कर रहे हों।

गतिशील प्रक्रिया प्रबंधन

मुख्य पहलू नई एमपीआई प्रक्रियाओं के निर्माण में भाग लेने या एमपीआई प्रक्रियाओं के साथ संचार स्थापित करने के लिए एमपीआई प्रक्रिया की क्षमता है जो अलग से प्रारंभ की गई है। एमपीआई-2 विनिर्देश तीन मुख्य इंटरफेस का वर्णन करता है जिसके द्वारा एमपीआई प्रक्रियाएं गतिशील रूप से संचार स्थापित कर सकती हैं, MPI_Comm_spawn, MPI_Comm_accept/MPI_Comm_connect और MPI_Comm_join. MPI_Comm_spawn ई> इंटरफ़ेस एमपीआई प्रक्रिया को नामित एमपीआई प्रक्रिया के कई उदाहरणों को उत्पन्न करने की अनुमति देता है। एमपीआई प्रक्रियाओं का नव निर्मित सेट नया रूप बनाता है MPI_COMM_WORLD इंट्राकम्यूनिकेटर लेकिन माता-पिता के साथ संवाद कर सकता है और संचारक फलन लौटाता है। MPI_Comm_spawn_multiple वैकल्पिक इंटरफ़ेस है जो अलग-अलग उदाहरणों को अलग-अलग तर्कों के साथ अलग-अलग बाइनरी बनाने की अनुमति देता है।[20]


एन/ओ

समांतर आई/ओ सुविधा को कभी-कभी एमपीआई-आईओ कहा जाता है,[21] और एमपीआई को वितरित प्रणाली पर अमूर्त आई/ओ प्रबंधन के लिए डिज़ाइन किए गए कार्यों के सेट को संदर्भित करता है, और वर्तमान व्युत्पन्न डेटाटाइप कार्यक्षमता का उपयोग करके फ़ाइलों को आसानी से पैटर्न तरीके से एक्सेस करने की अनुमति देता है।

इस सुविधा पर किए गए छोटे शोध से संकेत मिलता है कि एमपीआई-आईओ का उपयोग करके उच्च प्रदर्शन लाभ प्राप्त करना तुच्छ नहीं हो सकता है। उदाहरण के लिए, विरल मैट्रिक्स गुणन | मैट्रिक्स-वेक्टर गुणन का कार्यान्वयन एमपीआई आई/ओ पुस्तकालय का उपयोग करके सामान्य प्रदर्शन लाभ का सामान्य व्यवहार दिखाता है, लेकिन ये परिणाम अनिर्णायक हैं।[22] यह नहीं था सामूहिक आई/ओ के विचार तक[23] एमपीआई-आईओ में प्रयुक्त किया गया कि एमपीआई-आईओ व्यापक रूप से अपनाना प्रारंभ कर दिया। सामूहिक आई/ओ प्रक्रियाओं को सामूहिक रूप से छोटे और गैर-सन्निहित आई/ओ संचालन को बड़े और सन्निहित लोगों में परिवर्तित करके अनुप्रयोगों के आई/ओ बैंडविड्थ को अधिक सीमा तक बढ़ा देता है, जिससे रिकॉर्ड लॉकिंग और डिस्क ओवरहेड कम हो जाता है। अपने विशाल प्रदर्शन लाभों के कारण, एमपीआई-आईओ कई अत्याधुनिक आई/ओ पुस्तकालयों, जैसे HDF5 और NetCDF के लिए अंतर्निहित आई/ओ परत भी बन गया। इसकी लोकप्रियता ने सामूहिक आई/ओ अनुकूलन पर अनुसंधान को भी गति प्रदान की, जैसे कि लेआउट-जागरूक आई/ओ[24] और क्रॉस-फ़ाइल एकत्रीकरण।[25][26]


आधिकारिक कार्यान्वयन

  • एमपीआई 1.x मानक का प्रारंभिक कार्यान्वयन आर्गन राष्ट्रीय प्रयोगशाला (ANL) और मिसिसिपी स्टेट यूनिवर्सिटी से एमपीआईसीएच था। आईबीएम भी प्रारंभिक कार्यान्वयनकर्ता था, और 90 के दशक की प्रारंभिक सुपरकंप्यूटर कंपनियों ने या तो एमपीआईसीएच का व्यावसायीकरण किया, या अपने स्वयं के कार्यान्वयन का निर्माण किया। ओहियो सुपरकंप्यूटर सेंटर से एलएएम/एमपीआई एक और प्रारंभिक खुला कार्यान्वयन था। ANL ने एक दशक से अधिक समय से एमपीआईसीएच का विकास जारी रखा है, और अब एमपीआईसीएच-3.2 प्रदान करता है, एमपीआई-3.1 मानक को प्रयुक्त करता है।
  • ओपन एमपीआई (ओपनएमपी के साथ भ्रमित नहीं होना चाहिए) एफटी-एमपीआई, एलए-एमपीआई, एलएएम/एमपीआई और पैक्स-एमपीआई को मिलाकर बनाया गया था, और यह कई शीर्ष 500 सुपर कंप्यूटर में पाया जाता है।

कई अन्य प्रयास एमपीआईसीएच, LAM, और अन्य कार्यों के डेरिवेटिव हैं, जिनमें Hewlett-Packard, Intel, Microsoft और NEC के व्यावसायिक कार्यान्वयन सम्मिलित हैं, लेकिन इन तक सीमित नहीं हैं।

जबकि विनिर्देश एक सी और फोरट्रान इंटरफ़ेस को अनिवार्य करते हैं, एमपीआई को प्रयुक्त करने के लिए इस्तेमाल की जाने वाली भाषा रनटाइम पर समर्थन करने वाली भाषा या भाषाओं से मेल खाने के लिए बाध्य नहीं है। अधिकांश कार्यान्वयन सी, सी ++ और असेंबली भाषा को जोड़ते हैं, और सी, सी ++ और फोरट्रान प्रोग्रामर को लक्षित करते हैं। पर्ल, पायथन, आर, रूबी, जावा और नियंत्रण भाषा सहित कई अन्य भाषाओं के लिए बाइंडिंग उपलब्ध हैं (#भाषा बाइंडिंग देखें)।

एमपीआई कार्यान्वयन के अनुप्रयोग बाइनरी इंटरफ़ेस मोटे तौर पर एमपीआईसीएच और Open एमपीआई डेरिवेटिव के बीच विभाजित होते हैं, जिससे परिवार से पुस्तकालय एक ही परिवार से एक के ड्रॉप-इन प्रतिस्थापन के रूप में काम करे, लेकिन परिवारों में प्रत्यक्ष प्रतिस्थापन असंभव है। फ्रांसीसी फ्रेंच वैकल्पिक ऊर्जा और परमाणु ऊर्जा आयोग ऐसे स्विच की सुविधा के लिए आवरण इंटरफ़ेस रखता है।[27]


हार्डवेयर

एमपीआई हार्डवेयर अनुसंधान एमपीआई को सीधे हार्डवेयर में प्रयुक्त करने पर ध्यान केंद्रित करता है, उदाहरण के लिए प्रोसेसर-इन-मेमोरी के माध्यम से, प्रत्येक नोड में रैंडम एक्सेस मेमोरी चिप्स के माइक्रोक्रिकिट्री में एमपीआई संचालन का निर्माण। निहितार्थ से, यह दृष्टिकोण भाषा, ऑपरेटिंग प्रणाली और सीपीयू से स्वतंत्र है, लेकिन इसे आसानी से अपडेट या हटाया नहीं जा सकता है।

संचालन के एक या एक से अधिक भागों में हार्डवेयर त्वरण जोड़ने के लिए एक अन्य दृष्टिकोण रहा है, जिसमें एमपीआई कतारों के हार्डवेयर प्रसंस्करण और सीपीयू या ओएस कर्नेल हस्तक्षेप के बिना मेमोरी और नेटवर्क इंटरफ़ेस नियंत्रक के बीच डेटा को सीधे स्थानांतरित करने के लिए रिमोट डायरेक्ट मेमोरी एक्सेस का उपयोग करना सम्मिलित है।

कंपाइलर रैपर

mpicc (और इसी तरह mpic++, mpif90, आदि) प्रोग्राम है जो एमपीआई का उपयोग करने वाले कोड को संकलित करते समय आवश्यक कमांड-लाइन फ़्लैग सेट करने के लिए वर्तमान कंपाइलर पर लपेटता है। सामान्यतः, यह कुछ झंडे जोड़ता है जो कोड को संकलित करने और एमपीआई पुस्तकालय के विरुद्ध लिंक करने में सक्षम बनाता है।[28]


भाषा बंधन

भाषा बाध्यकारी पुस्तकालय हैं जो एमपीआईसी या ओपन एमपीआई जैसे वर्तमान एमपीआई कार्यान्वयन को लपेटकर एमपीआई समर्थन को अन्य भाषाओं में विस्तारित करते हैं।

सामान्य भाषा अवसंरचना

दो प्रबंधित सामान्य भाषा इन्फ्रास्ट्रक्चर .नेट कार्यान्वयन शुद्ध एमपीआई.नेट[29] और एमपीआई.नेट हैं,[30] बीएसडी-शैली लाइसेंस के अनुसार लाइसेंस प्राप्त इंडियाना विश्वविद्यालय में एक शोध प्रयास है जिसे बीएसडी-शैली लाइसेंस के अनुसार लाइसेंस दिया गया है। यह मोनो (सॉफ्टवेयर) के साथ संगत है, और अंतर्निहित निम्न-विलंबता एमपीआई नेटवर्क फैब्रिक्स का पूर्ण उपयोग कर सकता है।

जावा

चूंकि जावा (प्रोग्रामिंग भाषा) में आधिकारिक एमपीआई बाध्यकारी नहीं है, कई समूह सफलता और अनुकूलता के विभिन्न स्तरों के साथ दोनों को पाटने का प्रयास करते हैं। पहले प्रयासों में से ब्रायन कारपेंटर का एमपीआईजावा एक था ,[31] अनिवार्य रूप से स्थानीय C एमपीआई पुस्तकालय के लिए जावा मूल इंटरफ़ेस (जेएनआई) रैपर का सेट, जिसके परिणामस्वरूप सीमित पोर्टेबिलिटी के साथ हाइब्रिड कार्यान्वयन होता है, जिसे उपयोग की जा रही विशिष्ट एमपीआई पुस्तकालय के विरुद्ध भी संकलित किया जाना है।

चूँकि, इस मूल परियोजना ने एमपीआईजावा एपीआई (जावा के लिए वास्तविक एमपीआई एपीआई जो समतुल्य सी ++ बाइंडिंग का बारीकी से पालन करता है) को भी परिभाषित किया,[32] जिसे बाद की अन्य जावा एमपीआई परियोजनाओं ने अपनाया है। एक कम उपयोग किया जाने वाला एपीआई एमपीजे एपीआई है, जिसे अधिक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग और सन माइक्रोप्रणाली के कोडिंग सम्मेलनों के निकट होने के लिए डिज़ाइन किया गया था।[33] एपीआई से परे, जावा एमपीआई पुस्तकालय या तो स्थानीय एमपीआई पुस्तकालय पर निर्भर हो सकते हैं, या जावा में संदेश पासिंग फलन को प्रयुक्त कर सकते हैं, जबकि कुछ पी2पी-एमपीआई भी सहकर्मी से सहकर्मी कार्यक्षमता प्रदान करते हैं और मिश्रित-प्लेटफ़ॉर्म संचालन की अनुमति देते हैं।

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

एक अन्य जावा संदेश पासिंग प्रणाली एमपीजे एक्सप्रेस है।[34] हाल के संस्करणों को क्लस्टर और बहुकोर विन्यास में निष्पादित किया जा सकता है। क्लस्टर विन्यास में, यह क्लस्टर और क्लाउड पर समांतर जावा अनुप्रयोगों को निष्पादित कर सकता है। यहाँ जावा सॉकेट्स या विशेष आई/ओ इंटरकनेक्ट जैसे मायरिनेट एमपीजे एक्सप्रेस प्रक्रियाओं के बीच संदेश भेजने का समर्थन कर सकते हैं। यह अपने मूल उपकरण का उपयोग करके एमपीआई के मूल सी कार्यान्वयन का भी उपयोग कर सकता है। बहुकोर विन्यास में, समानांतर जावा अनुप्रयोग को बहुकोर प्रोसेसर पर निष्पादित किया जाता है। इस मोड में, एमपीजे एक्सप्रेस प्रक्रियाओं को जावा थ्रेड द्वारा दर्शाया जाता है।

जूलिया

एमपीआई के लिए जूलिया (प्रोग्रामिंग भाषा) भाषा रैपर है।[35]


मैटलैब

मैटलैब का उपयोग करके एमपीआई के कुछ अकादमिक कार्यान्वयन हैं। मैटलैब की अपनी समानांतर विस्तार पुस्तकालय है जिसे एमपीआई और समानांतर वर्चुअल मशीन का उपयोग करके प्रयुक्त किया गया है।

ओकैमल

ओकैमलएमपीआई मॉड्यूल[36] एमपीआई कार्यों का बड़ा सबसेट प्रयुक्त करता है और वैज्ञानिक कंप्यूटिंग में सक्रिय उपयोग में है। 11,000-लाइन ओकैमल प्रोग्राम मॉड्यूल का उपयोग करके एमपीआई-इफीड था, कोड की अतिरिक्त 500 लाइनों और सामान्य पुनर्गठन के साथ और सुपरकंप्यूटर में 170 नोडों तक उत्कृष्ट परिणाम के साथ चला था।[37]


पीएआरआई/जीपी

पीएआरआई/जीपी को एमपीआई को अपने बहु-थ्रेड इंजन के रूप में उपयोग करने के लिए बनाया जा सकता है,[38] जिससे एमपीआई क्लस्टर पर समानांतर पीएआरआई और जीपी प्रोग्राम चलाने की अनुमति मिलती है।

पायथन

पायथन (प्रोग्रामिंग भाषा) में एमपीआई कार्यान्वयन में पीआईएमपीआई,[39] एमपीआई4पीवाई, पीपर,[40] एमआईएमपीआई,[41] और साइंटिफिकपायथन में एमपीआई सबमॉड्यूल सम्मिलित हैं: , mpi4py, पीपर, एमआईएमपीआई, और साइंटिफिकपायथन में एमपीआई सबमॉड्यूल। पीआईएमपीआई उल्लेखनीय है क्योंकि यह एक प्रकार का पायथन दुभाषिया है, जबकि पाइपर, एमवायएमपीआई और वैज्ञानिक पायथन के मॉड्यूल आयात मॉड्यूल हैं। वे यह तय करने के लिए कोडर का काम करते हैं कि MPI_Init को कॉल कहां करें।

2006 में[42] बूस्ट सी ++ पुस्तकालयों ने बूस्ट-एमपीआई का अधिग्रहण किया जिसमें एमपीआई पायथन बाइंडिंग सम्मिलित थी।[43] यह सी++ और पायथन को मिलाने के लिए विशेष रूप से सहायक है। As of October 2016 बूस्ट: एमपीआई के पायथन बाइंडिंग में अभी भी सेंटओएस में अनफिक्स पैकेजिंग बग हैं।[44]


आर

एमपीआई की आर (प्रोग्रामिंग भाषा) बाइंडिंग में आरएमपीआई ​​सम्मिलित है[45] और आर में बिग डेटा के साथ प्रोग्रामिंग,[46] जहां आरएमपीआई मास्टर/स्लेव (प्रौद्योगिकी) पर ध्यान केंद्रित करता है। प्रबंधक-श्रमिक समानता जबकि पीबीडीएमपीआई एसपीएमडी समानता पर केंद्रित है। दोनों कार्यान्वयन खुले एमपीआई या एमपीआईसीएच2 का पूरी तरह से समर्थन करते हैं।

उदाहरण कार्यक्रम

यहाँ एमपीआई में "Hello, World!" प्रोग्राम सी में लिखा गया है। इस उदाहरण में, हम प्रत्येक प्रोसेसर को "Hello" संदेश भेजते हैं, इसे तुच्छ रूप से हेरफेर करते हैं, परिणाम को मुख्य प्रक्रिया में लौटाते हैं, और संदेशों को प्रिंट करते हैं।

 /*
  "Hello World" MPI Test Program
*/
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <mpi.h>

int main(int argc, char **argv)
{
    char buf[256];
    int my_rank, num_procs;

    /* Initialize the infrastructure necessary for communication */
    MPI_Init(&argc, &argv);

    /* Identify this process */
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    /* Find out how many total processes are active */
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

    /* Until this point, all programs have been doing exactly the same.
       Here, we check the rank to distinguish the roles of the programs */
    if (my_rank == 0) {
        int other_rank;
        printf("We have %i processes.\n", num_procs);

        /* Send messages to all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            sprintf(buf, "Hello %i!", other_rank);
            MPI_Send(buf, 256, MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD);
        }

        /* Receive messages from all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            MPI_Recv(buf, 256, MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("%s\n", buf);
        }

    } else {

        /* Receive message from process #0 */
        MPI_Recv(buf, 256, MPI_CHAR, 0,
                 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        assert(memcmp(buf, "Hello ", 6) == 0);

        /* Send message to process #0 */
        sprintf(buf, "Process %i reporting for duty.", my_rank);
        MPI_Send(buf, 256, MPI_CHAR, 0,
                 0, MPI_COMM_WORLD);

    }

    /* Tear down the communication infrastructure */
    MPI_Finalize();
    return 0;
  • /
  1. सम्मिलित <assert.h>
  2. सम्मिलित <stdio.h>
  3. सम्मिलित <string.h>
  4. सम्मिलित <mpi.h>

इंट मेन (इंट एआरजीसी, चार ** एआरजीवी) {

   चार बुफ [256];
   int my_rank, num_procs;
   /* संचार के लिए आवश्यक बुनियादी ढाँचे को प्रारंभ करें */
   MPI_Init(&argc, &argv);
   /* इस प्रक्रिया को पहचानें */
   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
   / * पता करें कि कुल कितनी प्रक्रियाएँ सक्रिय हैं * /
   MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
   /* इस बिंदु तक, सभी प्रोग्राम ठीक वैसा ही करते रहे हैं।
      यहां, हम प्रोग्राम की भूमिकाओं में अंतर करने के लिए रैंक की जांच करते हैं */
   अगर (my_rank == 0) {
       int अन्य रैंक;
       प्रिंटफ (हमारे पास% i प्रक्रियाएं हैं। \ n, num_procs);
       /* अन्य सभी प्रक्रियाओं को संदेश भेजें */
       के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++)
       {
           स्प्रिंटफ (बफ, हैलो% i! , अन्य_रैंक);
           MPI_Send (buf, 256, MPI_CHAR, अन्य_रैंक,
                    0, MPI_COMM_WORLD);
       }
       /* अन्य सभी प्रक्रियाओं से संदेश प्राप्त करें */
       के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++)
       {
           MPI_Recv(buf, 256, MPI_CHAR, अन्य_रैंक,
                    0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
           प्रिंटफ (% s \ n, बीयूएफ);
       }
   } अन्य {
       /* प्रक्रिया #0 से संदेश प्राप्त करें */
       MPI_Recv(buf, 256, MPI_CHAR, 0,
                0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
       जोर दें (memcmp (buf, हैलो, 6) == 0);
       /* प्रोसेस करने के लिए संदेश भेजें #0 */
       sprintf(buf, ड्यूटी के लिए %i रिपोर्टिंग प्रोसेस करें। , my_rank);
       MPI_Send(buf, 256, MPI_CHAR, 0,
                0, MPI_COMM_WORLD);
   }
   /* संचार इंफ्रास्ट्रक्चर को खत्म करें */
   MPI_Finalize ();
   वापसी 0;

}

</वाक्यविन्यास हाइलाइट>

जब 4 प्रक्रियाओं के साथ चलाया जाता है, तो इसे निम्न आउटपुट का उत्पादन करना चाहिए:[47]

$ mpicc example.c && mpiexec -n 4 ./a.out

We have 4 processes.

Process 1 reporting for duty.

Process 2 reporting for duty.

Process 3 reporting for duty.

यहाँ, mpiexec 4 प्रक्रियाओं (कंप्यूटिंग) के साथ उदाहरण कार्यक्रम को निष्पादित करने के लिए उपयोग किया जाने वाला कमांड है, जिनमें से प्रत्येक रन टाइम पर प्रोग्राम का स्वतंत्र उदाहरण है और निर्दिष्ट रैंक (अर्थात संख्यात्मक आईडी) 0, 1, 2 और 3 है। एमपीआई मानक द्वारा mpiexec नाम अनुशंसित है, चूंकि कुछ कार्यान्वयन mpirun नाम के अनुसार एक समान आदेश प्रदान करते हैं। MPI_COMM_WORLD संचारक है जिसमें सभी प्रक्रियाएं सम्मिलित हैं।

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

एमपीआई प्रोसेसर के अतिरिक्त प्रक्रिया की धारणा का उपयोग करता है। एमपीआई रनटाइम प्रणाली द्वारा प्रोग्राम कॉपी को प्रोसेसर से मैप किया जाता है। इस अर्थ में, समानांतर मशीन भौतिक प्रोसेसर या n प्रोसेसर के लिए मैप कर सकती है, जहां n उपलब्ध प्रोसेसर की संख्या है, या बीच में कुछ भी है। अधिकतम समांतर स्पीडअप के लिए, अधिक भौतिक प्रोसेसर का उपयोग किया जाता है। यह उदाहरण विश्व n के आकार के लिए अपने व्यवहार को समायोजित करता है, इसलिए यह प्रत्येक आकार भिन्नता के संकलन के बिना रनटाइम विन्यास को स्केल करने का भी प्रयास करता है, चूंकि रनटाइम के निर्णय उपलब्ध संगामिति की पूर्ण मात्रा के आधार पर भिन्न हो सकते हैं।

एमपीआई-2 गोद लेने

एमपीआई-1.2 को अपनाना सार्वभौमिक रहा है, विशेष रूप से क्लस्टर कंप्यूटिंग में, लेकिन एमपीआई-2.1 की स्वीकृति अधिक सीमित रही है। उद्देश्यों में सम्मिलित हैं:

  1. एमपीआई-2 कार्यान्वयन में आई/ओ और गतिशील प्रक्रिया प्रबंधन सम्मिलित है, और मिडलवेयर का आकार अधिक बड़ा है। अधिकांश साइटें जो बैच समयबद्धन प्रणाली का उपयोग करती हैं, गतिशील प्रक्रिया प्रबंधन का समर्थन नहीं कर सकती हैं। एमपीआई-2 का समानांतर आई/ओ अच्छी तरह से स्वीकृत है।
  2. एमपीआई-2 से पहले कई एमपीआई-1.2 प्रोग्राम विकसित किए गए थे। सुवाह्यता की चिंताओं ने प्रारंभ में अपनाने को धीमा कर दिया, चूंकि व्यापक समर्थन ने इसे कम कर दिया है।
  3. कई एमपीआई-1.2 अनुप्रयोग उस मानक (16-25 फलनों) के केवल एक सबसेट का उपयोग करते हैं, जिसमें एमपीआई-2 कार्यक्षमता की कोई वास्तविक आवश्यकता नहीं होती है।

भविष्य

एमपीआई के भविष्य के कुछ पहलू ठोस और दूसरों को इतना कम दिखाई देते हैं; दूसरों को इतना कम। एमपीआई फोरम ने कुछ एमपीआई-2 उद्देश्यों को स्पष्ट करने और संभावित एमपीआई-3 के विकास का पता लगाने के लिए 2007 में फिर से बैठक की, जिसके परिणामस्वरूप एमपीआई-3.0 (सितंबर 2012) और एमपीआई-3.1 (जून 2015) के संस्करण सामने आए थे।

अधिक आंतरिक संगामिति (बहु-कोर प्रोसेसर), उत्तम सूक्ष्म संगामिति नियंत्रण (थ्रेडिंग, एफ़िनिटी), और मेमोरी पदानुक्रम के अधिक स्तरों के साथ आर्किटेक्चर बदल रहे हैं। बहुथ्रेडिंग (कंप्यूटर आर्किटेक्चर) प्रोग्राम एकल-थ्रेडेड अनुप्रयोग की तुलना में इन विकासों का अधिक आसानी से लाभ उठा सकते हैं। यह पहले से ही सममित बहु प्रसंस्करण, अर्थात् ओपनएमपी के लिए अलग, पूरक मानकों को प्राप्त कर चुका है। एमपीआई-2 परिभाषित करता है कि मानक-अनुरूप कार्यान्वयन को बहुप्रचारित उद्देश्यों से कैसे निपटना चाहिए, लेकिन इसके लिए यह आवश्यक नहीं है कि कार्यान्वयन बहुप्रचारित या थ्रेड-सुरक्षित हो। एमपीआई-3 नोड के अंदर साझा-स्मृति समानता का उपयोग करने की क्षमता जोड़ता है। एमपीआई के कार्यान्वयन जैसे अनुकूली एमपीआई, हाइब्रिड एमपीआई, फाइन-ग्रेन्ड एमपीआई, एमपीसी और अन्य एमपीआई मानक के विस्तार की प्रस्तुति करते हैं जो एमपीआई में विभिन्न चुनौतियों का समाधान करते हैं।

एस्ट्रोफिजिसिस्ट जोनाथन डर्सी ने एमपीआई फोरम को अप्रचलित कहते हुए विचार लिखी, जिसमें चैपल (प्रोग्रामिंग भाषा) भाषा, एकीकृत समानांतर सी, अपाचे हडूप, अपाचे स्पार्क और अपाचे फ्लैश जैसी नई विधियों की ओर संकेत किया गया।[48] इसी समय, एक्सास्केल कंप्यूटिंग में लगभग सभी परियोजनाएं एमपीआई पर स्पष्ट रूप से निर्मित होती हैं; एमपीआई को 2020 की प्रारंभ तक सबसे बड़ी मशीनों के पैमाने पर दिखाया गया है और आने वाले लंबे समय तक प्रासंगिक रहने के लिए व्यापक रूप से माना जाता है।

यह भी देखें


संदर्भ

  1. "Message Passing Interface :: High Performance Computing". hpc.nmsu.edu. Retrieved 2022-08-06.
  2. Walker DW (August 1992). Standards for message-passing in a distributed memory environment (PDF) (Report). Oak Ridge National Lab., TN (United States), Center for Research on Parallel Computing (CRPC). p. 25. OSTI 10170156. ORNL/TM-12147. Retrieved 2019-08-18.
  3. The MPI Forum, CORPORATE (November 15–19, 1993). "MPI: A Message Passing Interface". Proceedings of the 1993 ACM/IEEE conference on Supercomputing. Supercomputing '93. Portland, Oregon, USA: ACM. pp. 878–883. doi:10.1145/169627.169855. ISBN 0-8186-4340-4.
  4. Nielsen, Frank (2016). "2. Introduction to MPI: The MessagePassing Interface". Introduction to HPC with MPI for Data Science. Springer. pp. 195–211. ISBN 978-3-319-21903-5.
  5. Gropp, Lusk & Skjellum 1996, p. 3
  6. Sur, Sayantan; Koop, Matthew J.; Panda, Dhabaleswar K. (4 August 2017). "MPI and communication---High-performance and scalable MPI over Infini Band with reduced memory usage". High-performance and Scalable MPI over InfiniBand with Reduced Memory Usage: An In-depth Performance Analysis. ACM. p. 105. doi:10.1145/1188455.1188565. ISBN 978-0769527000. S2CID 818662.
  7. KNEM: High-Performance Intra-Node MPI Communication "MPICH2 (since release 1.1.1) uses KNEM in the DMA LMT to improve large message performance within a single node. Open MPI also includes KNEM support in its SM BTL component since release 1.5. Additionally, NetPIPE includes a KNEM backend since version 3.7.2."
  8. "FAQ: Tuning the run-time characteristics of MPI sm communications". www.open-mpi.org.
  9. https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?language=en "The MPI-3 standard introduces another approach to hybrid programming that uses the new MPI Shared Memory (SHM) model"
  10. Shared Memory and MPI 3.0 "Various benchmarks can be run to determine which method is best for a particular application, whether using MPI + OpenMP or the MPI SHM extensions. On a fairly simple test case, speedups over a base version that used point to point communication were up to 5X, depending on the message."
  11. Using MPI-3 Shared Memory As a Multicore Programming System (PDF presentation slides)
  12. Table of Contents — September 1994, 8 (3-4). Hpc.sagepub.com. Retrieved on 2014-03-24.
  13. दस्तावेज़। एमपीआई-forum.org। 2014-03-24 को पुनःप्राप्त।
  14. Gropp, Lusk & Skjellum 1999b, pp. 4–5
  15. MPI: एक संदेश-पासिंग इंटरफ़ेस मानक
    संस्करण 3.1, संदेश पासिंग इंटरफ़ेस फ़ोरम, 4 जून, 2015
    http://www.mpi-forum.org. 2015-06-16 को पुनःप्राप्त।
  16. 16.0 16.1 "Type matching rules". mpi-forum.org.
  17. "MPI_Gather(3) man page (version 1.8.8)". www.open-mpi.org.
  18. "MPI_Get_address". www.mpich.org.
  19. Boost.MPI Skeleton/Content Mechanism rationale (performance comparison graphs were produced using NetPIPE)
  20. Gropp, Lusk & Skjelling 1999b, p. 7
  21. Gropp, Lusk & Skjelling 1999b, pp. 5–6
  22. "Sparse matrix-vector multiplications using the MPI I/O library" (PDF).
  23. "Data Sieving and Collective I/O in ROMIO" (PDF). IEEE. Feb 1999.
  24. Chen, Yong; Sun, Xian-He; Thakur, Rajeev; Roth, Philip C.; Gropp, William D. (Sep 2011). "LACIO: A New Collective I/O Strategy for Parallel I/O Systems". 2011 IEEE International Parallel & Distributed Processing Symposium. IEEE. pp. 794–804. CiteSeerX 10.1.1.699.8972. doi:10.1109/IPDPS.2011.79. ISBN 978-1-61284-372-8. S2CID 7110094.
  25. Teng Wang; Kevin Vasko; Zhuo Liu; Hui Chen; Weikuan Yu (2016). "Enhance parallel input/output with cross-bundle aggregation". The International Journal of High Performance Computing Applications. 30 (2): 241–256. doi:10.1177/1094342015618017. S2CID 12067366.
  26. Wang, Teng; Vasko, Kevin; Liu, Zhuo; Chen, Hui; Yu, Weikuan (Nov 2014). "BPAR: A Bundle-Based Parallel Aggregation Framework for Decoupled I/O Execution". 2014 International Workshop on Data Intensive Scalable Computing Systems. IEEE. pp. 25–32. doi:10.1109/DISCS.2014.6. ISBN 978-1-4673-6750-9. S2CID 2402391.
  27. cea-hpc. "cea-hpc/wi4mpi: Wrapper interface for MPI". GitHub (in English).
  28. mpicc. Mpich.org. Retrieved on 2014-03-24.
  29. Pure Mpi.NET
  30. "MPI.NET: High-Performance C# Library for Message Passing". www.osl.iu.edu.
  31. "mpiJava Home Page". www.hpjava.org.
  32. "Introduction to the mpiJava API". www.hpjava.org.
  33. "The MPJ API Specification". www.hpjava.org.
  34. "MPJ Express Project". mpj-express.org.
  35. JuliaParallel/MPI.jl, Parallel Julia, 2019-10-03, retrieved 2019-10-08
  36. "Xavier Leroy - Software". cristal.inria.fr.
  37. Archives of the Caml mailing list > Message from Yaron M. Minsky. Caml.inria.fr (2003-07-15). Retrieved on 2014-03-24.
  38. "Introduction to parallel GP" (PDF). pari.math.u-bordeaux.fr.
  39. "Google Code Archive - Long-term storage for Google Code Project Hosting". code.google.com.
  40. "Google Code Archive - Long-term storage for Google Code Project Hosting". code.google.com.
  41. Now part of Pydusa
  42. "Boost.MPI Revision History". www.boost.org.
  43. "Python Bindings - 1.35.0". www.boost.org.
  44. "0006498: Package boost-*mpi-python is missing python module - CentOS Bug Tracker". bugs.centos.org.
  45. Yu, Hao (2002). "Rmpi: Parallel Statistical Computing in R". R News.
  46. Chen, Wei-Chen; Ostrouchov, George; Schmidt, Drew; Patel, Pragneshkumar; Yu, Hao (2012). "pbdMPI: Programming with Big Data -- Interface to MPI".
  47. The output snippet was produced on an ordinary Linux desktop system with Open MPI installed. Distros usually place the mpicc command into an openmpi-devel or libopenmpi-dev package, and sometimes make it necessary to run "module add mpi/openmpi-x86_64" or similar before mpicc and mpiexec are available.
  48. "HPC is dying, and MPI is killing it". www.dursi.ca.


अग्रिम पठन


बाहरी संबंध