10

मेरे पास थोड़ा सा शोध संबंधित प्रश्न है।साझा स्मृति के लिए एमपीआई को कॉन्फ़िगर करने का क्या अर्थ है?

वर्तमान में मैंने एमपीआई के आधार पर संरचना कंकाल फ्रेम कार्य के कार्यान्वयन को समाप्त कर लिया है (विशेष रूप से openmpi 6.3 का उपयोग कर)। फ्रेम मशीन का इस्तेमाल एकल मशीन पर किया जाना चाहिए। अब, मैं इसे अन्य पिछले कंकाल कार्यान्वयन के साथ की तुलना कर रहा हूँ (scandium जैसे, fast-flow, ..)

एक बात मैं देखा है कि मेरी कार्यान्वयन के प्रदर्शन अन्य कार्यान्वयन के रूप में रूप में अच्छा नहीं है। मुझे लगता है कि ऐसा इसलिए है क्योंकि, मेरा कार्यान्वयन एमपीआई पर आधारित है (इस प्रकार एक दो तरफा संचार जिसके लिए भेजने और प्राप्त करने के मिलान की आवश्यकता होती है) जबकि अन्य कार्यान्वयन जिनकी तुलना मैं कर रहा हूं, साझा स्मृति पर आधारित हैं। (... लेकिन फिर भी मुझे इसका तर्क देने के लिए कोई अच्छा स्पष्टीकरण नहीं है, और यह मेरे प्रश्न का हिस्सा है)

दो श्रेणियों के समापन समय पर कुछ बड़ा अंतर है।

आज मैं भी साझा स्मृति यहाँ =>openmpi-sm

के लिए खुले एमपीआई के विन्यास के लिए पेश कर रहा हूँ और वहाँ आ मेरे सवाल आता है।

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

shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out 

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

कोई सुझाव या आगे चर्चा बहुत स्वागत है।

अगर मुझे अपने प्रश्न को और स्पष्ट करना है तो कृपया मुझे बताएं।

आपके समय के लिए धन्यवाद!

उत्तर

11

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

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

डिफ़ॉल्ट रूप से साझा स्मृति संचार सक्षम करने के लिए की आवश्यकता नहीं है। बस अपने प्रोग्राम को mpiexec -np 16 ./a.out के साथ लॉन्च करें। आपने जो जुड़ाव किया है वह ओपन एमपीआई एफएक्यू का साझा मेमोरी हिस्सा है जो बेहतर प्रदर्शन प्राप्त करने के लिए sm बीटीएल के पैरामीटर पर संकेत देता है। ओपन एमपीआई के साथ मेरा अनुभव दिखाता है कि डिफ़ॉल्ट पैरामीटर लगभग इष्टतम हैं और मल्टीलेवल NUMA सिस्टम जैसे विदेशी हार्डवेयर पर भी बहुत अच्छी तरह से काम करते हैं। ध्यान दें कि डिफ़ॉल्ट साझा स्मृति संचार कार्यान्वयन डेटा को दो बार कॉपी करता है - एक बार प्रेषक बफर से साझा स्मृति तक और एक बार साझा स्मृति से प्राप्त बफर तक। KNEM कर्नेल डिवाइस के रूप में एक शॉर्टकट मौजूद है, लेकिन आपको इसे डाउनलोड करना होगा और इसे अलग से संकलित करना होगा क्योंकि यह मानक लिनक्स कर्नेल का हिस्सा नहीं है। केएनईएम समर्थन के साथ, ओपन एमपीआई एक ही नोड पर प्रक्रियाओं के बीच "शून्य प्रतिलिपि" स्थानान्तरण करने में सक्षम है - प्रतिलिपि कर्नेल डिवाइस द्वारा की जाती है और यह दूसरी प्रक्रिया की स्मृति में पहली प्रक्रिया की स्मृति से सीधी प्रति है प्रक्रिया। यह नाटकीय रूप से उसी नोड पर रहने वाली प्रक्रियाओं के बीच बड़े संदेशों के हस्तांतरण में सुधार करता है।

एक और विकल्प एमपीआई के बारे में पूरी तरह से भूलना और सीधे साझा स्मृति का उपयोग करना है। आप साझा मेमोरी ब्लॉक बनाने के लिए POSIX मेमोरी प्रबंधन इंटरफ़ेस (here देखें) का उपयोग कर सकते हैं, सभी प्रक्रियाएं सीधे उस पर चलती हैं। यदि साझा स्मृति में डेटा संग्रहीत किया जाता है, तो यह लाभकारी हो सकता है क्योंकि कोई प्रतियां नहीं की जाएंगी। लेकिन आधुनिक मल्टी-सॉकेट सिस्टम पर NUMA समस्याओं के लिए देखें, जहां प्रत्येक सॉकेट का अपना मेमोरी कंट्रोलर होता है और उसी बोर्ड पर रिमोट सॉकेट से मेमोरी एक्सेस करना धीमा होता है। प्रक्रिया पिनिंग/बाध्यकारी भी महत्वपूर्ण है - --bind-to-socket से mpiexec पास करें ताकि प्रत्येक एमपीआई प्रक्रिया को एक अलग CPU कोर में पिन किया जा सके।

+1

लिनक्स 3.2 के रूप में FWIW, प्रक्रिया_vm_readv/writev syscalls हैं, जो लगभग केएनईएम के समान ही हैं। उदाहरण देखें http://man7.org/linux/man-pages/man2/process_vm_readv.2.html – janneb

+0

@janneb, यह इंगित करने के लिए धन्यवाद, लेकिन 3.x कर्नेल अब एचपीसी सिस्टम के अधिकांश उत्पादन के साथ बहुत लोकप्रिय नहीं हैं। फिर भी केएनईएम सरल डेटा स्थानान्तरण से कहीं अधिक प्रदान करता है, उदाहरण के लिए एसिंक ऑपरेशंस, समापन अधिसूचनाएं, आदि –

+0

यह सच है, लेकिन फिर, न तो केएनईएम पैच के साथ कर्नल हैं। – janneb

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