MPI_Send
कर सकते हैं या ब्लॉक नहीं कर सकते हैं। जब तक प्रेषक प्रेषक बफर का पुन: उपयोग नहीं कर लेता तब तक यह अवरुद्ध होगा। बफर को कम संचार परत पर भेजा गया है जब कुछ कार्यान्वयन कॉलर पर वापस आ जाएगा। दूसरे छोर पर MPI_Recv()
मिलान करने पर कुछ अन्य कॉलर पर वापस आ जाएंगे। तो यह आपके एमपीआई कार्यान्वयन पर निर्भर करता है कि क्या यह कार्यक्रम डेडलॉक होगा या नहीं।
इस कार्यक्रम की वजह से
अलग एमपीआई कार्यान्वयन के बीच अलग-अलग ढंग से व्यवहार करता है आप इसे rewritting विचार कर सकते हैं तो वहाँ संभव गतिरोध नहीं होगा,:,
MPI_Comm_rank (comm, &my_rank);
if (my_rank == 0) {
MPI_Send (sendbuf, count, MPI_INT, 1, tag, comm);
MPI_Recv (recvbuf, count, MPI_INT, 1, tag, comm, &status);
} else if (my_rank == 1) {
MPI_Recv (recvbuf, count, MPI_INT, 0, tag, comm, &status);
MPI_Send (sendbuf, count, MPI_INT, 0, tag, comm);
}
हमेशा ध्यान रखें कि हर MPI_Send()
के लिए वहाँ एक जोड़ी MPI_Recv()
होना चाहिए होना समय में दोनों "समांतर"। उदाहरण के लिए, यह डेडलॉक में समाप्त हो सकता है क्योंकि युग्मन भेजने/आरईवी कॉल समय पर गठबंधन नहीं होते हैं। वे एक दूसरे को पार:
RANK 0 RANK 1
---------- -------
MPI_Send() --- ---- MPI_Send() |
--- --- |
------ |
-- | TIME
------ |
--- --- |
MPI_Recv() <-- ---> MPI_Recv() v
इन प्रक्रियाओं को अन्य रास्ते पर, गतिरोध, निश्चित रूप से प्रदान की में अंत नहीं होगा, वहाँ वास्तव में रैंकों 0 और 1 एक ही संदेश वाहक डोमेन के साथ दो प्रक्रियाओं हैं कि। यदि कम्युनिकेटर com
के आकार रैंक 1 (केवल 0) की अनुमति नहीं है
RANK 0 RANK 1
---------- -------
MPI_Send() ------------------> MPI_Recv() |
| TIME
|
MPI_Recv() <------------------ MPI_Send() v
ऊपर तय कार्यक्रम विफल हो सकता है। इस तरह, if-else
else
मार्ग नहीं लेगा और इस प्रकार, MPI_Send()
के लिए कोई प्रक्रिया नहीं सुनवाई जाएगी और रैंक 0 डेडलॉक होगा।
यदि आपको अपने वर्तमान संचार लेआउट का उपयोग करने की आवश्यकता है, तो आप नॉनब्लॉकिंग भेजने के लिए MPI_Isend()
या MPI_Issend()
का उपयोग करना पसंद कर सकते हैं, इस प्रकार डेडलॉक से परहेज कर सकते हैं।