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

From Vigyanwiki
No edit summary
 
(8 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{short description|Message-passing system for parallel computers}}
{{short description|Message-passing system for parallel computers}}
संदेश पासिंग इंटरफ़ेस (एमपीआई) मानकीकृत और पोर्टेबल [[संदेश देना]] मानक है जिसे [[समानांतर कंप्यूटिंग]] [[कंप्यूटर आर्किटेक्चर]] पर कार्य करने के लिए डिज़ाइन किया गया है।<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 ++ और [[फोरट्रान]] में [[सॉफ्टवेयर पोर्टेबिलिटी]] मैसेज-पासिंग प्रोग्राम लिखने वाले उपयोगकर्ताओं की विस्तृत श्रृंखला के लिए उपयोगी है। कई [[खुला स्त्रोत]] एमपीआई [[प्रोग्रामिंग भाषा कार्यान्वयन]] हैं, जो समानांतर [[सॉफ्टवेयर उद्योग]] के विकास को बढ़ावा देते हैं, और पोर्टेबल और स्केलेबल बड़े पैमाने पर समानांतर अनुप्रयोगों के विकास को प्रोत्साहित करते हैं।
संदेश पासिंग इंटरफ़ेस (एमपीआई) मानकीकृत और पोर्टेबल [[संदेश देना|संदेश]] मानक है जिसे [[समानांतर कंप्यूटिंग]] [[कंप्यूटर आर्किटेक्चर]] पर कार्य करने के लिए डिज़ाइन किया गया है।<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 में प्रारंभिक मसौदा प्रस्ताव, एमपीआई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 में जारी किया गया। इन बैठकों और ईमेल चर्चा ने मिलकर एमपीआई फोरम का गठन किया, जिसकी सदस्यता उच्च के सभी सदस्यों के लिए खुली है- प्रदर्शन कंप्यूटिंग | उच्च-प्रदर्शन-कंप्यूटिंग समुदाय।
सन्देश देने का प्रयास 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 में जारी किया गया। इन बैठकों और ईमेल चर्चा ने मिलकर एमपीआई फोरम का गठन किया, जिसकी सदस्यता उच्च-प्रदर्शन-कंप्यूटिंग समुदाय के सभी सदस्यों के लिए खुली है।


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


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


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


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


== सिंहावलोकन ==
== अवलोकन ==
एमपीआई प्रोग्रामिंग के लिए [[संचार प्रोटोकॉल]] है<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> एमपीआई के लक्ष्य उच्च प्रदर्शन, मापनीयता और सुवाह्यता हैं। एमपीआई आज भी उच्च-प्रदर्शन कंप्यूटिंग में उपयोग किया जाने वाला प्रमुख मॉडल बना हुआ है।<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>
 
एमपीआई को किसी भी प्रमुख मानक निकाय द्वारा स्वीकृत नहीं किया गया है; फिर भी, यह उन प्रक्रियाओं के बीच [[संचार]] के लिए वास्तविक मानक बन गया है जो वितरित मेमोरी प्रणाली पर चल रहे [[समानांतर प्रोग्रामिंग]] को मॉडल करते हैं। वास्तविक वितरित मेमोरी सुपरकंप्यूटर जैसे कंप्यूटर क्लस्टर अधिकांशतः ऐसे प्रोग्राम चलाते हैं।
एमपीआई को किसी भी प्रमुख मानक निकाय द्वारा स्वीकृत नहीं किया गया है; फिर भी, यह उन प्रक्रियाओं के बीच [[संचार]] के लिए वास्तविक मानक बन गया है जो वितरित मेमोरी प्रणाली पर चल रहे [[समानांतर प्रोग्रामिंग]] को मॉडल करते हैं। वास्तविक वितरित मेमोरी सुपरकंप्यूटर जैसे कंप्यूटर क्लस्टर अधिकांशतः ऐसे प्रोग्राम चलाते हैं।


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


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


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


वर्तमान में, मानक के कई संस्करण हैं: संस्करण 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>
एमपीआई कॉल और भाषा बाइंडिंग के लिए [[भाषा स्वतंत्र विशिष्टता]] (एलआईएस) का उपयोग करता है। पहले एमपीआई मानक ने [[ANSI C|एएनएसआई सी]] और फोरट्रान-77 बाइंडिंग को एलआईएस के साथ निर्दिष्ट किया। प्रारूप सुपरकंप्यूटिंग 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>


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


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


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


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


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


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


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


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


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


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


एमपीआई-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 आइटम मिलता है।
Line 65: Line 67:


यहाँ 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 root = 0; /* or whatever */
int send_array [100];
int num_procs, *recv_array;
 
MPI_Comm_size(comm, &num_procs);
इंट रूट = 0; /* या जो कुछ भी */
recv_array = malloc(num_procs * sizeof(send_array));
 
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
int num_procs, *recv_array;
            recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
 
            root, comm);
MPI_Comm_size (कॉम, और num_procs);
चूँकि, आप इसके अतिरिक्त 100 <code>int</code> s के विपरीत ब्लॉक के रूप में डेटा भेजना चाहते हैं। ऐसा करने के लिए सन्निहित ब्लॉक व्युत्पन्न डेटा प्रकार परिभाषित करें:
 
MPI_Datatype newtype;
recv_array = malloc (num_procs * sizeof (send_array));
MPI_Type_contiguous(100, MPI_INT, &newtype);
 
MPI_Type_commit(&newtype);
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
          recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
          रूट, कॉम);
</वाक्यविन्यास हाइलाइट>
 
चूँकि, आप इसके अतिरिक्त 100 के विपरीत ब्लॉक के रूप में डेटा भेजना चाह सकते हैं <code>int</code>एस। ऐसा करने के लिए सन्निहित ब्लॉक व्युत्पन्न डेटा प्रकार परिभाषित करें:
 
<वाक्यविन्यास प्रकाश लैंग = सी>
 
एमपीआई_डेटा प्रकार नया प्रकार;
 
MPI_Type_contiguous(100, MPI_INT, &newtype);
 
MPI_Type_commit (&newtype);
 
MPI_Gather (सरणी, 1, नया प्रकार, प्राप्त_सरणी, 1, नया प्रकार, जड़, कॉम);
 
</वाक्यविन्यास हाइलाइट>


MPI_Gather(array, 1, newtype, receive_array, 1, newtype, root, comm); 
कक्षा या डेटा संरचना पास करने के लिए, <code>MPI_Type_create_struct</code> से एमपीआई व्युत्पन्न डेटा प्रकार बनाता है <code>MPI_predefined</code> डेटा प्रकार, इस प्रकार है:
कक्षा या डेटा संरचना पास करने के लिए, <code>MPI_Type_create_struct</code> से एमपीआई व्युत्पन्न डेटा प्रकार बनाता है <code>MPI_predefined</code> डेटा प्रकार, इस प्रकार है:
int MPI_Type_create_struct(int count,


<वाक्यविन्यास प्रकाश लैंग = सी>
                            int *blocklen,
 
                            MPI_Aint *disp,
int MPI_Type_create_struct (int गिनती,
                            MPI_Datatype *type,
                          इंट *ब्लॉकलेन,
                            MPI_Datatype *newtype)
                          MPI_Aint *डिस्प,
यहाँ:
                          एमपीआई_डेटा प्रकार * प्रकार,
* <code>count</code> कई ब्लॉक हैं, और सरणियों <code>blocklen</code>, <code>disp</code>, और <code>type</code> की लंबाई (तत्वों में) निर्दिष्ट करते हैं
                          MPI_Datatype *newtype)
</वाक्यविन्यास हाइलाइट>
कहाँ:
* <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> (एक आउटपुट) में इस फलन द्वारा बनाया गया नया व्युत्पन्न प्रकार होता है
डेटा संरचना को ब्लॉक के रूप में पास करना एक समय में एक आइटम को पास करने की तुलना में अधिक तेज है, खासकर अगर संचालन को दोहराया जाना है। ऐसा इसलिए है क्योंकि निश्चित आकार के ब्लॉक को स्थानांतरण के समय क्रमांकन की आवश्यकता नहीं होती है।<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>
<code>disp</code> (विस्थापन) सरणी [[डेटा संरचना संरेखण]] के लिए आवश्यक है, क्योंकि संकलक वर्ग या डेटा संरचना में चर को पैड कर सकता है। विभिन्न क्षेत्रों के बीच की दूरी का पता लगाने की सबसे सुरक्षित विधि उनके पते को स्मृति में प्राप्त करना है। यह <code>MPI_Get_address</code> के साथ किया जाता है, जो सामान्यतः C <code>&</code> ऑपरेटर के समान होता है, लेकिन [[स्मृति विभाजन]] से निपटने के समय यह सच नहीं हो सकता है।<ref name=":0">{{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>


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


<वाक्यविन्यास प्रकाश लैंग = सी>
    int f;
संरचना ए {
    short p;
    इंट एफ;
};
    लघु पी;
};
struct B {
 
    struct A a;
संरचना बी {
    int pp, vp;
    संरचना ए ए;
};
    इंट पीपी, वीपी;
};
 
</वाक्यविन्यास हाइलाइट>
 
यहाँ एमपीआई-व्युत्पन्न डेटा प्रकार बनाने के लिए C कोड दिया गया है:
यहाँ एमपीआई-व्युत्पन्न डेटा प्रकार बनाने के लिए C कोड दिया गया है:
  static const int blocklen[] = {1, 1, 1, 1};


<वाक्यविन्यास प्रकाश लैंग = सी>
static const MPI_Aint disp[] = {
 
    offsetof(struct B, a) + offsetof(struct A, f),
स्टेटिक कास्ट इंट ब्लॉकन [] = {1, 1, 1, 1};
    offsetof(struct B, a) + offsetof(struct A, p),
 
    offsetof(struct B, pp),
स्थिर स्थिरांक MPI_Aint विवाद [] = {
    offsetof(struct B, vp)
    ऑफसेट (संरचना बी, ) + ऑफसेट (संरचना ए, एफ),
};
    ऑफसेट (संरचना बी, ) + ऑफसेट (संरचना ए, पी),
static MPI_Datatype type[] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};
    ऑफसेट (संरचना बी, पीपी),
MPI_Datatype newtype;
    ऑफसेट (संरचना बी, वीपी)
MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype);
};
MPI_Type_commit(&newtype);
 
स्थिर 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 अवधारणाएं==


=== एकतरफा संचार ===
=== एकपक्षीय संचार ===
एमपीआई-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> को परिभाषित करता है, जो क्रमशः रिमोट मेमोरी के लिए एक राइट, रिमोट मेमोरी से रीड और एक ही मेमोरी पर कई कार्यों में कमी संचालन है। इस संचार को समन्वयित करने के लिए तीन अलग-अलग तरीकों (वैश्विक, जोड़ीदार और रिमोट लॉक) को भी परिभाषित किया गया है क्योंकि विनिर्देश गारंटी नहीं देता है कि ये संचालन तुल्यकालन बिंदु तक हो चुके हैं।


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


===गतिशील प्रक्रिया प्रबंधन===
===गतिशील प्रक्रिया प्रबंधन===
मुख्य पहलू नई एमपीआई प्रक्रियाओं के निर्माण में भाग लेने या एमपीआई प्रक्रियाओं के साथ संचार स्थापित करने के लिए एमपीआई प्रक्रिया की क्षमता है जो अलग से प्रारंभ की गई है। एमपीआई-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>
मुख्य पहलू नई एमपीआई प्रक्रियाओं के निर्माण में भाग लेने या एमपीआई प्रक्रियाओं के साथ संचार स्थापित करने के लिए एमपीआई प्रक्रिया की क्षमता है जो अलग से प्रारंभ की गई है। एमपीआई-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>




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


इस सुविधा पर किए गए छोटे शोध से संकेत मिलता है कि एमपीआई-आईओ का उपयोग करके उच्च प्रदर्शन लाभ प्राप्त करना तुच्छ नहीं हो सकता है। उदाहरण के लिए, विरल मैट्रिक्स गुणन | मैट्रिक्स-वेक्टर गुणन का कार्यान्वयन एमपीआई आई/ओ पुस्तकालय का उपयोग करके सामान्य प्रदर्शन लाभ का सामान्य व्यवहार दिखाता है, लेकिन ये परिणाम अनिर्णायक हैं।<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> सामूहिक आई/ओ<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|एचडीएफ5]] और [[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>
सामूहिक आई/ओ के विचार तक<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>




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


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


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


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


एमपीआई कार्यान्वयन के [[अनुप्रयोग बाइनरी इंटरफ़ेस]] मोटे तौर पर एमपीआईसीएच और 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>
एमपीआई कार्यान्वयन के [[अनुप्रयोग बाइनरी इंटरफ़ेस]] मोटे तौर पर एमपीआईसीएच और ओपन एमपीआई व्युत्पन्न के बीच विभाजित होते हैं, जिससे परिवार से पुस्तकालय एक ही परिवार से एक के ड्रॉप-इन प्रतिस्थापन के रूप में काम करे, लेकिन परिवारों में प्रत्यक्ष प्रतिस्थापन असंभव है। फ्रांसीसी [[फ्रेंच वैकल्पिक ऊर्जा और परमाणु ऊर्जा आयोग]] ऐसे स्विच की सुविधा के लिए आवरण इंटरफ़ेस रखता है।<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, आदि) प्रोग्राम है जो एमपीआई का उपयोग करने वाले कोड को संकलित करते समय आवश्यक कमांड-लाइन फ़्लैग सेट करने के लिए वर्तमान कंपाइलर पर लपेटता है। सामान्यतः, यह कुछ झंडे जोड़ता है जो कोड को संकलित करने और एमपीआई पुस्तकालय के विरुद्ध लिंक करने में सक्षम बनाता है।<ref>[http://www.mpich.org/static/docs/latest/www1/mpicc.html mpicc]. Mpich.org. Retrieved on 2014-03-24.</ref>
एमपीआईसीसी (और इसी तरह एमपीआईसी++, एमपीआईएफ90, आदि) प्रोग्राम है जो एमपीआई का उपयोग करने वाले कोड को संकलित करते समय आवश्यक कमांड-लाइन फ़्लैग सेट करने के लिए वर्तमान कंपाइलर पर लपेटता है। सामान्यतः, यह कुछ झंडे जोड़ता है जो कोड को संकलित करने और एमपीआई पुस्तकालय के विरुद्ध लिंक करने में सक्षम बनाता है।<ref>[http://www.mpich.org/static/docs/latest/www1/mpicc.html mpicc]. Mpich.org. Retrieved on 2014-03-24.</ref>




Line 215: Line 186:


=== ओकैमल ===
=== ओकैमल ===
ओकैमलएमपीआई मॉड्यूल<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>




Line 224: Line 195:
===पायथन===
===पायथन===
पायथन (प्रोग्रामिंग भाषा) में एमपीआई कार्यान्वयन में [[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>
पायथन (प्रोग्रामिंग भाषा) में एमपीआई कार्यान्वयन में [[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> और साइंटिफिकपायथन में एमपीआई उपमापंक सम्मिलित हैं। पीआईएमपीआई उल्लेखनीय है क्योंकि यह एक प्रकार का पायथन दुभाषिया है, जबकि पाइपर, एमवायएमपीआई और [[वैज्ञानिक अजगर|वैज्ञानिक पायथन]] के मापांक आयात मापांक हैं। वे यह तय करने के लिए कोडर का काम करते हैं कि  <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> बूस्ट [[सी ++ पुस्तकालयों को बढ़ावा दें|C++ पुस्तकालयों]] ने बूस्ट-एमपीआई का अधिग्रहण किया जिसमें एमपीआई पायथन बाइंडिंग सम्मिलित थी।<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++ और पायथन को मिलाने के लिए विशेष रूप से सहायक है। {{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>
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> बूस्ट [[सी ++ पुस्तकालयों को बढ़ावा दें|C++ पुस्तकालयों]] ने बूस्ट-एमपीआई का अधिग्रहण किया जिसमें एमपीआई पायथन बाइंडिंग सम्मिलित थी।<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++ और पायथन को मिलाने के लिए विशेष रूप से सहायक है। {{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>
Line 233: Line 204:


== उदाहरण कार्यक्रम ==
== उदाहरण कार्यक्रम ==
यहाँ एमपीआई में "Hello, World!" प्रोग्राम C में लिखा गया है। इस उदाहरण में, हम प्रत्येक प्रोसेसर को "Hello" संदेश भेजते हैं, इसे तुच्छ रूप से हेरफेर करते हैं, परिणाम को मुख्य प्रक्रिया में लौटाते हैं, और संदेशों को प्रिंट करते हैं।
यहाँ एमपीआई में "Hello, World!" प्रोग्राम C में लिखा गया है। इस उदाहरण में, हम प्रत्येक प्रोसेसर को "Hello" संदेश भेजते हैं, इसे तुच्छ रूप से हेरफेर करते हैं, परिणाम को मुख्य प्रक्रिया में लौटाते हैं, और संदेशों को प्रिंट करते हैं।<syntaxhighlight>
   /*
/*
   "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);


  "Hello World" MPI Test Program
         /* Send messages to all other processes */
*/
        for (other_rank = 1; other_rank < num_procs; other_rank++)
#include <assert.h>
        {
#include <stdio.h>
            sprintf(buf, "Hello %i!", other_rank);
#include <string.h>
            MPI_Send(buf, 256, MPI_CHAR, other_rank,
#include <mpi.h>
                    0, MPI_COMM_WORLD);
        }
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;
जब 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''
        /* 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);
        }


''We have 4 processes.''
    } else {


''Process 1 reporting for duty.''
        /* 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);


''Process 2 reporting for duty.''
        /* 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);


''Process 3 reporting for duty.''
    }


यहाँ, <code>mpiexec</code> 4 प्रक्रियाओं (कंप्यूटिंग) के साथ उदाहरण कार्यक्रम को निष्पादित करने के लिए उपयोग किया जाने वाला कमांड है, जिनमें से प्रत्येक रन टाइम पर प्रोग्राम का स्वतंत्र उदाहरण है और निर्दिष्ट रैंक (अर्थात संख्यात्मक आईडी) 0, 1, 2 और 3 है। एमपीआई मानक द्वारा <code>mpiexec</code> नाम अनुशंसित है, चूंकि कुछ कार्यान्वयन <code>mpirun</code> नाम के अनुसार एक समान आदेश प्रदान करते हैं। <code>MPI_COMM_WORLD</code> संचारक है जिसमें सभी प्रक्रियाएं सम्मिलित हैं।
    /* Tear down the communication infrastructure */
    MPI_Finalize();
    return 0;
}
</syntaxhighlight>जब 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><syntaxhighlight>
$ 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.
</syntaxhighlight>यहाँ, <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 प्रक्रिया पर आशा के अनुसार काम करता है, और कुछ कार्यान्वयन अन्य प्रक्रियाओं से आउटपुट को कैप्चर और फ़नल भी करते हैं।
इस प्रकार एकल कार्यक्रम, एकाधिक डेटा (एसपीएमडी) प्रोग्रामिंग मॉडल को सुगम बनाया गया है, लेकिन इसकी आवश्यकता नहीं है; कई एमपीआई कार्यान्वयन एक ही एमपीआई नौकरी में एकाधिक, अलग-अलग निष्पादन योग्य प्रारंभ करने की अनुमति देते हैं। प्रत्येक प्रक्रिया की अपनी रैंक होती है, विश्व में प्रक्रियाओं की कुल संख्या, और उनके बीच संचार करने की क्षमता बिंदु से बिंदु (भेजें / प्राप्त करें) संचार, या समूह के बीच सामूहिक संचार द्वारा होती है। एमपीआई के लिए <code>MPI_COMM_WORLD</code> अपनी रैंक, और विश्व के आकार के साथ एसपीएमडी-शैली कार्यक्रम प्रदान करना पर्याप्त है, जिससे कलनविधि को यह तय करने की अनुमति मिल सके कि क्या करना है। अधिक यथार्थवादी स्थितियों में, आई/ओ को इस उदाहरण की तुलना में अधिक सावधानी से प्रबंधित किया जाता है। एमपीआई यह निर्धारित नहीं करता है कि किसी दिए गए प्रणाली पर मानक आई/ओ (स्टडिन, स्टडआउट, स्टेडर) को कैसे काम करना चाहिए। यह सामान्यतः रैंक-0 प्रक्रिया पर आशा के अनुसार काम करता है, और कुछ कार्यान्वयन अन्य प्रक्रियाओं से आउटपुट को कैप्चर और फ़नल भी करते हैं।
Line 324: Line 289:
एमपीआई के भविष्य के कुछ पहलू ठोस और दूसरों को इतना कम दिखाई देते हैं। एमपीआई फोरम ने कुछ एमपीआई-2 उद्देश्यों को स्पष्ट करने और संभावित एमपीआई-3 के विकास का पता लगाने के लिए 2007 में फिर से बैठक की, जिसके परिणामस्वरूप एमपीआई-3.0 (सितंबर 2012) और एमपीआई-3.1 (जून 2015) के संस्करण सामने आए थे।
एमपीआई के भविष्य के कुछ पहलू ठोस और दूसरों को इतना कम दिखाई देते हैं। एमपीआई फोरम ने कुछ एमपीआई-2 उद्देश्यों को स्पष्ट करने और संभावित एमपीआई-3 के विकास का पता लगाने के लिए 2007 में फिर से बैठक की, जिसके परिणामस्वरूप एमपीआई-3.0 (सितंबर 2012) और एमपीआई-3.1 (जून 2015) के संस्करण सामने आए थे।


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


एस्ट्रोफिजिसिस्ट जोनाथन डर्सी ने [[एमपीआई फोरम]] को अप्रचलित कहते हुए विचार लिखी, जिसमें चैपल (प्रोग्रामिंग भाषा) भाषा, [[एकीकृत समानांतर सी|एकीकृत समानांतर C]], [[अपाचे हडूप]], [[अपाचे स्पार्क]] और [[अपाचे फ्लैश]] जैसी नई विधियों की ओर संकेत किया गया।<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 की प्रारंभ तक सबसे बड़ी मशीनों के पैमाने पर दिखाया गया है और आने वाले लंबे समय तक प्रासंगिक रहने के लिए व्यापक रूप से माना जाता है।
एस्ट्रोफिजिसिस्ट जोनाथन डर्सी ने [[एमपीआई फोरम]] को अप्रचलित कहते हुए विचार लिखी, जिसमें चैपल (प्रोग्रामिंग भाषा) भाषा, [[एकीकृत समानांतर सी|एकीकृत समानांतर C]], [[अपाचे हडूप]], [[अपाचे स्पार्क]] और [[अपाचे फ्लैश]] जैसी नई विधियों की ओर संकेत किया गया।<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 402: Line 367:
* [https://www.citutor.org/bounce.php?course=21 Tutorial: Introduction to एमपीआई (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: Machine Translated Page]]
[[Category:All articles containing potentially dated statements]]
[[Category:Articles containing potentially dated statements from October 2016]]
[[Category:Articles with Curlie links]]
[[Category:Articles with invalid date parameter in template]]
[[Category:CS1 English-language sources (en)]]
[[Category:Collapse templates]]
[[Category:Created On 17/02/2023]]
[[Category:Created On 17/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Multi-column templates]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Official website not in Wikidata]]
[[Category:Pages using div col with small parameter]]
[[Category:Pages with script errors]]
[[Category:Pages with syntax highlighting errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Templates using under-protected Lua modules]]
[[Category:Wikipedia fully protected templates|Div col]]
[[Category:Wikipedia metatemplates]]
[[Category:उदाहरण सी कोड वाले लेख]]
[[Category:एप्लिकेशन प्रोग्रामिंग इंटरफेस]]
[[Category:समानांतर कंप्यूटिंग]]

Latest revision as of 11:28, 8 September 2023

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

इतिहास

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

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

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

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

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

अवलोकन

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

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

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

चूँकि एमपीआई ओएसआई संदर्भ मॉडल की 5 और उच्चतर परतों से संबंधित है, कार्यान्वयन में अधिकांश परतें सम्मिलित हो सकती हैं, जिसमें इंटरनेट सॉकेट और प्रसारण नियंत्रण प्रोटोकॉल (टीसीपी) का उपयोग ट्रांसपोर्ट परत में किया जाता है।

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

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

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

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

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

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

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

कार्यक्षमता

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

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

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

अवधारणाएं

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

संचारक

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

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

पॉइंट-टू-पॉइंट मूल बातें

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

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

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

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

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

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

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

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

int send_array[100];
int root = 0; /* or whatever */
int num_procs, *recv_array;
MPI_Comm_size(comm, &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,
           root, comm);

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

MPI_Datatype newtype;
MPI_Type_contiguous(100, MPI_INT, &newtype);
MPI_Type_commit(&newtype);
MPI_Gather(array, 1, newtype, receive_array, 1, newtype, root, comm);  

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

int MPI_Type_create_struct(int count,
                           int *blocklen,
                           MPI_Aint *disp,
                           MPI_Datatype *type,
                           MPI_Datatype *newtype)

यहाँ:

  • count कई ब्लॉक हैं, और सरणियों blocklen, disp, और type की लंबाई (तत्वों में) निर्दिष्ट करते हैं
  • blocklen प्रत्येक ब्लॉक में तत्वों की संख्या सम्मिलित है,
  • disp प्रत्येक ब्लॉक के बाइट विस्थापन सम्मिलित हैं,
  • type प्रत्येक ब्लॉक में तत्व के प्रकार होते हैं।
  • newtype (एक आउटपुट) में इस फलन द्वारा बनाया गया नया व्युत्पन्न प्रकार होता है

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

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

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

 struct A {
    int f;
    short p;
};

struct B {
    struct A a;
    int pp, vp;
};

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

  static const int blocklen[] = {1, 1, 1, 1};
static const MPI_Aint disp[] = {
    offsetof(struct B, a) + offsetof(struct A, f),
    offsetof(struct B, a) + offsetof(struct A, p),
    offsetof(struct B, pp),
    offsetof(struct B, vp)
};
static MPI_Datatype type[] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};
MPI_Datatype newtype;
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] के विचार को एमपीआई-आईओ में प्रयुक्त किए जाने तक ऐसा नहीं था कि एमपीआई-आईओ ने व्यापक रूप से अपनाना प्रारंभ कर दिया। सामूहिक आई/ओ प्रक्रियाओं को सामूहिक रूप से छोटे और गैर-सन्निहित आई/ओ संचालन को बड़े और सन्निहित लोगों में परिवर्तित करके अनुप्रयोगों के आई/ओ बैंडविड्थ को अधिक सीमा तक बढ़ा देता है, जिससे रिकॉर्ड लॉकिंग और डिस्क ओवरहेड कम हो जाता है। अपने विशाल प्रदर्शन लाभों के कारण, एमपीआई-आईओ कई अत्याधुनिक आई/ओ पुस्तकालयों, जैसे एचडीएफ5 और नेटसीडीएफ के लिए अंतर्निहित आई/ओ परत भी बन गया। इसकी लोकप्रियता ने सामूहिक आई/ओ अनुकूलन पर अनुसंधान को भी गति प्रदान की, जैसे कि लेआउट-जागरूक आई/ओ[24] और क्रॉस-फ़ाइल एकत्रीकरण।[25][26]


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

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

कई अन्य प्रयास एमपीआईसीएच, एलएएम, और अन्य कार्यों के व्युत्पन्न हैं, जिनमें हेवलेट-पैकर्ड, इंटेल, माइक्रोसॉफ्ट और एनईसी के व्यावसायिक कार्यान्वयन सम्मिलित हैं, लेकिन इन तक सीमित नहीं हैं।

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

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


हार्डवेयर

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

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

कंपाइलर रैपर

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


भाषा बंधन

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

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

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

जावा

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

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

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

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

जूलिया

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


मैटलैब

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

ओकैमल

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


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

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

पायथन

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

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


आर

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

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

यहाँ एमपीआई में "Hello, World!" प्रोग्राम C में लिखा गया है। इस उदाहरण में, हम प्रत्येक प्रोसेसर को "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;
}

जब 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 नोड के अंदर साझा-स्मृति समानता का उपयोग करने की क्षमता जोड़ता है। एमपीआई के कार्यान्वयन जैसे अनुकूली एमपीआई, हाइब्रिड एमपीआई, फाइन-ग्रेन्ड एमपीआई, एमपीसी और अन्य एमपीआई मानक के विस्तार की प्रस्तुति करते हैं जो एमपीआई में विभिन्न चुनौतियों का समाधान करते हैं।

एस्ट्रोफिजिसिस्ट जोनाथन डर्सी ने एमपीआई फोरम को अप्रचलित कहते हुए विचार लिखी, जिसमें चैपल (प्रोग्रामिंग भाषा) भाषा, एकीकृत समानांतर C, अपाचे हडूप, अपाचे स्पार्क और अपाचे फ्लैश जैसी नई विधियों की ओर संकेत किया गया।[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.


अग्रिम पठन


बाहरी संबंध