2010-12-03 11 views
24

मैं एमपीआई में एक प्रोग्राम को कार्यान्वित कर रहा हूं जिसमें मुख्य प्रक्रिया (रैंक = 0 के साथ) उन अन्य प्रक्रियाओं से अनुरोध प्राप्त करने में सक्षम होना चाहिए जो चर के मूल्यों के लिए पूछते हैं जो केवल रूट द्वारा ज्ञात हैं । यदि मैं रैंक 0 द्वारा MPI_Recv (...) बना देता हूं, तो मुझे उस प्रक्रिया का रैंक निर्दिष्ट करना होगा जो रूट को अनुरोध भेजता है, लेकिन मैं इसे नियंत्रित नहीं कर सकता क्योंकि प्रक्रियाएं क्रमशः 1,2 में नहीं चलती हैं, 3, .... मैं किसी भी रैंक से अनुरोध कैसे प्राप्त कर सकता हूं और इसे आवश्यक जानकारी भेजने के लिए उत्सर्जन प्रक्रिया की संख्या का उपयोग कैसे कर सकता हूं?किसी अज्ञात स्रोत से MPI recv

उत्तर

44

यह मानता है कि आप सी का उपयोग कर रहे हैं सी ++ और फोरट्रान में समान अवधारणाएं हैं। आप MPI_recv() में स्रोत के रूप में बस MPI_ANY_SOURCE निर्दिष्ट करेंगे। स्थिति संरचना में संदेश का वास्तविक स्रोत होता है।

int buf[32]; 
MPI_Status status; 
// receive message from any source 
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
int replybuf[]; 
// send reply back to sender of the message received above 
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD); 
+0

बहुत बहुत धन्यवाद !! मुझे यह नहीं पता था, लेकिन वास्तव में बहुत उपयोगी – shkk

+0

ऐसा लगता है कि संपादन ने कोड को अनुपयोगी बनाया है। मूल स्थिति के स्रोत की पहचान करने के लिए 'स्थिति' संरचना वास्तव में 'एमपीआई_Send' ऑपरेशन के लिए उपयोग की जाती है:' status.MPI_SOURCE' – Marius

+1

@ मैरियस धन्यवाद, मैं मूल संस्करण पर वापस आ गया हूं, और कुछ टिप्पणियां जोड़ दी हैं चीजों को स्पष्ट करें। – KeithB

2

MPI_ANY_SOURCE स्पष्ट उत्तर है।

हालांकि, यदि सभी रैंक 0 रैंक के लिए अनुरोध भेज रहे हैं, तो MPI_Irecv MPI_Testall के साथ संयुक्त भी एक पैटर्न के रूप में काम कर सकता है। यह MPI_Send कॉल को किसी भी क्रम में निष्पादित करने की अनुमति देगा, और MPI_Irecv कॉल का मिलान होने के क्रम में जानकारी प्राप्त और संसाधित की जा सकती है।

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