2013-07-10 2 views
18

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

और सबसे महत्वपूर्ण बात यह है कि, मुझे यकीन है कि MPI_Send() का उपयोग करते समय प्राप्त करने की प्रक्रिया में डेटा प्राप्त किया जा रहा है, इसलिए MPI_Ssend() का उपयोग करते समय यह अनुमान हस्तशिल्प की प्रतीक्षा करने के पक्ष में कुछ भी नहीं लेता है।

या मैं निष्कर्ष निकाल सकता हूं: MPI_Send() के साथ आप स्वयं प्रक्रिया में डेटा भेज सकते हैं लेकिन MPI_Ssend() का उपयोग नहीं कर सकते?

उत्तर

28

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

इस और MPI_SSEND के बीच का अंतर यह है कि उत्तरार्द्ध हमेशा प्राप्त होने पर प्राप्त होने पर प्राप्त होने तक प्रतीक्षा करें। यहां तक ​​कि यदि संदेश छोटा है और आंतरिक रूप से buffered किया जा सकता है, तब भी यह तब तक इंतजार करेगा जब तक कि संदेश दूसरी तरफ प्राप्त नहीं हो जाता है।

MPI_SSEND उदाहरण के लिए MPI_BARRIER किए बिना दोनों प्रक्रियाओं को निष्पादन में एक निश्चित बिंदु तक पहुंचने का एक तरीका है। यदि आपका एप्लिकेशन उसी रैंक को भेज रहा है और प्राप्त कर रहा है, तो MPI_SEND या MPI_SSEND करना सुरक्षित नहीं है, क्योंकि अनिश्चित काल तक ब्लॉक कर सकता है। इसके बजाय, आपको MPI_ISEND और MPI_IRECV का उपयोग करना चाहिए ताकि कॉल तुरंत वापस आ जाए और वास्तविक प्रेषण/प्राप्त एक ही समय में किया जा सके (MPI_WAITALL पर कॉल करें।

+0

और सबसे महत्वपूर्ण बात यह है कि, मुझे पूरा यकीन है कि MPI_Send() का उपयोग करते समय प्राप्त प्रक्रिया में डेटा प्राप्त किया जा रहा है, इसलिए MPI_Ssend() का उपयोग करते समय हैंडशेक की प्रतीक्षा करने के लिए यह अनुमान कुछ भी नहीं करता है। मेरा कोड MPI_Send() के साथ ठीक काम करता है लेकिन MPI_Ssend() के साथ अनिश्चित काल तक प्रतीक्षा करता है। किसी भी संभावित कारणों के बारे में सोचें? –

+0

यह पूरी तरह से आपके कोड पर निर्भर करेगा। अगर किसी कारण से आपका कोड किसी भी कारण से 'एमपीआई_एसईएनडी' से प्रगति के बिना 'एमपीआईजीसीवी' के मिलान कॉल तक नहीं पहुंचता है, जो डेडलॉक का कारण बन सकता है, लेकिन कोड को देखे बिना बताने का कोई तरीका नहीं है। –

+0

http://stackoverflow.com/questions/ 17820445/ओपनएमपी-हैलो-वर्ल्ड-ऑन-क्लस्टर क्या आप इसका जवाब दे सकते हैं? एमपीआई मानक का जिक्र करने के लिए –