मैसेज पासिंग इंटरफ़ेस
संदेश पासिंग इंटरफ़ेस (MPI) मानकीकृत और पोर्टेबल संदेश देना मानक है जिसे समानांतर कंप्यूटिंग कंप्यूटर आर्किटेक्चर पर कार्य करने के लिए डिज़ाइन किया गया है।[1] MPI मानक सिंटैक्स (प्रोग्रामिंग भाषाएं) और पुस्तकालय दिनचर्या के शब्दार्थ को परिभाषित करता है जो C (प्रोग्रामिंग लैंग्वेज), C ++ और फोरट्रान में सॉफ्टवेयर पोर्टेबिलिटी मैसेज-पासिंग प्रोग्राम लिखने वाले उपयोगकर्ताओं की विस्तृत श्रृंखला के लिए उपयोगी है। कई खुला स्त्रोत एमपीआई प्रोग्रामिंग भाषा कार्यान्वयन हैं, जो समानांतर सॉफ्टवेयर उद्योग के विकास को बढ़ावा देते हैं, और पोर्टेबल और स्केलेबल बड़े पैमाने पर समानांतर अनुप्रयोगों के विकास को प्रोत्साहित करते हैं।
इतिहास
सन्देश देने का प्रयास 1991 की गर्मियों में शुरू हुआ जब शोधकर्ताओं के छोटे समूह ने ऑस्ट्रिया में पर्वत वापसी पर चर्चा शुरू की। उस चर्चा से विलियम्सबर्ग, वर्जीनिया में 29-30 अप्रैल, 1992 को आयोजित वितरित स्मृति पर्यावरण में संदेश पारित करने के मानकों पर कार्यशाला आई।[2] विलियम्सबर्ग में उपस्थित लोगों ने मानक संदेश देने वाले इंटरफ़ेस के लिए आवश्यक बुनियादी सुविधाओं पर चर्चा की और मानकीकरण प्रक्रिया को जारी रखने के लिए कार्यदल की स्थापना की। जैक डोंगरा, टोनी हे, और डेविड डब्ल्यू वॉकर ने नवंबर 1992 में प्रारंभिक मसौदा प्रस्ताव, MPI1 पेश किया। नवंबर 1992 में MPI कार्यकारी समूह की बैठक मिनियापोलिस में हुई और मानकीकरण प्रक्रिया को अधिक औपचारिक स्तर पर रखने का निर्णय लिया गया। 1993 के पहले 9 महीनों में हर 6 सप्ताह में MPI कार्यकारी समूह की बैठक हुई। MPI मानक का मसौदा नवंबर 1993 में सुपरकंप्यूटिंग '93 सम्मेलन में प्रस्तुत किया गया था।[3] सार्वजनिक टिप्पणियों की अवधि के बाद, जिसके परिणामस्वरूप MPI में कुछ बदलाव हुए, MPI का संस्करण 1.0 जून 1994 में जारी किया गया। इन बैठकों और ईमेल चर्चा ने मिलकर MPI फोरम का गठन किया, जिसकी सदस्यता उच्च के सभी सदस्यों के लिए खुली है- प्रदर्शन कंप्यूटिंग | उच्च-प्रदर्शन-कंप्यूटिंग समुदाय।
MPI प्रयास में 40 संगठनों के लगभग 80 लोग शामिल थे, मुख्य रूप से संयुक्त राज्य अमेरिका और यूरोप में। विश्वविद्यालयों, सरकारी प्रयोगशालाओं और निजी उद्योग के शोधकर्ताओं के सहयोग से समवर्ती कंप्यूटरों के अधिकांश प्रमुख विक्रेता एमपीआई प्रयास में शामिल थे।
एमपीआई समानांतर हार्डवेयर विक्रेताओं को दिनचर्या के स्पष्ट रूप से परिभाषित आधार सेट प्रदान करता है जिसे कुशलतापूर्वक कार्यान्वित किया जा सकता है। नतीजतन, हार्डवेयर विक्रेता मानक निम्न-स्तरीय प्रोग्रामिंग भाषा के इस संग्रह पर निर्माण कर सकते हैं। उच्च-स्तरीय प्रोग्रामिंग भाषा बनाने के लिए निम्न-स्तरीय रूटीन। उनकी समानांतर मशीन के साथ वितरित-मेमोरी संचार वातावरण के लिए उच्च-स्तरीय रूटीन। एमपीआई मूल उपयोगकर्ता के लिए उपयोग में आसान पोर्टेबल इंटरफ़ेस प्रदान करता है, फिर भी प्रोग्रामर को उन्नत मशीनों पर उपलब्ध उच्च-प्रदर्शन संदेश पासिंग ऑपरेशंस का उपयोग करने की अनुमति देने के लिए पर्याप्त शक्तिशाली है।
संदेश भेजने के लिए सार्वभौमिक मानक बनाने के प्रयास में, शोधकर्ताओं ने इसे प्रणाली के आधार पर नहीं बनाया बल्कि इसमें कई प्रणालियों की सबसे उपयोगी विशेषताओं को शामिल किया, जिनमें IBM, Intel, nCUBE, PVM, Express, P4 और PARMACS द्वारा डिज़ाइन किए गए शामिल हैं। . व्यापक पोर्टेबिलिटी के कारण संदेश-पासिंग प्रतिमान आकर्षक है और वितरित-मेमोरी और साझा-मेमोरी मल्टीप्रोसेसर, वर्कस्टेशन के नेटवर्क और इन तत्वों के संयोजन के लिए संचार में उपयोग किया जा सकता है। प्रतिमान कई सेटिंग्स में लागू हो सकता है, नेटवर्क गति या मेमोरी आर्किटेक्चर से स्वतंत्र।
MPI बैठकों के लिए समर्थन आंशिक रूप से DARPA और यूएस राष्ट्रीय विज्ञान संस्था (NSF) से अनुदान ASC-9310330, NSF विज्ञान और प्रौद्योगिकी केंद्र सहकारी समझौते संख्या CCR-8809615, और यूरोपीय आयोग से Esprit Project P6643 के माध्यम से आया। टेनेसी विश्वविद्यालय ने भी एमपीआई फोरम में वित्तीय योगदान दिया।
सिंहावलोकन
MPI प्रोग्रामिंग के लिए संचार प्रोटोकॉल है[4] समानांतर कंप्यूटर। पॉइंट-टू-पॉइंट और सामूहिक संचार दोनों समर्थित हैं। एमपीआई संदेश-पासिंग एप्लिकेशन प्रोग्रामर इंटरफ़ेस है, साथ में प्रोटोकॉल और सिमेंटिक विनिर्देशों के साथ किसी कार्यान्वयन में इसकी विशेषताओं को कैसे व्यवहार करना चाहिए।[5] एमपीआई के लक्ष्य उच्च प्रदर्शन, मापनीयता और सुवाह्यता हैं। MPI आज भी उच्च-प्रदर्शन कंप्यूटिंग में उपयोग किया जाने वाला प्रमुख मॉडल बना हुआ है।[6] MPI को किसी भी प्रमुख मानक निकाय द्वारा स्वीकृत नहीं किया गया है; फिर भी, यह उन प्रक्रियाओं के बीच संचार के लिए वास्तविक मानक बन गया है जो वितरित मेमोरी सिस्टम पर चल रहे समानांतर प्रोग्रामिंग को मॉडल करते हैं। वास्तविक वितरित मेमोरी सुपरकंप्यूटर जैसे कंप्यूटर क्लस्टर अक्सर ऐसे प्रोग्राम चलाते हैं।
प्रमुख MPI-1 मॉडल में कोई साझा मेमोरी अवधारणा नहीं है, और MPI-2 में केवल सीमित वितरित साझा मेमोरी अवधारणा है। फिर भी, MPI प्रोग्राम नियमित रूप से साझा मेमोरी कंप्यूटर पर चलाए जाते हैं, और MPICH और Open MPI दोनों उपलब्ध होने पर संदेश हस्तांतरण के लिए साझा मेमोरी का उपयोग कर सकते हैं।[7][8] एमपीआई मॉडल के आसपास डिजाइनिंग कार्यक्रम (स्पष्ट साझा मेमोरी (इंटरप्रोसेस संचार) मॉडल के विपरीत) गैर-वर्दी मेमोरी एक्सेस आर्किटेक्चर पर चलते समय लाभ होता है क्योंकि एमपीआई संदर्भ के स्थानीयता को प्रोत्साहित करता है। MPI-3 में स्पष्ट साझा मेमोरी प्रोग्रामिंग पेश की गई थी।[9][10][11] हालाँकि MPI OSI संदर्भ मॉडल की 5 और उच्चतर परतों से संबंधित है, कार्यान्वयन में अधिकांश परतें शामिल हो सकती हैं, जिसमें इंटरनेट सॉकेट और प्रसारण नियंत्रण प्रोटोकॉल (TCP) का उपयोग ट्रांसपोर्ट लेयर में किया जाता है।
अधिकांश एमपीआई कार्यान्वयन में सी (प्रोग्रामिंग भाषा), सी ++, फोरट्रान (यानी, एपीआई) से सीधे कॉल करने योग्य दिनचर्या का विशिष्ट सेट होता है और सी शार्प (प्रोग्रामिंग भाषा) सहित ऐसी पुस्तकालयों के साथ इंटरफेस करने में सक्षम कोई भी भाषा शामिल है। सी#, जावा (प्रोग्रामिंग भाषा) भाषा) या पायथन (प्रोग्रामिंग भाषा)। पुराने संदेश पासिंग पुस्तकालयों पर एमपीआई के फायदे पोर्टेबिलिटी हैं (क्योंकि एमपीआई लगभग हर वितरित मेमोरी आर्किटेक्चर के लिए कार्यान्वित किया गया है) और गति (क्योंकि प्रत्येक कार्यान्वयन हार्डवेयर के लिए सिद्धांत रूप से अनुकूलित है जिस पर यह चलता है)।
एमपीआई कॉल और भाषा बाइंडिंग के लिए भाषा स्वतंत्र विशिष्टता (एलआईएस) का उपयोग करता है। पहले MPI मानक ने ANSI C और फोरट्रान-77 बाइंडिंग को LIS के साथ निर्दिष्ट किया। मसौदा सुपरकंप्यूटिंग 1994 (नवंबर 1994) में प्रस्तुत किया गया था[12] और उसके तुरंत बाद अंतिम रूप दिया। लगभग 128 कार्य MPI-1.3 मानक का गठन करते हैं जो 2008 में MPI-1 श्रृंखला के अंतिम अंत के रूप में जारी किया गया था।[13]
वर्तमान में, मानक के कई संस्करण हैं: संस्करण 1.3 (आमतौर पर संक्षिप्त MPI-1), जो संदेश पारित करने पर जोर देता है और स्थिर रनटाइम वातावरण, MPI-2.2 (MPI-2) है, जिसमें समानांतर I/O जैसी नई सुविधाएँ शामिल हैं, गतिशील प्रक्रिया प्रबंधन और दूरस्थ स्मृति संचालन,[14] और MPI-3.1 (MPI-3), जिसमें गैर-अवरुद्ध संस्करणों के साथ सामूहिक संचालन के विस्तार और एकतरफा संचालन के विस्तार शामिल हैं।[15] MPI-2 का LIS 500 से अधिक कार्यों को निर्दिष्ट करता है और ISO C (प्रोग्रामिंग लैंग्वेज), ISO C++, और फोरट्रान 90 के लिए लैंग्वेज बाइंडिंग प्रदान करता है। आसान मिश्रित-भाषा संदेश पासिंग प्रोग्रामिंग की अनुमति देने के लिए ऑब्जेक्ट इंटरऑपरेबिलिटी भी जोड़ी गई थी। MPI-2 के मानकीकरण का दुष्परिणाम, जो 1996 में पूरा हुआ, MPI-1 मानक को स्पष्ट कर रहा था, जिससे MPI-1.2 का निर्माण हुआ।
MPI-2 ज्यादातर MPI-1 का सुपरसेट है, हालांकि कुछ कार्यों को हटा दिया गया है। MPI-1.3 प्रोग्राम अभी भी MPI-2 मानक के अनुरूप MPI कार्यान्वयन के तहत काम करते हैं।
MPI-3 में नए फोरट्रान 2008 बाइंडिंग शामिल हैं, जबकि यह पदावनत C++ बाइंडिंग के साथ-साथ कई पदावनत रूटीन और MPI ऑब्जेक्ट्स को हटाता है।
MPI की तुलना अक्सर समानांतर वर्चुअल मशीन (PVM) से की जाती है, जो 1989 में विकसित लोकप्रिय वितरित वातावरण और संदेश पासिंग सिस्टम है, और जो उन प्रणालियों में से एक थी जो मानक समानांतर संदेश पासिंग की आवश्यकता को प्रेरित करती थी। थ्रेडेड साझा मेमोरी प्रोग्रामिंग मॉडल (जैसे Pthreads और OpenMP) और मैसेज पासिंग प्रोग्रामिंग (MPI/PVM) को पूरक माना जा सकता है और उदाहरण के लिए, कई बड़े साझा-मेमोरी नोड्स वाले सर्वर में एक साथ उपयोग किया गया है।
कार्यक्षमता
MPI इंटरफ़ेस भाषा-विशिष्ट सिंटैक्स (बाइंडिंग) के साथ भाषा-स्वतंत्र तरीके से प्रक्रियाओं के सेट (जो नोड्स/सर्वर/कंप्यूटर उदाहरणों के लिए मैप किया गया है) के बीच आवश्यक आभासी टोपोलॉजी, सिंक्रनाइज़ेशन और संचार कार्यक्षमता प्रदान करने के लिए है। साथ ही कुछ भाषा-विशिष्ट सुविधाएँ। एमपीआई प्रोग्राम हमेशा प्रक्रियाओं के साथ काम करते हैं, लेकिन प्रोग्रामर आमतौर पर प्रक्रियाओं को प्रोसेसर के रूप में संदर्भित करते हैं। आमतौर पर, अधिकतम प्रदर्शन के लिए, प्रत्येक CPU (या मल्टी-कोर मशीन में मल्टी-कोर (कम्प्यूटिंग)) को केवल एक ही प्रक्रिया सौंपी जाएगी। यह असाइनमेंट रनटाइम पर उस एजेंट के माध्यम से होता है जो MPI प्रोग्राम शुरू करता है, जिसे आमतौर पर mpirun या mpiexec कहा जाता है।
MPI लाइब्रेरी फ़ंक्शंस में शामिल हैं, लेकिन पॉइंट-टू-पॉइंट रेंडेवस-टाइप सेंड / रिसीव ऑपरेशंस तक सीमित नहीं हैं, कार्तीय वृक्ष या ग्राफ़ (डेटा स्ट्रक्चर) के बीच चयन करना - जैसे लॉजिकल प्रोसेस टोपोलॉजी, प्रोसेस जोड़े के बीच डेटा का आदान-प्रदान करना (भेजना / प्राप्त करना) संचालन), संगणनाओं के आंशिक परिणामों का संयोजन (संचालन इकट्ठा करना और कम करना), नोड्स को सिंक्रनाइज़ करना (बाधा संचालन) साथ ही साथ नेटवर्क से संबंधित जानकारी प्राप्त करना जैसे कि कंप्यूटिंग सत्र में प्रक्रियाओं की संख्या, वर्तमान प्रोसेसर पहचान जो प्रक्रिया को मैप की जाती है, तार्किक टोपोलॉजी में पड़ोसी प्रक्रियाएं सुलभ हैं, और इसी तरह। पॉइंट-टू-पॉइंट ऑपरेशंस तादात्म्य (कंप्यूटर साइंस), एसिंक्रोनस आई / ओ, बफ़र्ड और रेडी फॉर्म में आते हैं, जो मिलन-स्थल-भेजने के सिंक्रोनाइज़ेशन पहलुओं के लिए अपेक्षाकृत मजबूत और कमजोर शब्दार्थ दोनों की अनुमति देते हैं। कई बकाया अधिकांश कार्यान्वयनों में एसिंक्रोनस मोड में संचालन संभव है।
MPI-1 और MPI-2 दोनों कार्यान्वयन को सक्षम करते हैं जो संचार और संगणना को ओवरलैप करते हैं, लेकिन अभ्यास और सिद्धांत भिन्न होते हैं। एमपीआई थ्रेड सुरक्षित इंटरफेस भी निर्दिष्ट करता है, जिसमें सामंजस्य (कंप्यूटर विज्ञान) और युग्मन (कंप्यूटर विज्ञान) रणनीतियां होती हैं जो इंटरफ़ेस के भीतर छिपे हुए राज्य से बचने में मदद करती हैं। मल्टीथ्रेडेड पॉइंट-टू-पॉइंट एमपीआई कोड लिखना अपेक्षाकृत आसान है, और कुछ कार्यान्वयन ऐसे कोड का समर्थन करते हैं। मल्टीथ्रेडिंग (कंप्यूटर आर्किटेक्चर) सामूहिक संचार कम्युनिकेटर्स की कई प्रतियों के साथ सबसे अच्छा होता है, जैसा कि नीचे बताया गया है।
अवधारणाएं
MPI कई सुविधाएँ प्रदान करता है। निम्नलिखित अवधारणाएं उन सभी क्षमताओं के लिए संदर्भ प्रदान करती हैं और प्रोग्रामर को यह तय करने में मदद करती हैं कि उनके एप्लिकेशन प्रोग्राम में किस कार्यक्षमता का उपयोग किया जाए। MPI की आठ बुनियादी अवधारणाओं में से चार MPI-2 के लिए अद्वितीय हैं।
कम्युनिकेटर
कम्युनिकेटर ऑब्जेक्ट MPI सत्र में प्रक्रियाओं के समूह को जोड़ता है। प्रत्येक कम्युनिकेटर प्रत्येक निहित प्रक्रिया को स्वतंत्र पहचानकर्ता देता है और आदेशित टोपोलॉजी (बहुविकल्पी) में अपनी निहित प्रक्रियाओं को व्यवस्थित करता है। MPI में स्पष्ट समूह भी हैं, लेकिन ये मुख्य रूप से किसी अन्य संचारक के बनने से पहले प्रक्रियाओं के समूहों को व्यवस्थित और पुनर्गठित करने के लिए अच्छे हैं। MPI सिंगल ग्रुप इंट्राकम्यूनिकेटर ऑपरेशंस और द्विपक्षीय इंटरकम्युनिकेटर कम्युनिकेशन को समझता है। MPI-1 में, एकल समूह संचालन सबसे अधिक प्रचलित हैं। द्विपक्षीय तुल्यकालन संचालन ज्यादातर MPI-2 में दिखाई देते हैं जहां वे सामूहिक संचार और गतिशील इन-प्रोसेस प्रबंधन शामिल करते हैं।
कई MPI कमांड का उपयोग करके संचारकों को विभाजित किया जा सकता है। इन आदेशों में शामिल हैं MPI_COMM_SPLIT
, जहां प्रत्येक प्रक्रिया स्वयं को वह रंग होने की घोषणा करके कई रंगीन उप-संचारकों में से एक से जोड़ती है।
पॉइंट-टू-पॉइंट बेसिक्स
कई महत्वपूर्ण एमपीआई कार्यों में दो विशिष्ट प्रक्रियाओं के बीच संचार शामिल है। प्रचलित उदाहरण है MPI_Send
, जो निर्दिष्ट प्रक्रिया को दूसरी निर्दिष्ट प्रक्रिया को संदेश भेजने की अनुमति देता है। पॉइंट-टू-पॉइंट ऑपरेशंस, जैसा कि इन्हें कहा जाता है, विशेष रूप से पैटर्न या अनियमित संचार में उपयोगी होते हैं, उदाहरण के लिए, डेटा समानता | डेटा-समानांतर आर्किटेक्चर जिसमें प्रत्येक प्रोसेसर नियमित रूप से गणना चरणों के बीच विशिष्ट अन्य प्रोसेसर के साथ डेटा के क्षेत्रों को स्वैप करता है, या मास्टर/स्लेव (प्रौद्योगिकी) | मास्टर-स्लेव आर्किटेक्चर जिसमें मास्टर दास को नया कार्य डेटा भेजता है जब भी पूर्व कार्य पूरा हो जाता है।
MPI-1 अवरोधन (कंप्यूटिंग) और नॉन-ब्लॉकिंग पॉइंट-टू-पॉइंट कम्युनिकेशन मैकेनिज्म के साथ-साथ तथाकथित 'रेडी-सेंड' मैकेनिज्म दोनों के लिए मैकेनिज्म को निर्दिष्ट करता है, जिससे सेंड रिक्वेस्ट तभी की जा सकती है, जब मैचिंग रिसीव रिक्वेस्ट हो पहले ही बना दिया गया है।
सामूहिक मूल बातें
सामूहिक संचालन में प्रक्रिया समूह में सभी प्रक्रियाओं के बीच संचार शामिल होता है (जिसका अर्थ संपूर्ण प्रक्रिया पूल या प्रोग्राम-परिभाषित सबसेट हो सकता है)। विशिष्ट कार्य है MPI_Bcast
कॉल (प्रसारण (कंप्यूटिंग) के लिए संक्षिप्त)। यह फ़ंक्शन नोड से डेटा लेता है और इसे प्रक्रिया समूह में सभी प्रक्रियाओं को भेजता है। रिवर्स ऑपरेशन है MPI_Reduce
कॉल, जो समूह में सभी प्रक्रियाओं से डेटा लेता है, ऑपरेशन (जैसे योग) करता है, और परिणामों को नोड पर संग्रहीत करता है। MPI_Reduce
बड़ी वितरित गणना की शुरुआत या अंत में अक्सर उपयोगी होता है, जहां प्रत्येक प्रोसेसर डेटा के एक हिस्से पर काम करता है और फिर इसे परिणाम में जोड़ता है।
अन्य ऑपरेशन अधिक परिष्कृत कार्य करते हैं, जैसे MPI_Alltoall
जो डेटा के n आइटम को पुनर्व्यवस्थित करता है जैसे कि nth नोड को प्रत्येक से डेटा का nth आइटम मिलता है।
व्युत्पन्न डेटा प्रकार
कई एमपीआई कार्यों के लिए आवश्यक है कि आप प्रक्रियाओं के बीच भेजे जाने वाले डेटा के प्रकार को निर्दिष्ट करें। ऐसा इसलिए है क्योंकि एमपीआई का लक्ष्य विषम वातावरणों का समर्थन करना है जहां विभिन्न नोड्स पर अलग-अलग प्रकारों का प्रतिनिधित्व किया जा सकता है[16] (उदाहरण के लिए वे अलग-अलग सीपीयू आर्किटेक्चर चला रहे होंगे जिनमें अलग-अलग अंतराल हैं), जिस स्थिति में एमपीआई कार्यान्वयन डेटा रूपांतरण कर सकता है।[16]चूंकि सी भाषा एक प्रकार को पैरामीटर के रूप में पारित करने की अनुमति नहीं देती है, एमपीआई स्थिरांक को पूर्वनिर्धारित करता है MPI_INT
, MPI_CHAR
, MPI_DOUBLE
के साथ मेल खाना int
, char
, double
, वगैरह।
यहाँ C में उदाहरण दिया गया है जो सरणियों को पास करता है int
सभी प्रक्रियाओं से एक तक। प्राप्त करने वाली प्रक्रिया को रूट प्रक्रिया कहा जाता है, और यह कोई भी नामित प्रक्रिया हो सकती है लेकिन आम तौर पर यह प्रक्रिया 0 होगी। सभी प्रक्रियाएं अपने सरणियों को रूट के साथ भेजने के लिए कहती हैं MPI_Gather
, जो प्रत्येक प्रक्रिया (रूट सहित) कॉल करने के बराबर है MPI_Send
और रूट ऑर्डर की इसी संख्या को बनाते हैं MPI_Recv
इन सभी सरणियों को बड़े में इकट्ठा करने के लिए कहता है:[17]
<वाक्यविन्यास प्रकाश लैंग = सी>
int send_array [100];
इंट रूट = 0; /* या जो कुछ भी */
int num_procs, *recv_array;
MPI_Comm_size (कॉम, और num_procs);
recv_array = malloc (num_procs * sizeof (send_array));
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT, रूट, कॉम);
</वाक्यविन्यास हाइलाइट>
हालाँकि, आप इसके बजाय 100 के विपरीत ब्लॉक के रूप में डेटा भेजना चाह सकते हैं int
एस। ऐसा करने के लिए सन्निहित ब्लॉक व्युत्पन्न डेटा प्रकार परिभाषित करें:
<वाक्यविन्यास प्रकाश लैंग = सी>
एमपीआई_डेटा प्रकार नया प्रकार;
MPI_Type_contiguous(100, MPI_INT, &newtype);
MPI_Type_commit (&newtype);
MPI_Gather (सरणी, 1, नया प्रकार, प्राप्त_सरणी, 1, नया प्रकार, जड़, कॉम);
</वाक्यविन्यास हाइलाइट>
कक्षा या डेटा संरचना पास करने के लिए, MPI_Type_create_struct
से MPI व्युत्पन्न डेटा प्रकार बनाता है MPI_predefined
डेटा प्रकार, इस प्रकार है:
<वाक्यविन्यास प्रकाश लैंग = सी>
int MPI_Type_create_struct (int गिनती,
इंट *ब्लॉकलेन, MPI_Aint *डिस्प, एमपीआई_डेटा प्रकार * प्रकार, MPI_Datatype *newtype)
</वाक्यविन्यास हाइलाइट> कहाँ:
count
कई ब्लॉक हैं, और सरणियों की लंबाई (तत्वों में) निर्दिष्ट करते हैंblocklen
,disp
, औरtype
.blocklen
प्रत्येक ब्लॉक में तत्वों की संख्या शामिल है,disp
प्रत्येक ब्लॉक के बाइट विस्थापन शामिल हैं,type
प्रत्येक ब्लॉक में तत्व के प्रकार होते हैं।newtype
(एक आउटपुट) में इस फ़ंक्शन द्वारा बनाया गया नया व्युत्पन्न प्रकार होता हैdisp
ई> (विस्थापन) सरणी डेटा संरचना संरेखण के लिए आवश्यक है, क्योंकि संकलक वर्ग या डेटा संरचना में चर को पैड कर सकता है। विभिन्न क्षेत्रों के बीच की दूरी का पता लगाने का सबसे सुरक्षित तरीका उनके पते को स्मृति में प्राप्त करना है। इसके साथ किया जाता हैMPI_Get_address
, जो आमतौर पर C के समान होता है&
ऑपरेटर लेकिन स्मृति विभाजन से निपटने के दौरान यह सच नहीं हो सकता है।[18]
डेटा संरचना को ब्लॉक के रूप में पास करना एक समय में एक आइटम को पास करने की तुलना में काफी तेज है, खासकर अगर ऑपरेशन को दोहराया जाना है। ऐसा इसलिए है क्योंकि निश्चित आकार के ब्लॉक को स्थानांतरण के दौरान क्रमांकन की आवश्यकता नहीं होती है।[19] निम्नलिखित डेटा संरचनाओं को देखते हुए: <वाक्यविन्यास प्रकाश लैंग = सी> संरचना ए {
इंट एफ; लघु पी;
};
संरचना बी {
संरचना ए ए; इंट पीपी, वीपी;
}; </वाक्यविन्यास हाइलाइट>
यहाँ MPI-व्युत्पन्न डेटा प्रकार बनाने के लिए C कोड दिया गया है: <वाक्यविन्यास प्रकाश लैंग = सी> स्टेटिक कास्ट इंट ब्लॉकन [] = {1, 1, 1, 1}; स्थिर स्थिरांक MPI_Aint विवाद [] = {
ऑफसेट (संरचना बी, ए) + ऑफसेट (संरचना ए, एफ), ऑफसेट (संरचना बी, ए) + ऑफसेट (संरचना ए, पी), ऑफसेट (संरचना बी, पीपी), ऑफसेट (संरचना बी, वीपी)
}; स्थिर MPI_Datatype प्रकार [] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT}; एमपीआई_डेटा प्रकार नया प्रकार; MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype); MPI_Type_commit (&newtype); </वाक्यविन्यास हाइलाइट>
एमपीआई-2 अवधारणाएं
एकतरफा संचार
MPI-2 तीन एकतरफा संचार संचालन को परिभाषित करता है, MPI_Put
, MPI_Get
, और MPI_Accumulate
, दूरस्थ स्मृति के लिए लेखन, दूरस्थ स्मृति से पठन, और क्रमशः कई कार्यों में एक ही स्मृति पर कमी संचालन। इस संचार को सिंक्रनाइज़ करने के लिए तीन अलग-अलग तरीकों को भी परिभाषित किया गया है (वैश्विक, जोड़ीदार और रिमोट लॉक) क्योंकि विनिर्देश गारंटी नहीं देता है कि ये ऑपरेशन सिंक्रनाइज़ेशन बिंदु तक हो चुके हैं।
इस प्रकार की कॉल अक्सर कलनविधि के लिए उपयोगी हो सकती हैं जिसमें सिंक्रनाइज़ेशन असुविधाजनक होगा (जैसे वितरित मैट्रिक्स गुणन), या जहां यह वांछनीय है कि कार्य अपने लोड को संतुलित करने में सक्षम हों जबकि अन्य प्रोसेसर डेटा पर काम कर रहे हों।
गतिशील प्रक्रिया प्रबंधन
मुख्य पहलू नई एमपीआई प्रक्रियाओं के निर्माण में भाग लेने या एमपीआई प्रक्रियाओं के साथ संचार स्थापित करने के लिए एमपीआई प्रक्रिया की क्षमता है जो अलग से शुरू की गई है। MPI-2 विनिर्देश तीन मुख्य इंटरफेस का वर्णन करता है जिसके द्वारा MPI प्रक्रियाएं गतिशील रूप से संचार स्थापित कर सकती हैं, MPI_Comm_spawn
, MPI_Comm_accept
/MPI_Comm_connect
और MPI_Comm_join
. MPI_Comm_spawn
ई> इंटरफ़ेस एमपीआई प्रक्रिया को नामित एमपीआई प्रक्रिया के कई उदाहरणों को उत्पन्न करने की अनुमति देता है। MPI प्रक्रियाओं का नव निर्मित सेट नया रूप बनाता है MPI_COMM_WORLD
इंट्राकम्यूनिकेटर लेकिन माता-पिता के साथ संवाद कर सकता है और इंटरकम्युनिकेटर फ़ंक्शन लौटाता है। MPI_Comm_spawn_multiple
वैकल्पिक इंटरफ़ेस है जो अलग-अलग उदाहरणों को अलग-अलग तर्कों के साथ अलग-अलग बाइनरी बनाने की अनुमति देता है।[20]
एन/ओ
समांतर I/O सुविधा को कभी-कभी MPI-IO कहा जाता है,[21] और MPI को वितरित सिस्टम पर अमूर्त I/O प्रबंधन के लिए डिज़ाइन किए गए कार्यों के सेट को संदर्भित करता है, और मौजूदा व्युत्पन्न डेटाटाइप कार्यक्षमता का उपयोग करके फ़ाइलों को आसानी से पैटर्न तरीके से एक्सेस करने की अनुमति देता है।
इस सुविधा पर किए गए छोटे शोध से संकेत मिलता है कि MPI-IO का उपयोग करके उच्च प्रदर्शन लाभ प्राप्त करना तुच्छ नहीं हो सकता है। उदाहरण के लिए, विरल मैट्रिक्स गुणन | मैट्रिक्स-वेक्टर गुणन का कार्यान्वयन MPI I/O लाइब्रेरी का उपयोग करके मामूली प्रदर्शन लाभ का सामान्य व्यवहार दिखाता है, लेकिन ये परिणाम अनिर्णायक हैं।[22] यह नहीं था सामूहिक I/O के विचार तक[23] MPI-IO में लागू किया गया कि MPI-IO व्यापक रूप से अपनाना शुरू कर दिया। सामूहिक I/O प्रक्रियाओं को सामूहिक रूप से छोटे और गैर-सन्निहित I/O संचालन को बड़े और सन्निहित लोगों में परिवर्तित करके अनुप्रयोगों के I/O बैंडविड्थ को काफी हद तक बढ़ा देता है, जिससे रिकॉर्ड लॉकिंग और डिस्क ओवरहेड कम हो जाता है। अपने विशाल प्रदर्शन लाभों के कारण, MPI-IO कई अत्याधुनिक I/O पुस्तकालयों, जैसे HDF5 और NetCDF के लिए अंतर्निहित I/O परत भी बन गया। इसकी लोकप्रियता ने सामूहिक I/O अनुकूलन पर अनुसंधान को भी गति प्रदान की, जैसे कि लेआउट-जागरूक I/O[24] और क्रॉस-फ़ाइल एकत्रीकरण।[25][26]
आधिकारिक कार्यान्वयन
- MPI 1.x मानक का प्रारंभिक कार्यान्वयन Argonne National Laboratory (ANL) और मिसिसिपी स्टेट यूनिवर्सिटी से MPICH था। आईबीएम भी शुरुआती कार्यान्वयनकर्ता था, और 90 के दशक की शुरुआती सुपरकंप्यूटर कंपनियों ने या तो MPICH का व्यावसायीकरण किया, या अपने स्वयं के कार्यान्वयन का निर्माण किया। ओहियो सुपरकंप्यूटर सेंटर से एलएएम/एमपीआई एक और शुरुआती खुला कार्यान्वयन था। ANL ने एक दशक से अधिक समय से MPICH का विकास जारी रखा है, और अब MPICH-3.2 प्रदान करता है, MPI-3.1 मानक को लागू करता है।
- ओपन एमपीआई (ओपनएमपी के साथ भ्रमित नहीं होना चाहिए) एफटी-एमपीआई, एलए-एमपीआई, एलएएम/एमपीआई और पैक्स-एमपीआई को मिलाकर बनाया गया था, और यह कई शीर्ष 500 सुपर कंप्यूटर में पाया जाता है।
कई अन्य प्रयास MPICH, LAM, और अन्य कार्यों के डेरिवेटिव हैं, जिनमें Hewlett-Packard, Intel, Microsoft और NEC के व्यावसायिक कार्यान्वयन शामिल हैं, लेकिन इन तक सीमित नहीं हैं।
जबकि विनिर्देश एक सी और फोरट्रान इंटरफ़ेस को अनिवार्य करते हैं, एमपीआई को लागू करने के लिए इस्तेमाल की जाने वाली भाषा रनटाइम पर समर्थन करने वाली भाषा या भाषाओं से मेल खाने के लिए बाध्य नहीं है। अधिकांश कार्यान्वयन सी, सी ++ और असेंबली भाषा को जोड़ते हैं, और सी, सी ++ और फोरट्रान प्रोग्रामर को लक्षित करते हैं। पर्ल, पायथन, आर, रूबी, जावा और नियंत्रण भाषा सहित कई अन्य भाषाओं के लिए बाइंडिंग उपलब्ध हैं (#Language बाइंडिंग देखें)।
MPI कार्यान्वयन के अनुप्रयोग बाइनरी इंटरफ़ेस मोटे तौर पर MPICH और Open MPI डेरिवेटिव के बीच विभाजित होते हैं, ताकि परिवार से पुस्तकालय एक ही परिवार से एक के ड्रॉप-इन प्रतिस्थापन के रूप में काम करे, लेकिन परिवारों में प्रत्यक्ष प्रतिस्थापन असंभव है। फ्रांसीसी फ्रेंच वैकल्पिक ऊर्जा और परमाणु ऊर्जा आयोग ऐसे स्विच की सुविधा के लिए आवरण इंटरफ़ेस रखता है।[27]
हार्डवेयर
एमपीआई हार्डवेयर अनुसंधान एमपीआई को सीधे हार्डवेयर में लागू करने पर ध्यान केंद्रित करता है, उदाहरण के लिए प्रोसेसर-इन-मेमोरी के माध्यम से, प्रत्येक नोड में रैंडम एक्सेस मेमोरी चिप्स के माइक्रोक्रिकिट्री में एमपीआई संचालन का निर्माण। निहितार्थ से, यह दृष्टिकोण भाषा, ऑपरेटिंग सिस्टम और सीपीयू से स्वतंत्र है, लेकिन इसे आसानी से अपडेट या हटाया नहीं जा सकता है।
ऑपरेशन के एक या एक से अधिक भागों में हार्डवेयर त्वरण जोड़ने के लिए एक अन्य दृष्टिकोण रहा है, जिसमें एमपीआई कतारों के हार्डवेयर प्रसंस्करण और सीपीयू या ओएस कर्नेल हस्तक्षेप के बिना मेमोरी और नेटवर्क इंटरफ़ेस नियंत्रक के बीच डेटा को सीधे स्थानांतरित करने के लिए रिमोट डायरेक्ट मेमोरी एक्सेस का उपयोग करना शामिल है।
कंपाइलर रैपर
mpicc (और इसी तरह mpic++, mpif90, आदि) प्रोग्राम है जो MPI का उपयोग करने वाले कोड को संकलित करते समय आवश्यक कमांड-लाइन फ़्लैग सेट करने के लिए मौजूदा कंपाइलर पर लपेटता है। आम तौर पर, यह कुछ झंडे जोड़ता है जो कोड को संकलित करने और एमपीआई लाइब्रेरी के खिलाफ लिंक करने में सक्षम बनाता है।[28]
भाषा बंधन
भाषा बाध्यकारी पुस्तकालय हैं जो एमपीआईसी या ओपन एमपीआई जैसे मौजूदा एमपीआई कार्यान्वयन को लपेटकर एमपीआई समर्थन को अन्य भाषाओं में विस्तारित करते हैं।
सामान्य भाषा अवसंरचना
दो प्रबंधित कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर .NET Framework|.NET कार्यान्वयन शुद्ध Mpi.NET हैं[29] और एमपीआई.नेट,[30] बीएसडी-शैली लाइसेंस के तहत लाइसेंस प्राप्त इंडियाना विश्वविद्यालय में एक शोध प्रयास। यह मोनो (सॉफ्टवेयर) के साथ संगत है, और अंतर्निहित निम्न-विलंबता MPI नेटवर्क फैब्रिक्स का पूर्ण उपयोग कर सकता है।
जावा
हालांकि जावा (प्रोग्रामिंग भाषा) में आधिकारिक एमपीआई बाध्यकारी नहीं है, कई समूह सफलता और अनुकूलता के विभिन्न स्तरों के साथ दोनों को पाटने का प्रयास करते हैं। पहले प्रयासों में से एक था ब्रायन कारपेंटर का mpiJava,[31] अनिवार्य रूप से स्थानीय सी एमपीआई लाइब्रेरी के लिए जावा मूल इंटरफ़ेस (जेएनआई) रैपर का सेट, जिसके परिणामस्वरूप सीमित पोर्टेबिलिटी के साथ हाइब्रिड कार्यान्वयन होता है, जिसे उपयोग की जा रही विशिष्ट एमपीआई लाइब्रेरी के खिलाफ भी संकलित किया जाना है।
हालाँकि, इस मूल परियोजना ने mpiJava API को भी परिभाषित किया[32] (जावा के लिए वास्तविक एमपीआई एपीआई जो समतुल्य सी ++ बाइंडिंग का बारीकी से पालन करता है) जिसे अन्य बाद के जावा एमपीआई परियोजनाओं ने अपनाया। एक कम उपयोग किया जाने वाला एपीआई एमपीजे एपीआई है, जिसे अधिक ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग और सन माइक्रोसिस्टम्स के कोडिंग सम्मेलनों के करीब होने के लिए डिज़ाइन किया गया था।[33] एपीआई से परे, जावा एमपीआई पुस्तकालय या तो स्थानीय एमपीआई पुस्तकालय पर निर्भर हो सकते हैं, या जावा में संदेश पासिंग फ़ंक्शन को लागू कर सकते हैं, जबकि कुछ पी 2 P2P-एमपीआई भी पीयर टू पीयर कार्यक्षमता प्रदान करते हैं और मिश्रित-प्लेटफ़ॉर्म ऑपरेशन की अनुमति देते हैं।
जावा/एमपीआई के कुछ सबसे चुनौतीपूर्ण हिस्से जावा विशेषताओं से उत्पन्न होते हैं जैसे स्पष्ट डेटा पॉइंटर की कमी और इसकी वस्तुओं के लिए फ्लैट मेमोरी मॉडल एड्रेस स्पेस, जो बहुआयामी सरणियों और जटिल वस्तुओं को अक्षम बनाता है। वर्कअराउंड में आमतौर पर एक समय में एक पंक्ति को स्थानांतरित करना और / या स्पष्ट डी-सीरियलाइज़ेशन और कास्ट (कंप्यूटर साइंस) दोनों भेजने और प्राप्त करने के अंत में, एक-आयामी सरणी, और पॉइंटर्स के उपयोग से सी या फोरट्रान-जैसे सरणियों का अनुकरण करना शामिल है। एकल-तत्व सरणियों के उपयोग से आदिम प्रकारों के लिए, इस प्रकार प्रोग्रामिंग शैलियों को जावा सम्मेलनों से काफी दूर कर दिया गया।
एक अन्य जावा संदेश पासिंग सिस्टम एमपीजे एक्सप्रेस है।[34] हाल के संस्करणों को क्लस्टर और मल्टीकोर कॉन्फ़िगरेशन में निष्पादित किया जा सकता है। क्लस्टर कॉन्फ़िगरेशन में, यह क्लस्टर और बादलों पर समांतर जावा अनुप्रयोगों को निष्पादित कर सकता है। यहाँ जावा सॉकेट्स या विशेष I/O इंटरकनेक्ट जैसे Myrinet MPJ एक्सप्रेस प्रक्रियाओं के बीच संदेश भेजने का समर्थन कर सकते हैं। यह अपने मूल डिवाइस का उपयोग करके एमपीआई के मूल सी कार्यान्वयन का भी उपयोग कर सकता है। मल्टीकोर कॉन्फ़िगरेशन में, समानांतर जावा एप्लिकेशन को मल्टीकोर प्रोसेसर पर निष्पादित किया जाता है। इस मोड में, एमपीजे एक्सप्रेस प्रक्रियाओं को जावा थ्रेड्स द्वारा दर्शाया जाता है।
जूलिया
MPI के लिए जूलिया (प्रोग्रामिंग लैंग्वेज) लैंग्वेज रैपर है।[35]
MATLAB
MATLAB का उपयोग करके MPI के कुछ अकादमिक कार्यान्वयन हैं। MATLAB की अपनी समानांतर एक्सटेंशन लाइब्रेरी है जिसे MPI और समानांतर वर्चुअल मशीन का उपयोग करके लागू किया गया है।
ओकैमल
OCamlMPI मॉड्यूल[36] एमपीआई कार्यों का बड़ा सबसेट लागू करता है और वैज्ञानिक कंप्यूटिंग में सक्रिय उपयोग में है। 11,000-लाइन OCaml प्रोग्राम मॉड्यूल का उपयोग करके एमपीआई-इफीड था, कोड की अतिरिक्त 500 लाइनों और मामूली पुनर्गठन के साथ और सुपरकंप्यूटर में 170 नोड्स तक उत्कृष्ट परिणाम के साथ चला।[37]
पारी/जीपी
पारी/जीपी बनाया जा सकता है[38] MPI को अपने मल्टी-थ्रेड इंजन के रूप में उपयोग करने के लिए, MPI क्लस्टर पर समानांतर PARI और GP प्रोग्राम चलाने की अनुमति देता है।
पायथन
पायथन (प्रोग्रामिंग भाषा) में MPI कार्यान्वयन में शामिल हैं: pyMPI, mpi4py,[39] पीपर,[40] एमआईएमपीआई,[41] और साइंटिफिकपायथन में एमपीआई सबमॉड्यूल। पीआईएमपीआई उल्लेखनीय है क्योंकि यह एक प्रकार का अजगर दुभाषिया है, जबकि पाइपर, एमवायएमपीआई और वैज्ञानिक अजगर के मॉड्यूल आयात मॉड्यूल हैं। वे यह तय करने के लिए कोडर का काम करते हैं कि कॉल कहां करें MPI_Init
संबंधित है।
2006 में[42] सी ++ पुस्तकालयों को बढ़ावा दें ने बूस्ट:एमपीआई का अधिग्रहण किया जिसमें एमपीआई पायथन बाइंडिंग शामिल थी।[43] यह C++ और Python को मिलाने के लिए विशेष रूप से मददगार है। As of October 2016[update] बूस्ट: MPI के पायथन बाइंडिंग में अभी भी CentOS में अनफिक्स पैकेजिंग बग हैं।[44]
आर
MPI की R (प्रोग्रामिंग भाषा) बाइंडिंग में Rmpi शामिल है[45] और आर में बिग डेटा के साथ प्रोग्रामिंग,[46] जहां आरएमपीआई मास्टर/स्लेव (प्रौद्योगिकी) पर ध्यान केंद्रित करता है। प्रबंधक-श्रमिक समानता जबकि पीबीडीएमपीआई एसपीएमडी समानता पर केंद्रित है। दोनों कार्यान्वयन Open MPI या MPICH2 का पूरी तरह से समर्थन करते हैं।
उदाहरण कार्यक्रम
यहाँ हैलो, विश्व है! MPI में प्रोग्राम C में लिखा गया है। इस उदाहरण में, हम प्रत्येक प्रोसेसर को हैलो संदेश भेजते हैं, इसे तुच्छ रूप से हेरफेर करते हैं, परिणाम को मुख्य प्रक्रिया में लौटाते हैं, और संदेशों को प्रिंट करते हैं।
<वाक्यविन्यास प्रकाश लैंग = सी> /*
हैलो वर्ल्ड एमपीआई टेस्ट प्रोग्राम
- /
- शामिल <assert.h>
- शामिल <stdio.h>
- शामिल <string.h>
- शामिल <mpi.h>
इंट मेन (इंट एआरजीसी, चार ** एआरजीवी) {
चार बुफ [256]; int my_rank, num_procs;
/* संचार के लिए आवश्यक बुनियादी ढाँचे को प्रारंभ करें */ MPI_Init(&argc, &argv);
/* इस प्रक्रिया को पहचानें */ MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
/ * पता करें कि कुल कितनी प्रक्रियाएँ सक्रिय हैं * / MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
/* इस बिंदु तक, सभी प्रोग्राम ठीक वैसा ही करते रहे हैं। यहां, हम प्रोग्राम की भूमिकाओं में अंतर करने के लिए रैंक की जांच करते हैं */ अगर (my_rank == 0) { int अन्य रैंक; प्रिंटफ (हमारे पास% i प्रक्रियाएं हैं। \ n, num_procs);
/* अन्य सभी प्रक्रियाओं को संदेश भेजें */ के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++) { स्प्रिंटफ (बफ, हैलो% i! , अन्य_रैंक); MPI_Send (buf, 256, MPI_CHAR, अन्य_रैंक, 0, MPI_COMM_WORLD); }
/* अन्य सभी प्रक्रियाओं से संदेश प्राप्त करें */ के लिए (अन्य_रैंक = 1; अन्य_रैंक <num_procs; अन्य_रैंक ++) { MPI_Recv(buf, 256, MPI_CHAR, अन्य_रैंक, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); प्रिंटफ (% s \ n, बीयूएफ); }
} अन्य {
/* प्रक्रिया #0 से संदेश प्राप्त करें */ MPI_Recv(buf, 256, MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); जोर दें (memcmp (buf, हैलो, 6) == 0);
/* प्रोसेस करने के लिए संदेश भेजें #0 */ sprintf(buf, ड्यूटी के लिए %i रिपोर्टिंग प्रोसेस करें। , my_rank); MPI_Send(buf, 256, MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
/* कम्युनिकेशन इंफ्रास्ट्रक्चर को खत्म करें */ MPI_Finalize (); वापसी 0;
} </वाक्यविन्यास हाइलाइट>
जब 4 प्रक्रियाओं के साथ चलाया जाता है, तो इसे निम्न आउटपुट का उत्पादन करना चाहिए:[47]
<पूर्व>
$ mpicc example.c && mpiexec -n 4 ./a.out
हमारे पास 4 प्रक्रियाएँ हैं।
प्रक्रिया 1 ड्यूटी के लिए रिपोर्टिंग।
प्रक्रिया 2 ड्यूटी के लिए रिपोर्टिंग।
प्रक्रिया 3 ड्यूटी के लिए रिपोर्टिंग।
</पूर्व>
यहाँ, mpiexec
कमांड है जिसका उपयोग 4 प्रक्रियाओं (कंप्यूटिंग) के साथ उदाहरण कार्यक्रम को निष्पादित करने के लिए किया जाता है, जिनमें से प्रत्येक रन टाइम पर प्रोग्राम का स्वतंत्र उदाहरण है और निर्दिष्ट रैंक (यानी संख्यात्मक आईडी) 0, 1, 2 और 3 है। नाम mpiexec
एमपीआई मानक द्वारा अनुशंसित है, हालांकि कुछ कार्यान्वयन नाम के तहत एक समान आदेश प्रदान करते हैं mpirun
. MPI_COMM_WORLD
e> कम्युनिकेटर है जिसमें सभी प्रक्रियाएं शामिल हैं।
इस प्रकार एकल कार्यक्रम, एकाधिक डेटा (एसपीएमडी) प्रोग्रामिंग मॉडल को सुगम बनाया गया है, लेकिन इसकी आवश्यकता नहीं है; कई एमपीआई कार्यान्वयन एक ही एमपीआई नौकरी में एकाधिक, अलग-अलग निष्पादन योग्य शुरू करने की अनुमति देते हैं। प्रत्येक प्रक्रिया की अपनी रैंक होती है, दुनिया में प्रक्रियाओं की कुल संख्या, और उनके बीच संचार करने की क्षमता बिंदु से बिंदु (भेजें / प्राप्त करें) संचार, या समूह के बीच सामूहिक संचार द्वारा। एमपीआई के लिए एसपीएमडी-शैली कार्यक्रम प्रदान करना पर्याप्त है MPI_COMM_WORLD
, इसकी अपनी रैंक, और दुनिया का आकार कलनविधि को यह तय करने की अनुमति देता है कि क्या करना है। अधिक यथार्थवादी स्थितियों में, I/O को इस उदाहरण की तुलना में अधिक सावधानी से प्रबंधित किया जाता है। MPI यह निर्धारित नहीं करता है कि किसी दिए गए सिस्टम पर मानक I/O (stdin, stdout, stderr) को कैसे काम करना चाहिए। यह आम तौर पर रैंक-0 प्रक्रिया पर उम्मीद के मुताबिक काम करता है, और कुछ कार्यान्वयन अन्य प्रक्रियाओं से आउटपुट को कैप्चर और फ़नल भी करते हैं।
एमपीआई प्रोसेसर के बजाय प्रक्रिया की धारणा का उपयोग करता है। MPI रनटाइम प्रणाली द्वारा प्रोग्राम कॉपी को प्रोसेसर से मैप किया जाता है। इस अर्थ में, समानांतर मशीन भौतिक प्रोसेसर या एन प्रोसेसर के लिए मैप कर सकती है, जहां एन उपलब्ध प्रोसेसर की संख्या है, या बीच में कुछ भी है। अधिकतम समांतर स्पीडअप के लिए, अधिक भौतिक प्रोसेसर का उपयोग किया जाता है। यह उदाहरण विश्व एन के आकार के लिए अपने व्यवहार को समायोजित करता है, इसलिए यह प्रत्येक आकार भिन्नता के संकलन के बिना रनटाइम कॉन्फ़िगरेशन को स्केल करने का भी प्रयास करता है, हालांकि रनटाइम के निर्णय उपलब्ध संगामिति की पूर्ण मात्रा के आधार पर भिन्न हो सकते हैं।
MPI-2 गोद लेने
MPI-1.2 को अपनाना सार्वभौमिक रहा है, विशेष रूप से क्लस्टर कंप्यूटिंग में, लेकिन MPI-2.1 की स्वीकृति अधिक सीमित रही है। मुद्दों में शामिल हैं:
- MPI-2 कार्यान्वयन में I/O और गतिशील प्रक्रिया प्रबंधन शामिल है, और मिडलवेयर का आकार काफी बड़ा है। अधिकांश साइटें जो बैच शेड्यूलिंग सिस्टम का उपयोग करती हैं, गतिशील प्रक्रिया प्रबंधन का समर्थन नहीं कर सकती हैं। MPI-2 का समानांतर I/O अच्छी तरह से स्वीकृत है।
- MPI-2 से पहले कई MPI-1.2 प्रोग्राम विकसित किए गए थे। सुवाह्यता की चिंताओं ने शुरुआत में अपनाने को धीमा कर दिया, हालांकि व्यापक समर्थन ने इसे कम कर दिया है।
- कई MPI-1.2 एप्लिकेशन उस मानक (16-25 फ़ंक्शंस) के केवल एक सबसेट का उपयोग करते हैं, जिसमें MPI-2 कार्यक्षमता की कोई वास्तविक आवश्यकता नहीं होती है।
भविष्य
MPI के भविष्य के कुछ पहलू ठोस दिखाई देते हैं; दूसरों को इतना कम। MPI फोरम ने कुछ MPI-2 मुद्दों को स्पष्ट करने और संभावित MPI-3 के विकास का पता लगाने के लिए 2007 में फिर से बैठक की, जिसके परिणामस्वरूप MPI-3.0 (सितंबर 2012) और MPI-3.1 (जून 2015) के संस्करण सामने आए।
आर्किटेक्चर बदल रहे हैं, अधिक आंतरिक संगामिति (मल्टी-कोर प्रोसेसर | मल्टी-कोर), बेहतर सूक्ष्म संगामिति नियंत्रण (थ्रेडिंग, एफ़िनिटी), और मेमोरी पदानुक्रम के अधिक स्तर। मल्टीथ्रेडिंग (कंप्यूटर आर्किटेक्चर) प्रोग्राम सिंगल-थ्रेडेड एप्लिकेशन की तुलना में इन विकासों का अधिक आसानी से लाभ उठा सकते हैं। यह पहले से ही सममित बहु प्रसंस्करण, अर्थात् ओपनएमपी के लिए अलग, पूरक मानकों को प्राप्त कर चुका है। MPI-2 परिभाषित करता है कि मानक-अनुरूप कार्यान्वयन को बहुप्रचारित मुद्दों से कैसे निपटना चाहिए, लेकिन इसके लिए यह आवश्यक नहीं है कि कार्यान्वयन बहुप्रचारित या थ्रेड-सुरक्षित हो। MPI-3 नोड के भीतर साझा-स्मृति समानता का उपयोग करने की क्षमता जोड़ता है। एमपीआई के कार्यान्वयन जैसे अनुकूली एमपीआई, हाइब्रिड एमपीआई, फाइन-ग्रेन्ड एमपीआई, एमपीसी और अन्य एमपीआई मानक के विस्तार की पेशकश करते हैं जो एमपीआई में विभिन्न चुनौतियों का समाधान करते हैं।
एस्ट्रोफिजिसिस्ट जोनाथन डर्सी ने एमपीआई फोरम अप्रचलित कहते हुए राय लिखी, जिसमें चैपल (प्रोग्रामिंग लैंग्वेज) लैंग्वेज, एकीकृत समानांतर सी, अपाचे हडूप, अपाचे स्पार्क और अपाचे फ्लैश जैसी नई तकनीकों की ओर इशारा किया गया।[48] इसी समय, एक्सास्केल कंप्यूटिंग में लगभग सभी परियोजनाएं एमपीआई पर स्पष्ट रूप से निर्मित होती हैं; MPI को 2020 की शुरुआत तक सबसे बड़ी मशीनों के पैमाने पर दिखाया गया है और आने वाले लंबे समय तक प्रासंगिक रहने के लिए व्यापक रूप से माना जाता है।
यह भी देखें
- अभिनेता मॉडल
- थोक तुल्यकालिक समानांतर
- कैलटेक कॉस्मिक क्यूब
- आकर्षण ++
- सह-सरणी फोरट्रान
- वैश्विक सरणियाँ
- माइक्रोसॉफ्ट मैसेजिंग पासिंग इंटरफेस
- एमवापीच
- ओपनएचएमपीपी
- समानांतर वर्चुअल मशीन (PVM)
- विभाजित वैश्विक पता स्थान
- एकीकृत समानांतर सी
- X10 (प्रोग्रामिंग भाषा)
संदर्भ
- ↑ "Message Passing Interface :: High Performance Computing". hpc.nmsu.edu. Retrieved 2022-08-06.
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ Gropp, Lusk & Skjellum 1996, p. 3
- ↑ 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.
- ↑ 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."
- ↑ "FAQ: Tuning the run-time characteristics of MPI sm communications". www.open-mpi.org.
- ↑ 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"
- ↑ 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."
- ↑ Using MPI-3 Shared Memory As a Multicore Programming System (PDF presentation slides)
- ↑ Table of Contents — September 1994, 8 (3-4). Hpc.sagepub.com. Retrieved on 2014-03-24.
- ↑ दस्तावेज़। एमपीआई-forum.org। 2014-03-24 को पुनःप्राप्त।
- ↑ Gropp, Lusk & Skjellum 1999b, pp. 4–5
- ↑ MPI: एक संदेश-पासिंग इंटरफ़ेस मानक
संस्करण 3.1, संदेश पासिंग इंटरफ़ेस फ़ोरम, 4 जून, 2015। http://www.mpi-forum.org. 2015-06-16 को पुनःप्राप्त। - ↑ 16.0 16.1 "Type matching rules". mpi-forum.org.
- ↑ "MPI_Gather(3) man page (version 1.8.8)". www.open-mpi.org.
- ↑ "MPI_Get_address". www.mpich.org.
- ↑ Boost.MPI Skeleton/Content Mechanism rationale (performance comparison graphs were produced using NetPIPE)
- ↑ Gropp, Lusk & Skjelling 1999b, p. 7
- ↑ Gropp, Lusk & Skjelling 1999b, pp. 5–6
- ↑ "Sparse matrix-vector multiplications using the MPI I/O library" (PDF).
- ↑ "Data Sieving and Collective I/O in ROMIO" (PDF). IEEE. Feb 1999.
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ cea-hpc. "cea-hpc/wi4mpi: Wrapper interface for MPI". GitHub (in English).
- ↑ mpicc. Mpich.org. Retrieved on 2014-03-24.
- ↑ Pure Mpi.NET
- ↑ "MPI.NET: High-Performance C# Library for Message Passing". www.osl.iu.edu.
- ↑ "mpiJava Home Page". www.hpjava.org.
- ↑ "Introduction to the mpiJava API". www.hpjava.org.
- ↑ "The MPJ API Specification". www.hpjava.org.
- ↑ "MPJ Express Project". mpj-express.org.
- ↑ JuliaParallel/MPI.jl, Parallel Julia, 2019-10-03, retrieved 2019-10-08
- ↑ "Xavier Leroy - Software". cristal.inria.fr.
- ↑ Archives of the Caml mailing list > Message from Yaron M. Minsky. Caml.inria.fr (2003-07-15). Retrieved on 2014-03-24.
- ↑ "Introduction to parallel GP" (PDF). pari.math.u-bordeaux.fr.
- ↑ "Google Code Archive - Long-term storage for Google Code Project Hosting". code.google.com.
- ↑ "Google Code Archive - Long-term storage for Google Code Project Hosting". code.google.com.
- ↑ Now part of Pydusa
- ↑ "Boost.MPI Revision History". www.boost.org.
- ↑ "Python Bindings - 1.35.0". www.boost.org.
- ↑ "0006498: Package boost-*mpi-python is missing python module - CentOS Bug Tracker". bugs.centos.org.
- ↑ Yu, Hao (2002). "Rmpi: Parallel Statistical Computing in R". R News.
- ↑ Chen, Wei-Chen; Ostrouchov, George; Schmidt, Drew; Patel, Pragneshkumar; Yu, Hao (2012). "pbdMPI: Programming with Big Data -- Interface to MPI".
- ↑ 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.
- ↑ "HPC is dying, and MPI is killing it". www.dursi.ca.
अग्रिम पठन
- This article is based on material taken from Message Passing Interface at the Free On-line Dictionary of Computing prior to 1 November 2008 and incorporated under the "relicensing" terms of the GFDL, version 1.3 or later.
- Aoyama, Yukiya; Nakano, Jun (1999) RS/6000 SP: Practical MPI Programming, ITSO
- Foster, Ian (1995) Designing and Building Parallel Programs (Online) Addison-Wesley ISBN 0-201-57594-9, chapter 8 Message Passing Interface
- Wijesuriya, Viraj Brian (2010-12-29) Daniweb: Sample Code for Matrix Multiplication using MPI Parallel Programming Approach
- Using MPI series:
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1994). Using MPI: portable parallel programming with the message-passing interface. Cambridge, MA, USA: MIT Press Scientific And Engineering Computation Series. ISBN 978-0-262-57104-3.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1999a). Using MPI, 2nd Edition: Portable Parallel Programming with the Message Passing Interface. Cambridge, MA, USA: MIT Press Scientific And Engineering Computation Series. ISBN 978-0-262-57132-6.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1999b). Using MPI-2: Advanced Features of the Message Passing Interface. MIT Press. ISBN 978-0-262-57133-3.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (2014). Using MPI, 3rd edition: Portable Parallel Programming with the Message-Passing Interface. Cambridge, MA, USA: MIT Press Scientific And Engineering Computation Series. ISBN 978-0-262-52739-2.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1996). "A High-Performance, Portable Implementation of the MPI Message Passing Interface". Parallel Computing. 22 (6): 789–828. CiteSeerX 10.1.1.102.9485. doi:10.1016/0167-8191(96)00024-5.
- Pacheco, Peter S. (1997) Parallel Programming with MPI.[1] 500 pp. Morgan Kaufmann ISBN 1-55860-339-5.
- MPI—The Complete Reference series:
- Snir, Marc; Otto, Steve W.; Huss-Lederman, Steven; Walker, David W.; Dongarra, Jack J. (1995) MPI: The Complete Reference. MIT Press Cambridge, MA, USA. ISBN 0-262-69215-5
- Snir, Marc; Otto, Steve W.; Huss-Lederman, Steven; Walker, David W.; Dongarra, Jack J. (1998) MPI—The Complete Reference: Volume 1, The MPI Core. MIT Press, Cambridge, MA. ISBN 0-262-69215-5
- Gropp, William; Huss-Lederman, Steven; Lumsdaine, Andrew; Lusk, Ewing; Nitzberg, Bill; Saphir, William; and Snir, Marc (1998) MPI—The Complete Reference: Volume 2, The MPI-2 Extensions. MIT Press, Cambridge, MA ISBN 978-0-262-57123-4
- Firuziaan, Mohammad; Nommensen, O. (2002) Parallel Processing via MPI & OpenMP, Linux Enterprise, 10/2002
- Vanneschi, Marco (1999) Parallel paradigms for scientific computing In Proceedings of the European School on Computational Chemistry (1999, Perugia, Italy), number 75 in Lecture Notes in Chemistry, pages 170–183. Springer, 2000
- Bala, Bruck, Cypher, Elustondo, A Ho, CT Ho, Kipnis, Snir (1995) ″A portable and tunable collective communication library for scalable parallel computers" in IEEE Transactions on Parallel and Distributed Systems,″ vol. 6, no. 2, pp. 154–164, Feb 1995.