क्या कोई MPMP के OpenMPI और MPICH कार्यान्वयन के बीच के अंतर को विस्तृत कर सकता है? दोनों में से कौन बेहतर कार्यान्वयन है?
क्या कोई MPMP के OpenMPI और MPICH कार्यान्वयन के बीच के अंतर को विस्तृत कर सकता है? दोनों में से कौन बेहतर कार्यान्वयन है?
जवाबों:
सबसे पहले, यह पहचानना महत्वपूर्ण है कि एमपिक और ओपन-एमपीआई कैसे अलग हैं, अर्थात वे विभिन्न आवश्यकताओं को पूरा करने के लिए डिज़ाइन किए गए हैं। MPICH को नवीनतम MPI मानक का उच्च-गुणवत्ता वाला संदर्भ कार्यान्वयन और विशेष उद्देश्य की जरूरतों को पूरा करने के लिए व्युत्पन्न कार्यान्वयन का आधार माना जाता है। ओपन-एमपीआई सामान्य मामले को लक्षित करता है, दोनों उपयोग और नेटवर्क के संदर्भ में।
ओपन-एमपीआई उनके नेटवर्क समर्थन का दस्तावेज यहां देता है । MPICH प्रत्येक संस्करण के साथ वितरित README में इस जानकारी को सूचीबद्ध करता है (जैसे यह 3.2.1 के लिए है)। ध्यान दें कि क्योंकि Open-MPI और MPICH दोनों OFI का समर्थन करते हैं(aka libfabric) नेटवर्किंग लेयर, वे एक ही नेटवर्क का समर्थन करते हैं। हालाँकि, libfabric एक बहुआयामी एपीआई है, इसलिए प्रत्येक नेटवर्क को दोनों में समान रूप से समर्थित नहीं किया जा सकता है (जैसे MPICH में एक OFI- आधारित IBM Blue Gene / Q कार्यान्वयन है, लेकिन मुझे Open-MPI में समकक्ष समर्थन की जानकारी नहीं है) । हालाँकि, MPICH और Open-MPI दोनों के OFI- आधारित कार्यान्वयन साझा-मेमोरी, ईथरनेट (टीसीपी / आईपी के माध्यम से), मेलानॉक्स इनफिनबैंड, इंटेल ओमनी पथ, और संभावित अन्य नेटवर्क पर काम कर रहे हैं। ओपन-एमपीआई भी इन दोनों नेटवर्क और अन्य को मूल रूप से समर्थन करता है (यानी बीच में ओएनआई के बिना)।
अतीत में, MPICH के बारे में एक आम शिकायत यह है कि यह InfiniBand का समर्थन नहीं करता है, जबकि Open-MPI करता है। हालाँकि, MVAPICH और Intel MPI (दूसरों के बीच) - दोनों MPICH डेरिवेटिव हैं - InfiniBand का समर्थन करते हैं, इसलिए यदि कोई MPICH को "MPICH और उसके डेरिवेटिव" के रूप में परिभाषित करने के लिए तैयार है, तो MPICH में InfiniBand और मालिकाना दोनों सहित अत्यंत व्यापक नेटवर्क समर्थन है। Cray Seastar, Gemini और Aries के साथ-साथ IBM Blue Gene (/ L, / P और / Q) जैसे इंटरकनेक्शंस। ओपन-एमपीआई क्रे मिथुन को इंटरकनेक्ट का समर्थन भी करता है, लेकिन इसका उपयोग क्रे द्वारा समर्थित नहीं है। हाल ही में, MPICH ने एक नेटमॉड (अब पदावनत) के माध्यम से InfiniBand का समर्थन किया, लेकिन MVAPICH2 में व्यापक अनुकूलन हैं जो इसे लगभग सभी मामलों में पसंदीदा कार्यान्वयन बनाते हैं।
हार्डवेयर / प्लेटफ़ॉर्म समर्थन के लिए एक ऑर्थोगोनल अक्ष MPI मानक का कवरेज है। यहाँ MPICH आमतौर पर दूर और श्रेष्ठ है। MPICH MPI-1 से MPI-3 तक, MPI मानक के हर एक रिलीज का पहला कार्यान्वयन है। ओपन-एमपीआई ने केवल हाल ही में एमपीआई -3 का समर्थन किया है और मुझे लगता है कि कुछ एमपीआई -३ सुविधाएँ कुछ प्लेटफार्मों पर छोटी गाड़ी हैं (एमपीएचसी बग-मुक्त नहीं है, बेशक, लेकिन एमपीआई -3 सुविधाओं में बग बहुत कम आम हैं)।
ऐतिहासिक रूप से, ओपन-एमपीआई के लिए समग्र समर्थन नहीं था MPI_THREAD_MULTIPLE
, जो कुछ अनुप्रयोगों के लिए महत्वपूर्ण है। यह कुछ प्लेटफार्मों पर समर्थित हो सकता है लेकिन आमतौर पर काम करने के लिए ग्रहण नहीं किया जा सकता है। दूसरी ओर, MPICH को MPI_THREAD_MULTIPLE
कई वर्षों तक समग्र समर्थन मिला है , हालांकि कार्यान्वयन हमेशा उच्च-प्रदर्शन नहीं होता है ( एक विश्लेषण के लिए "मल्टीथ्रेडेड MPI कार्यान्वयन में लॉकिंग पहलू" देखें )।
एक और विशेषता जो ओपन-एमपीआई 1.x में टूट गई थी वह एकतरफा संचार, उर्फ आरएमए थी। यह हाल ही में तय किया गया है और मुझे इन विशेषताओं के एक बहुत भारी उपयोगकर्ता के रूप में पता चलता है, कि वे आम तौर पर ओपन-एमपीआई 3.x में अच्छा काम कर रहे हैं (देखें उदाहरण के लिए ट्रैविस सीआई में एआरएमसीआई-एमपीआई परीक्षण मैट्रिक्स आरएमए के साथ काम करने वाले परिणामों के लिए काम कर रहा है) दोनों कार्यान्वयन, कम से कम साझा-मेमोरी में। मैंने इंटेल ओमनी पथ पर समान सकारात्मक परिणाम देखे हैं, लेकिन मेलानॉक्स इन्फिनीबैंड का परीक्षण नहीं किया है।
एक क्षेत्र जहां ओपन-एमपीआई काफी बेहतर हुआ करता था, प्रक्रिया प्रबंधक था। पुराना MPICH लॉन्च (MPD) भंगुर और उपयोग में कठिन था। सौभाग्य से, यह कई वर्षों के लिए पदावनत कर दिया गया है ( विवरण के लिए एमपिक FAQ प्रविष्टि देखें)। इस प्रकार, MPD की वजह से MPICH की आलोचना सहज है।
हाइड्रा प्रक्रिया प्रबंधक काफी अच्छा है और ओआरटीई (ओपन-एमपीआई) के रूप में समान प्रयोज्य और सुविधा सेट है, जैसे प्रक्रिया टोपोलॉजी पर नियंत्रण के लिए दोनों एचडब्ल्यूएलओसी का समर्थन करते हैं। ओपन-एमपीआई प्रक्रिया बड़ी नौकरियों (1000+ प्रक्रियाओं) के लिए एमपिक-डेरिवेटिव की तुलना में तेजी से शुरू होने की खबरें हैं, लेकिन चूंकि मेरे पास यहां पहले से अनुभव नहीं है, इसलिए मैं किसी भी निष्कर्ष को बताते हुए सहज नहीं हूं। इस तरह के प्रदर्शन के मुद्दे आमतौर पर नेटवर्क-विशिष्ट और कभी-कभी मशीन-विशिष्ट भी होते हैं।
मैंने ओपन-एमपीआई को वीपीएन के साथ मैकओएस का उपयोग करते समय अधिक मजबूत पाया है, अर्थात होस्टनाम रिज़ॉल्यूशन के मुद्दों के कारण एमपीआईएच स्टार्टअप में लटका सकता है। जैसा कि यह एक बग है, यह समस्या भविष्य में गायब हो सकती है।
जबकि MPICH और Open-MPI दोनों ही ओपन-सोर्स सॉफ्टवेयर हैं, जिन्हें कई प्रकार के प्लेटफॉर्म पर संकलित किया जा सकता है, बाइनरी फॉर्म में MPI पुस्तकालयों की पोर्टेबिलिटी, या उनके खिलाफ जुड़े प्रोग्राम, अक्सर महत्वपूर्ण होते हैं।
MPICH और इसके कई डेरिवेटिव ABI कम्पैटिबिलिटी ( वेबसाइट ) को सपोर्ट करते हैं , जिसका मतलब है कि लाइब्रेरी के लिए बाइनरी इंटरफेस स्थिर है और इसलिए mpi.h
एक कार्यान्वयन से संकलन कर सकता है और फिर दूसरे के साथ चल सकता है। यह पुस्तकालयों के कई संस्करणों में भी सच है। उदाहरण के लिए, मैं अक्सर इंटेल MPI को संकलित करता हूं लेकिन LD_PRELOAD
रनटाइम पर MPICH का एक विकास संस्करण। ABI अनुकूलता का एक बड़ा फायदा यह है कि ISV (इंडिपेंडेंट सॉफ्टवेयर वेंडर) MPICH परिवार के केवल एक सदस्य के खिलाफ संकलित बायनेरिज़ को जारी कर सकता है।
एबीआई केवल द्विआधारी संगतता का एकमात्र प्रकार नहीं है। ऊपर वर्णित परिदृश्य यह मानते हैं कि उपयोगकर्ता एमपीआई लांचर के एक ही संस्करण (आमतौर पर mpirun
या mpiexec
इसके कम्प्यूट-नोड डेमोंस के साथ) और एमपीआई लाइब्रेरी में हर जगह काम करते हैं। जरूरी नहीं कि यह कंटेनरों के लिए ही हो।
जबकि ओपन-एमपीआई एबीआई संगतता का वादा नहीं करता है, उन्होंने कंटेनर ( डॉक्स , स्लाइड ) का समर्थन करने में भारी निवेश किया है । MPI लॉन्चर, लॉन्चर डेमोंस और MPI लाइब्रेरी के विभिन्न संस्करणों में अनुकूलता बनाए रखने में बहुत सावधानी की आवश्यकता होती है, क्योंकि एक उपयोगकर्ता कंटेनर सपोर्ट में लॉन्चर डेमोंन्स की तुलना में MPI लॉन्चर के नए संस्करण का उपयोग करके जॉब लॉन्च कर सकता है। लॉन्चर इंटरफ़ेस स्थिरता पर ध्यान दिए बिना, कंटेनर जॉब तब तक लॉन्च नहीं होंगे जब तक कि लॉन्चर के प्रत्येक घटक के संस्करण संगत नहीं होंगे। यह एक अचूक समस्या नहीं है:
उदाहरण के लिए, डॉकर दुनिया द्वारा इस्तेमाल किया जाने वाला वर्कअराउंड, एप्लीकेशन के साथ इंफ्रास्ट्रक्चर को कंटेन्टाइज करना है। दूसरे शब्दों में, आप MPI डेमॉन को एप्लिकेशन के साथ कंटेनर में ही शामिल करते हैं, और फिर आवश्यकता होती है कि सभी कंटेनर (mpiexec शामिल) एक ही संस्करण के हों। यह समस्या से बचा जाता है क्योंकि अब आपके पास क्रॉस-वर्जन इंफ्रास्ट्रक्चर ऑपरेशन नहीं हैं।
मैं कंटेनर मुद्दों को समझाने के लिए ओपन-एमपीआई टीम के राल्फ कास्टैन को स्वीकार करता हूं। तुरंत पूर्ववर्ती उद्धरण उनका है।
यहां प्लेटफॉर्म-दर-प्लेटफॉर्म के आधार पर मेरा मूल्यांकन है:
Mac OS: Open-MPI और MPICH दोनों ही ठीक काम करने चाहिए। MPI-3 मानक की नवीनतम विशेषताओं को प्राप्त करने के लिए, आपको Open-MPI के हाल के संस्करण का उपयोग करने की आवश्यकता है, जो कि Mbrew से उपलब्ध है। यदि आप मैक लैपटॉप पर चल रहे हैं तो MPI प्रदर्शन के बारे में सोचने का कोई कारण नहीं है।
साझा-मेमोरी के साथ लिनक्स: ओपन-एमपीआई और एमपीआईसी दोनों को ठीक काम करना चाहिए। यदि आप एक रिलीज़ संस्करण चाहते हैं जो सभी MPI-3 या MPI_THREAD_MULTIPLE का समर्थन करता है, तो आपको शायद MPICH की आवश्यकता है, जब तक कि आप स्वयं Open-MPI का निर्माण न करें, क्योंकि उदाहरण के लिए Ubuntu 16.04 केवल APT के साथ प्राचीन संस्करण 1.10 प्रदान करता है। मुझे दो कार्यान्वयनों के बीच किसी भी महत्वपूर्ण प्रदर्शन अंतर के बारे में पता नहीं है। यदि ओएस उन्हें अनुमति देता है तो दोनों एकल-कॉपी अनुकूलन का समर्थन करते हैं।
Mellanox InfiniBand के साथ लिनक्स: Open-MPI या MVAPICH2 का उपयोग करें। यदि आप एक रिलीज़ संस्करण चाहते हैं जो सभी MPI-3 का समर्थन करता है या MPI_THREAD_MULTIPLE
, आपको संभवतः MVAPICH2 की आवश्यकता है। मुझे लगता है कि MVAPICH2 बहुत अच्छा प्रदर्शन करता है लेकिन InfiniBand पर OpenMPI के साथ प्रत्यक्ष रूप से तुलना नहीं की है, क्योंकि उन विशेषताओं के लिए जिनमें प्रदर्शन मेरे लिए सबसे अधिक मायने रखता है (RMA उर्फ एक तरफा) पिछले दिनों ओपन-एमपीआई में टूट गया है।
इंटेल ओमनी पाथ (या इसके पूर्ववर्ती, ट्रू स्केल) के साथ लिनक्स: मेरे पास ऐसे सिस्टम पर MVAPICH2, Intel MPI, MPICH और ओपन-MPI का उपयोग है, और सभी काम कर रहे हैं। इंटेल MPI सबसे अधिक अनुकूलित होता है जबकि Open-MPI ने ओपन-सोर्स कार्यान्वयन का सबसे अच्छा प्रदर्शन दिया क्योंकि उनके पास एक अच्छी तरह से अनुकूलित PSM2- आधारित बैक-एंड है। मेरे पास GitHub पर कुछ नोट्स हैं कि अलग-अलग ओपन-सोर्स कार्यान्वयन कैसे बनाएं , लेकिन इस तरह की जानकारी जल्दी से बासी हो जाती है।
क्रे या आईबीएम सुपरकंप्यूटर: एमपीआई स्वचालित रूप से इन मशीनों पर स्थापित हो जाता है और यह दोनों मामलों में एमपीआईएच पर आधारित है। Cray XC40 ( यहाँ ) पर OFI का उपयोग करते हुए , Cray XC40 पर Intel MPI ( यहाँ ), OFI का उपयोग करते हुए, ब्लू जीन / Q पर MPICH का MPI ( यहाँ ) का उपयोग करते हुए , और Open-MPI का उपयोग करते हुए Cray XC40 ( यहाँ ) पर MPICH के प्रदर्शन हुए हैं, और OFI और uGNI दोनों का उपयोग करके Cray XC40 में ओपन-MPI का उपयोग किया गया है ( यहां ), लेकिन इनमें से कोई भी विक्रेता समर्थित नहीं है।
विंडोज़: मुझे लिनक्स वीएम के माध्यम से विंडोज पर एमपीआई चलाने में कोई मतलब नहीं दिखता है, लेकिन माइक्रोसॉफ्ट एमपीआई और इंटेल एमपीआई दोनों विंडोज का समर्थन करते हैं और एमपीएचई-आधारित हैं। मैंने लिनक्स के लिए विंडोज सबसिस्टम का उपयोग करके MPICH या ओपन-MPI के सफल निर्माण की रिपोर्टें सुनी हैं, लेकिन कोई व्यक्तिगत अनुभव नहीं है।
पूर्ण प्रकटीकरण में, मैं वर्तमान में इंटेल के लिए एक शोध / पाथफाइंडिंग क्षमता (यानी मैं किसी इंटेल सॉफ्टवेयर उत्पादों पर काम नहीं करता हूं) में काम करता हूं और पूर्व में आर्गनने नेशनल लैब के लिए पांच साल तक काम किया था, जहां मैंने एमपिक टीम के साथ बड़े पैमाने पर सहयोग किया था।
MPI_THREAD_MULTIPLE
उत्तर में प्रकाश डाला , लेकिन मुझे इससे पहले इसका उपयोग करने का वास्तविक अनुभव नहीं है। क्या आप कुछ उपयोगकर्ता मामलों / उदाहरणों को दे सकते हैं जहां MPI_THREAD_MULTIPLE
अन्य मोड्स जैसे की तुलना में उपयोगी और कुशल है MPI THREAD FUNNELED
? मेरी पहली धारणा यह है कि यह कार्यक्रम थ्रेड और प्रक्रिया के बीच डिबग करने के लिए कार्यक्रम को अधिक जटिल और कठिन बनाता है। धन्यवाद।
यदि आप उत्पादन प्रणाली के बजाय विकास करते हैं, तो MPICH के साथ जाएं। MPICH में अंतर्निहित डिबगर है, जबकि ओपन-MPI पिछली बार मैंने जाँच नहीं की है।
उत्पादन में, ओपन-एमपीआई सबसे अधिक तेजी से होगा। लेकिन तब आप अन्य विकल्पों जैसे कि इंटेल एमपीआई पर शोध करना चाह सकते हैं।
मैं पिछले पोस्टर के साथ सहमत हूं। दोनों को यह देखने की कोशिश करें कि आपका कौन सा एप्लिकेशन तेजी से चलता है और फिर उत्पादन के लिए इसका उपयोग करें। वे दोनों मानकों के अनुरूप हैं। यदि यह आपका डेस्कटॉप है या तो ठीक है। OpenMPI मैकबुक पर बॉक्स से बाहर आता है, और MPICH अधिक Linux / Valgrind अनुकूल लगता है। यह आपके और आपके टूलकिन के बीच है।
यदि यह एक उत्पादन क्लस्टर है तो आपको यह सुनिश्चित करने के लिए अधिक व्यापक बेंचमार्किंग करने की आवश्यकता है कि यह आपके नेटवर्क टोपोलॉजी के अनुकूल है। एक उत्पादन क्लस्टर पर इसे कॉन्फ़िगर करना आपके समय के संदर्भ में मुख्य अंतर होगा क्योंकि आपको RTFM करना होगा।
दोनों मानक-अनुरूप हैं, इसलिए यह कोई बात नहीं है जो आप एक सही दृष्टिकोण से उपयोग करते हैं। जब तक कुछ सुविधा नहीं होती है, जैसे कि विशिष्ट डिबग एक्सटेंशन, जिसकी आपको आवश्यकता होती है, तब दोनों को बेंचमार्क करें और जो भी आपके हार्डवेयर पर आपके ऐप्स के लिए तेज हो। यह भी विचार करें कि अन्य एमपीआई कार्यान्वयन हैं जो बेहतर प्रदर्शन या अनुकूलता दे सकते हैं, जैसे कि एमवीएपीएचएच (सबसे अच्छा इन्फिनिबैंड प्रदर्शन हो सकता है) या इंटेल एमपीआई (व्यापक रूप से समर्थित आईएसवी)। एचपी ने अपने MPI को बहुत सारे ISV कोड के साथ क्वालिफाई करने के लिए कड़ी मेहनत की, लेकिन मुझे यकीन नहीं है कि प्लेटफ़ॉर्म पर बेचे जाने के बाद यह कितना दूर है?
मेरे अनुभव से एक अच्छी सुविधा जो ओपनएमपीआई सपोर्ट करती है, लेकिन एमपिक प्रोसेस एफिनिटी नहीं है । उदाहरण के लिए, OpenMPI में, -npersocket
आप प्रत्येक सॉकेट पर लॉन्च किए गए रैंकों की संख्या निर्धारित कर सकते हैं। इसके अलावा, OpenMPI rankfile
काफी आसान है जब आप कोर को रैंक करना या उन्हें ओवरबॉइंट करना चाहते हैं।
अंत में, यदि आपको कोर से रैंकों की मैपिंग को नियंत्रित करने की आवश्यकता है, तो मैं निश्चित रूप से ओपनएमपीआई का उपयोग करके आपके कोड को लिखने और संकलित करने का सुझाव दूंगा।