2012-07-04 16 views
23

आइए कहें कि 4 सीपीयू वाले प्रत्येक कंप्यूटर में 2 कोर हैं, इसलिए पूरी तरह से 8 कोर हैं। मेरी सीमित समझ के साथ मुझे लगता है कि सभी प्रोसेसर इस मामले में एक ही स्मृति साझा करते हैं। अब, क्या यह सामान्य बनाने के लिए ओपनएमपी का उपयोग करने या एमपीआई का उपयोग करने के लिए बेहतर है ताकि कोड वितरित और साझा दोनों सेटिंग्स पर काम कर सके। साथ ही, यदि मैं साझा सेटिंग के लिए एमपीआई का उपयोग करता हूं तो ओपनएमपी की तुलना में प्रदर्शन में कमी आएगी?एक साझा स्मृति के लिए एमपीआई बनाम ओपनएमपी

+1

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

+0

वाक्यांश के रूप में इस सवाल रचनात्मक नहीं है; एसओ के मानकों, अच्छे उत्तरों से प्राप्त करने के लिए 'बेहतर' बहुत ही व्यक्तिपरक है। –

उत्तर

27
सबसे वितरित स्मृति प्लेटफार्मों आजकल SMP या NUMA नोड्स से मिलकर यह सिर्फ कोई मतलब नहीं OpenMP का उपयोग नहीं करने के लिए बनाता है

। ओपनएमपी और एमपीआई पूरी तरह से मिलकर काम कर सकता है; ओपनएमपी प्रत्येक नोड पर कोर को खिलाता है और एमपीआई नोड्स के बीच संचार करता है। इसे हाइब्रिड प्रोग्रामिंग कहा जाता है। इसे 10 साल पहले विदेशी माना जाता था लेकिन अब यह उच्च प्रदर्शन कंप्यूटिंग में मुख्यधारा बन रहा है।

सवाल ही है, सही जवाब का सवाल है, उपलब्ध कराई गई जानकारी, यह देखते हुए हमेशा एक और एक ही कर दिया गया है: यह निर्भर करता है

4

इस तरह की एक साझा मेमोरी मशीन पर उपयोग के लिए, मैं ओपनएमपी की सिफारिश करता हूं। यह समस्या के कुछ पहलुओं को सरल बनाता है और तेज हो सकता है।

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

कारण मैं कहता हूँ OpenMP तेजी से हो सकता है क्योंकि एमपीआई का एक अच्छा कार्यान्वयन काफी चालाक स्पॉट है कि यह एक साझा स्मृति वातावरण में इस्तेमाल किया जा रहा है और उसके अनुसार अपना व्यवहार अनुकूलन करने के लिए हो सकता है।

3

बस एक बड़ी तस्वीर के लिए, संकर प्रोग्रामिंग क्योंकि OpenMP लाभ कैश टोपोलॉजी से, एक ही पता स्थान का उपयोग करके लोकप्रिय हो गया है। चूंकि एमपीआई में स्मृति पर एक ही डेटा दोहराया जा सकता है (क्योंकि प्रक्रिया डेटा साझा नहीं कर सकती है) यह कैश रद्द करने से पीड़ित हो सकती है।

दूसरी तरफ, यदि आप अपना डेटा सही तरीके से विभाजित करते हैं, और प्रत्येक प्रोसेसर के पास निजी कैश होता है, तो यह एक बिंदु पर आ सकता है कि आपकी समस्या कैश में पूरी तरह फिट हो। इस मामले में आपके पास सुपर रैखिक गति है।

कैश में बात कर करके, हाल के प्रोसेसर पर बहुत अलग कैश टोपोलॉजी हैं, और हमेशा होते हैं: यह निर्भर करता है ...

48

आप की जरूरत है या चाहते हैं या नहीं एमपीआई या OpenMP (या दोनों) भारी प्रकार निर्भर करता है आपके द्वारा चलाए जा रहे एप्लिकेशन का, और क्या आपकी समस्या अधिकतर स्मृति-बाध्य या सीपीयू-बाध्य (या दोनों) है। इसके अलावा, यह उस हार्डवेयर के प्रकार पर निर्भर करता है जिस पर आप चल रहे हैं। कुछ उदाहरण:

उदाहरण 1

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

इस मामले में आप शायद एमपीआई का उपयोग करना चाहते हैं और प्रत्येक नोड पर एक एमपीआई प्रक्रिया शुरू करना चाहते हैं, जिससे कम से कम संचार सीमित करते समय उपलब्ध स्मृति का अधिकतम उपयोग करना है।

उदाहरण 2

आप आम तौर पर छोटे डेटासेट है और केवल अपने आवेदन, जो computationally भारी है तेजी लाने के लिए चाहते हैं। इसके अलावा, आप समांतरता के बारे में सोचने में ज्यादा समय नहीं बिताना चाहते हैं, लेकिन सामान्य रूप से आपके एल्गोरिदम अधिक।

इस मामले में ओपनएमपी आपकी पहली पसंद है। आपको केवल यहां कुछ और बयान जोड़ने की ज़रूरत है (उदा। आपके लूप के सामने जो आप तेजी से बढ़ाना चाहते हैं), और यदि आपका प्रोग्राम बहुत जटिल नहीं है, तो ओपनएमपी स्वचालित रूप से आपके लिए बाकी करेगा।

उदाहरण 3

आप यह सब चाहते हैं। आपको अधिक मेमोरी की आवश्यकता है, यानी अधिक कंप्यूटिंग नोड्स, लेकिन आप जितनी ज्यादा हो सके अपनी गणना तेज करना चाहते हैं, यानी प्रति कोर एक से अधिक कोर पर चल रहे हैं।

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

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

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

+1

@ माइकल श्लॉटके: प्रिय माइकल, क्या आप कृपया मुझे समझा सकते हैं कि हाइब्रिड समाधान MPI- केवल एक या दो या दो से अधिक नोड्स के उपयोग के मामले में तेज होगा, प्रत्येक में 16+ CPUs होंगे? इस मामले में केवल एमपीआई का उपयोग करने की कमी क्या है? बहुत बहुत धन्यवाद –

+3

@neil_mccauley व्यक्तिगत अनुभव से (और अन्य शोध समूहों के उदाहरणों को देखते हुए), अधिकांश वैज्ञानिक कोड कई-कोर नोड्स का पूर्ण उपयोग करने का प्रयास करते समय एक संकर दृष्टिकोण का उपयोग करते हैं। विशेष रूप से हार्डवेयर धागे के समर्थन के साथ यह एक नोड (या यहां तक ​​कि कोर) के भीतर एक निश्चित डिग्री के लिए थ्रेड-स्तर समांतरता का उपयोग करने के लिए समझ में आता है। एमपीआई रैंकों की अत्यधिक संख्या में संचार बढ़ता है, सामूहिक संचालन को अधिक महंगा बनाता है और (तर्कसंगत रूप से सबसे महत्वपूर्ण) मेमोरी खपत को बढ़ाता है।चाहे यह आपके मामले में समझ में आता है, केवल प्रति-कोड प्रति-मशीन आधार पर ही उत्तर दिया जा सकता है। –

+0

@MichaelSchlottke मेरे पास एक ऐसा प्रोग्राम है जो कई स्वतंत्र कम्प्यूटेशनल कार्यों को करता है। मैंने पहले से ही प्रत्येक कार्य के भीतर ओपनएमपी पाश-स्तर समांतरता लागू की है। हालांकि, गति सैद्धांतिक के पास कहीं भी नहीं है और लूप की लंबाई पर भारी निर्भर करता है। मेमोरी मेरे लिए बाधा नहीं है। मेरे कोड में, कार्य पूरा होने के बाद संचार की आवश्यकता होती है, जिसे समाप्त होने में कुछ मिनट लगते हैं। क्या आपको लगता है कि एक एमपीआई-केवल समाधान (नोड कोर के बीच कार्यों को वितरित करना) मेरे उपयोग के मामले के लिए संकर दृष्टिकोण से कहीं अधिक कुशल होगा? आपका बहुत बहुत धन्यवाद! –

संबंधित मुद्दे