2014-11-12 14 views
5

मैं थोड़ा के तुल्यकालिक अवधारणा के बारे में मिश्रित गया immidiate - & गैर अवरुद्ध परिचालन (openmpi में) यहाँ से अवरुद्ध के संदर्भ में अतुल्यकालिक:बनाम openmpi में तुल्यकालिक संचार

  • link 1 : MPI_Isend है जरूरी नहीं कि अतुल्यकालिक (इसलिए यह तुल्यकालिक कर सकते हैं?)

  • link 2 : MPI_Isend() और MPI_Irecv() अतुल्यकालिक संचार pri हैं एमपीआई के mitives।

मैं पहले से ही पिछले समन्वयन के माध्यम से चले गए हैं - async - अवरुद्ध - stackoverflow (asynchronous vs non-blocking) पर गैर अवरुद्ध सवाल है, लेकिन मेरे लिए कोई मदद नहीं की थी। जहां तक ​​मुझे पता है:

  • immidiate (MPI_ISEND): विधि देता है & अगली पंक्ति निष्पादित करता है -> nonblocking
  • स्टैंडर्ड/गैर-तत्काल (MPI_SEND): बड़े संदेश के लिए यह ब्लॉक जब तक स्थानांतरण पूरा करता
  • एक तुल्यकालिक आपरेशन ब्लॉक (http://www.cs.unc.edu/~dewan/242/s07/notes/ipc/node9.html)
  • एक अतुल्यकालिक आपरेशन गैर अवरुद्ध है (http://www.cs.unc.edu/~dewan/242/s07/notes/ipc/node9.html)

तो कैसे & क्यों MPI_ISEND (लिंक 1) और साथ ही गैर अवरुद्ध (लिंक 2) बाधित कर रहा होगा? i.e.what का मतलब एसिंक्रोनस & सिंक्रोनस MPI_ISEND यहां है?

इसी प्रकार के भ्रम MPI_SSEND & MPI_ISSEND के बारे में उठता है, एस के बाद से MPI_ एस भेजें तुल्यकालिक (या अवरुद्ध) का अर्थ है में और: -

  • MPI_SSEND: तुल्यकालिक भेजने ब्लॉक डेटा पर प्राप्त होने तक रिमोट प्रोसेस & एके प्रेषक द्वारा प्राप्त किया गया है,
  • MPI_ISSEND: तात्कालिक सिंक्रोनस से nd

भी मैं mmediate गैर अवरुद्ध है, तो, कैसे MPI_ कर सकते हैं भेजने एस हो ynchronous & वापसी मैं mmediately?

मुझे लगता है कि & ब्लॉकिंग & ब्लॉकिंग ओपनएमपीआई संचार को अवरुद्ध करने के संदर्भ में तुल्यकालिक अतुल्यकालिक & में अधिक स्पष्टता की आवश्यकता है। इस संबंध में एक व्यावहारिक उदाहरण या समानता बहुत उपयोगी होगी।

+0

मैं एक ही चीज़ को समझने की कोशिश कर रहा था, और मैंने प्रत्येक प्रेषण मोड के लिए उदाहरण लिखना समाप्त कर दिया, यहां: https://gist.github.com/deborasetton/9f8597d85a4d314ace17। कभी-कभी अंतर देखने के लिए वास्तविक कोड को देखना उपयोगी होता है। – dsetton

उत्तर

9

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

गैर-अवरुद्ध कॉल MPI_I... तत्काल वापस लौटें, इससे कोई फर्क नहीं पड़ता कि ऑपरेशन पूरा हो गया है या नहीं। ऑपरेशन पृष्ठभूमि में, या असीमित रूप से जारी है। कॉलिंग ब्लॉक तब तक वापस नहीं आती जब तक ऑपरेशन पूरा नहीं हो जाता है। गैर-अवरुद्ध संचालन उनके हैंडल द्वारा दर्शाए जाते हैं जिन्हें पूरा करने के लिए अवरुद्ध प्रतीक्षा (MPI_WAIT) या गैर-अवरुद्ध परीक्षण (MPI_TEST) करने के लिए उपयोग किया जा सकता है।

एक ऑपरेशन को पूरा करने का मतलब है कि आपूर्ति किए गए डेटा बफर को अब एमपीआई द्वारा एक्सेस नहीं किया जा रहा है और इसलिए इसका पुन: उपयोग किया जा सकता है। नेटवर्क पर पूरी तरह से संदेश डालने के बाद बफर को पुन: उपयोग करने के लिए स्वतंत्र हो जाएं (उस मामले सहित जहां संदेश का हिस्सा अभी भी नेटवर्क उपकरण और/या ड्राइवर द्वारा buffered किया जा सकता है), या कहीं भी buffered किया गया है एमपीआई कार्यान्वयन। Buffered मामले की आवश्यकता नहीं है कि रिसीवर ने एक मिलान प्राप्त ऑपरेशन पोस्ट किया है और इसलिए सिंक्रनाइज़ नहीं कर रहा है - प्राप्तकर्ता को बाद में पोस्ट किया जा सकता है। अवरुद्ध सिंक्रोनस MPI_SSEND भेजता है जब तक रिसीवर ने एक ऑपरेशन पोस्ट नहीं किया है, इस प्रकार यह दोनों रैंकों को सिंक्रनाइज़ नहीं करता है। गैर-अवरुद्ध सिंक्रोनस MPI_ISSEND तुरंत लौटाता है लेकिन असीमित (पृष्ठभूमि) ऑपरेशन तब तक पूरा नहीं होगा जब तक रिसीवर ने मिलान प्राप्त नहीं किया हो।

एक अवरोधन ऑपरेशन तुरंत एक प्रतीक्षा के बाद एक गैर-अवरोधक के बराबर है। उदाहरण के लिए:

MPI_Ssend(buf, len, MPI_TYPE, dest, tag, MPI_COMM_WORLD); 

के बराबर है:

MPI_Request req; 
MPI_Status status; 

MPI_Issend(buf, len, MPI_TYPE, dest, tag, MPI_COMM_WORLD, &req); 
MPI_Wait(&req, &status); 

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

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

तैयार प्रेषण एक बहुत ही विशेष प्रकार का ऑपरेशन है। यह केवल सफलतापूर्वक पूर्ण हो जाता है यदि गंतव्य रैंक पहले से ही ऑपरेशन पोस्ट कर चुका है जब प्रेषक प्रेषण कॉल करता है। यह कुछ प्रकार के हैंडशेक करने की आवश्यकता को खत्म कर संचार विलंबता को कम कर सकता है।

+0

अनुवर्ती के रूप में, 'MPI_Send' क्या करता है क्योंकि आपने पहले ही' एमपीआई_एसएसएंड 'और' एमपीआई_आईएसएंड 'को समझाया है? – baibo

+0

'एमपीआई_Send' तथाकथित _standard_ प्रेषण ऑपरेशन है - यह या तो संदेश बफर करता है या इसे 'एमपीआई_Ssend' करता है उसी तरह भेजता है। 'MPI_Ssend' के विपरीत, यह गारंटी नहीं देता है कि रिसीवर ने संदेश प्राप्त करना शुरू कर दिया है, केवल संदेश ही एमपीआई लाइब्रेरी में प्रवेश कर चुका है और डेटा बफर को फिर से उपयोग किया जा सकता है। –

+0

बहुत बहुत धन्यवाद :) – baibo

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