2012-03-15 17 views
5

मैं एक विशिष्ट टैग के साथ संदेश प्राप्त करने वाले रैंकों में से एक को एक संदेश भेजना चाहता हूं। यदि कोई रैंक संदेश प्राप्त हुआ है और संदेश खपत है। MPI_Recv() में हम MPI_ANY_SOURCE/MPI_ANY_TAG का उपयोग करके एक संदेश प्राप्त कर सकते हैं लेकिन MPI_Send() यह नहीं कर सकता है। मैं अज्ञात गंतव्य के साथ एक संदेश कैसे भेज सकता हूं? MPI_Bcast() ऐसा नहीं कर सकता क्योंकि प्राप्त करने के बाद, मुझे स्रोत प्रक्रिया का उत्तर देना होगा। धन्यवाद।एमपीआई में किसी विशिष्ट गंतव्य के बिना संदेश कैसे भेजें?

+0

यदि रिसीवर जानता है कि उसे किस डेटा की आवश्यकता है, तो आप एक तरफा एमपीआई संचालन, अर्थात 'एमपीआई_गेट 'का उपयोग कर सकते हैं। –

+1

यह प्रश्न http://scicomp.stackexchange.com पर वास्तव में अच्छी तरह से प्राप्त होगा –

उत्तर

4

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

1

क्या आप इसे एक यादृच्छिक रैंक पर एक संदेश भेजना चाहते हैं?

MPI_Comm_size(MPI_COMM_WORLD, &size); 
sendto = rand() % size; 
MPI_Send(buffer, count, MPI_CHAR, sendto, 0, MPI_COMM_WORLD); 
1

संक्षिप्त उत्तर यह है: आप एमपीआई में ऐसा नहीं कर सकते हैं।

थोड़ा लंबा जवाब यह है: आप शायद ऐसा नहीं करना चाहते हैं। मुझे लगता है कि आप कुछ प्रकार के काम-चोरी को स्थापित करने की कोशिश कर रहे हैं। जैसा कि सस्ज़टरपैट ने सुझाव दिया था, आप भेजने के प्रक्रिया से काम को 'पकड़ने' के लिए एक तरफा संचार का उपयोग कर सकते हैं, लेकिन आपको ताले का उपयोग करने की आवश्यकता होगी, और यह तब तक कई प्रक्रियाओं तक स्केल नहीं करेगा जब तक कि स्थानीय प्रक्रिया समूह के बारे में कुछ विचार न हो (यानी, आपके पास एक प्रक्रिया से सभी काम-चोरी की 1,000 प्रक्रियाएं नहीं हो सकती हैं, आपको चीजों को विघटित करने की आवश्यकता होगी)।