2012-04-04 24 views
43

मुझे एमपीआई में संचार अवरोध और गैर-अवरुद्ध संचार की अवधारणा को समझने में परेशानी हो रही है। दोनों में क्या मतभेद हैं? फायदे और नुकसान क्या हैं?mpi: अवरुद्ध बनाम गैर-अवरुद्ध

धन्यवाद!

उत्तर

58

ब्लॉकिंग संचार MPI_Send() और MPI_Recv() का उपयोग करके किया जाता है। संचार समाप्त होने तक ये कार्य वापस नहीं आते हैं (यानी, वे ब्लॉक)। कुछ हद तक सरलीकृत करना, इसका मतलब है कि बफर MPI_Send() को पारित किया जा सकता है, या तो क्योंकि एमपीआई ने इसे कहीं से बचाया है, या क्योंकि यह गंतव्य द्वारा प्राप्त किया गया है। इसी प्रकार, MPI_Recv() लौटाता है जब प्राप्त बफर वैध डेटा से भरा गया है।

इसके विपरीत, MPI_Isend() और MPI_Irecv() का उपयोग करके गैर-अवरुद्ध संचार किया जाता है। ये फ़ंक्शन तुरंत लौटते हैं (यानी, वे ब्लॉक नहीं करते हैं) भले ही संचार अभी तक समाप्त नहीं हुआ हो। संचार समाप्त हो गया है या नहीं, यह देखने के लिए आपको MPI_Wait() या MPI_Test() पर कॉल करना होगा।

ब्लॉकिंग संचार पर्याप्त होने पर उपयोग किया जाता है, क्योंकि यह उपयोग करने में कुछ आसान है। आवश्यक होने पर गैर-अवरुद्ध संचार का उपयोग किया जाता है, उदाहरण के लिए, आप MPI_Isend() पर कॉल कर सकते हैं, कुछ कंप्यूटेशंस करें, फिर MPI_Wait() करें। यह कम्प्यूटेशंस और संचार को ओवरलैप करने की अनुमति देता है, जो आमतौर पर बेहतर प्रदर्शन की ओर जाता है।

ध्यान दें कि सामूहिक संचार (उदाहरण के लिए, सभी-कम) केवल एमपीआईवी 2 तक अपने अवरुद्ध संस्करण में उपलब्ध है। आईआईआरसी, एमपीआईवी 3 गैर-अवरुद्ध सामूहिक संचार पेश करता है।

एमपीआई के प्रेषण मोड का त्वरित अवलोकन here देखा जा सकता है।

+1

तो MPI_Send() MPI_Isend() + MPI_Wait() जैसा ही है? – lamba

+0

हां, ओवरहेड को छोड़कर, आप MPI_Send() को MPI_Isend() के रूप में MPI_Wait() के बाद सोच सकते हैं। – user1202136

+11

@ user1202136: आप शायद यह उल्लेख करना चाहें कि 'MPI_Send' पूरा हो जाता है जब आप बफर का पुन: उपयोग कर सकते हैं, स्वतंत्र रूप से प्राप्तकर्ता को डेटा प्राप्त हुआ है (या यहां तक ​​कि डेटा अभी तक भेजा गया है या नहीं)। –

8

अवरुद्ध संचार का उपयोग कर आप भेजने के बारे में ध्यान हो सकता है और इस कोड को

if(rank==0) 
{ 
    MPI_Send(x to process 1) 
    MPI_Recv(y from process 1) 
} 
if(rank==1) 
{ 
    MPI_Send(y to process 0); 
    MPI_Recv(x from process 0); 
} 

क्या इस मामले में होता है पर उदाहरण देखने के लिए कॉल प्राप्त करना चाहिए?

  1. प्रक्रिया 0 प्रक्रिया 1 तक ब्लॉक भेजता है और प्रक्रिया 1 तक x प्राप्त करता है।
  2. प्रक्रिया 1 प्रक्रिया 0 तक ब्लॉक करता है और प्रक्रिया 0 तक ब्लॉक प्राप्त करता है, लेकिन
  3. प्रक्रिया 0 अवरुद्ध है कि प्रक्रिया को दो प्रक्रियाओं तक मारने तक अनंतता के लिए 1 ब्लॉक की प्रक्रिया होती है।
+4

मिला मुझे ऐसा लगता था। लेकिन जब मैं अपने कंप्यूटर पर MPI_Send का उपयोग करता हूं, तो मुझे लगता है कि अंदर की समस्या अधिक जटिल हो सकती है। उपरोक्त कोड काम करता है क्योंकि यह संदेश को बफर में ले जा सकता है। केवल 'एमपीआई_Ssend' सख्ती से * अवरुद्ध * है, क्योंकि यह तब तक लौटाता है जब तक गंतव्य संदेश प्राप्त नहीं करता है। निम्नलिखित लिंक बताते हैं कि विभिन्न विक्रेता विभिन्न कार्यान्वयन का चयन करते हैं। http://www.mcs.anl.gov/research/projects/mpi/sendmode.html –

3

यह आसान है।

गैर-अवरोध का अर्थ गणना और डेटा स्थानांतरित करना एक ही प्रक्रिया के लिए एक ही समय में हो सकता है।

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

+0

इसका कूल धन्यवाद @ पैब पीटर –

3

यह पोस्ट, हालांकि थोड़ा पुराना है, लेकिन मैं स्वीकृत उत्तर का सामना करता हूं। कथन "ये कार्य संचार समाप्त होने तक वापस नहीं आते हैं" थोड़ा गुमराह करना है क्योंकि अवरोध संचार किसी भी हैंडशेक बी/डब्ल्यू भेजने और संचालन प्राप्त करने की गारंटी नहीं देता है।

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

भेजने के विपरीत, प्राप्त करने के लिए केवल एक मोड है और अवरुद्ध हो सकता है या गैर-अवरुद्ध

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

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

1. मानक मोड

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

इस प्रकार मानक मोड में MPI_Send गैर स्थानीय अर्थ है कि मानक मोड में भेजने शुरू किया जा सकता है या नहीं, एक मिलान प्राप्त नियुक्त किया गया है और इसके सफल समापन एक मिलान की घटना पर निर्भर हो सकता प्राप्त में (वजह से है इस तथ्य के लिए यह कार्यान्वयन निर्भर है अगर संदेश buffered किया जाएगा या नहीं)।

मानक भेजने के लिए वाक्य रचना के नीचे है:

int MPI_Send(const void *buf, int count, MPI_Datatype datatype, 
      int dest, int tag, MPI_Comm comm) 

2. बफर मोड

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

बफर भेजने के लिए सिंटेक्स:

int MPI_Bsend(const void *buf, int count, MPI_Datatype datatype, 
      int dest, int tag, MPI_Comm comm) 

3. तुल्यकालिक मोड

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

तुल्यकालिक भेजने के लिए सिंटेक्स:

int MPI_Ssend(const void *buf, int count, MPI_Datatype datatype, int dest, 
       int tag, MPI_Comm comm) 

4. तैयार मोड

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

तैयार भेजने के लिए सिंटेक्स:

int MPI_Rsend(const void *buf, int count, MPI_Datatype datatype, int dest, 
       int tag, MPI_Comm comm) 

सौभाग्य से एमपीआई प्राप्त करने के मामले में बातें उपयोगकर्ताओं के लिए easer रखने का फैसला किया और वहाँ केवल एक को अवरुद्ध करने संचार में प्राप्त करते हैं: MPI_Recv, और किसी के साथ इस्तेमाल किया जा सकता ऊपर वर्णित चार प्रेषण मोड में से। MPI_Recv के लिए, अवरुद्ध करने का अर्थ है जो इसके बफर में डेटा रखने के बाद ही रिटर्न प्राप्त करता है। इसका तात्पर्य यह है कि प्राप्त करने के बाद ही मिलान पूरा हो सकता है लेकिन यह मेल नहीं खाता है कि मिलान पूरा होने से पहले यह पूरा हो सकता है या नहीं।

ऐसी अवरोधन कॉल के दौरान क्या होता है यह है कि अवरुद्ध बफर को मुक्त होने तक गणना रोक दी जाती है। यह आम तौर पर कम्प्यूटेशनल संसाधनों की बर्बादी की ओर जाता है क्योंकि भेजें/रिकव आमतौर पर एक मेमोरी लोकेशन से दूसरे मेमोरी लोकेशन में डेटा कॉपी कर रहा है, जबकि सीपीयू में रजिस्ट्रार निष्क्रिय रहते हैं।

गैर-अवरुद्ध संचार: गैर-अवरुद्ध संचार के लिए, आवेदन समाप्त हो जाता है भेजने के लिए संचार के लिए एक अनुरोध बनाता है और/या प्राप्त करते हैं और वापस एक हैंडल हो जाता है और उसके बाद। यह गारंटी देने के लिए आवश्यक है कि प्रक्रिया को निष्पादित किया गया हो। आईपीआई पुस्तकालय को अधिसूचित किया गया है कि ऑपरेशन को निष्पादित किया जाना है।

प्रेषक पक्ष के लिए, यह संचार के साथ गणना को ओवरलैप करने की अनुमति देता है।

रिसीवर पक्ष के लिए, यह संचार ओवरहेड के एक हिस्से को ओवरलैप करने की अनुमति देता है, यानी मैं सीधे संदेश में प्राप्त पक्ष के पता स्थान में संदेश की प्रतिलिपि बना देता हूं।

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