2013-06-12 9 views
5

MPI_Isend के बारे में, एमपीआई मानक कहते हैं, "एक nonblocking भेजने कॉल इंगित करता है कि प्रणाली भेजने बफर से बाहर डेटा की प्रतिलिपि शुरू हो सकता है। के बाद एक nonblocking भेजने आपरेशन कहा जाता है इस भेजने बफर के किसी भी भाग का उपयोग नहीं करना चाहिए, जब तक प्रेषण पूरा करता है।" (http://www.mpi-forum.org/docs/mpi-11-html/node46.html)एक बफर पर MPI_Isend कई बार कॉल करने के लिए ठीक है?

प्रेषण बफर को किसी अन्य प्रेषण कॉल में संदर्भित कर रहा है ठीक है, या क्या "प्रेषण बफर के किसी भी हिस्से तक पहुंच" में शामिल है?

दूसरे शब्दों में, प्रेषक के लिए निम्नलिखित सी कोड सही है?

MPI_Request req[2]; 
MPI_Status statuses[2]; 
... 
MPI_Isend(buf, type, count, dest0, tag, comm, &req[0]); 
MPI_Isend(buf, type, count, dest1, tag, comm, &req[1]); 
MPI_Waitall(2, req, statuses); 
+0

मैं यहाँ अनुमान लगा रहा हूँ, जिसके कारण यह एक पूर्ण जवाब के रूप में में नहीं जा रहा है, क्या तुम सच में ऐसा करने के लिए नहीं करना चाहती स्रोत बफर की सामग्री को संशोधित या पहले गंतव्य बफर की सामग्री पढ़ने है कि भेजना पूरा हो गया है तो मेरे लिए, आप क्या कर रहे हैं ठीक दिखता है। लेकिन कृपया परीक्षण करें। इसके लिए मेरा शब्द मत लो। –

+0

@ bob.sacamento बेशक, यह सच है। और मुझे पता है कि एमपीआईआई कार्यान्वयन के लिए मेरा कोड सही होगा (स्रोत कोड को देखा गया), लेकिन मैं जानना चाहता हूं कि यह मानक के अनुसार सही है या नहीं, यानी एमपीआई के हर सही कार्यान्वयन पर काम करेगा। –

उत्तर

2

एमपीआई मानक इस तरह के उपयोग की अनुमति देता है।

यदि वहां एक और बफर की आवश्यकता वाले "मुट्ठी भर" रैंक हैं, या यदि इस संचार पटर को "मुट्ठी भर" से अधिक बार दोहराया जाएगा ... फिर प्रासंगिक रैंक के साथ एक कॉम बनाना, और MPI_Bcast का उपयोग करना बेहतर होगा।

संपादित करें:

मेरे अपने उत्तर को स्पष्ट करने के लिए। एमपीआई 2.0 मानक विशेष रूप से इस तरह के उपयोग को प्रतिबंधित करता है। फोरट्रान को समायोजित करना था। एमपीआई 2.1 या 2.2 मानक में "स्पष्टीकरण" शामिल था कि एकाधिक ISends में एक प्रेषण बफर का पुन: उपयोग अनुमत था। अधिक के लिए एमपीआई 2.2 मानक की धारा 16.2.2 देखें।

+1

धन्यवाद। एमपीआई 2.2 मानक का वह खंड प्रबुद्ध था। –

1

मैं सिर्फ MPI 3.0 Standard सलाह ली और निम्न जानकारी मिली:

एक nonblocking भेजने कॉल इंगित करता है कि प्रणाली भेजने बफर से बाहर डेटा की प्रतिलिपि शुरू हो सकता है। प्रेषक को भेजने के बफर के किसी भी भाग को संशोधित नहीं करना चाहिए भेजने के ऑपरेशन को तब तक बुलाया जाता है जब तक कि प्रेषण पूरा नहीं हो जाता है।

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

+0

हम्मम्म, यही वह है जिसे मैं डरता था। क्या मानक निर्दिष्ट करता है कि भेजने के समय बफर भेजने के लिए आवेदन को "लौटाया जाना चाहिए", या उन्हें संशोधित किया जा सकता है? मैं सिर्फ यह नहीं देख सकता कि वास्तव में एक प्रेषण बफर को संशोधित करके उचित कार्यान्वयन कैसे लाभान्वित होगा। –

+1

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

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