एक प्रतीत होता है मूर्ख सवाल है, लेकिन मुझे एक निश्चित उत्तर एक या दूसरे तरीके से नहीं मिल रहा है।क्या मुझे एमपीआई :: Isend के लिए एक संबंधित एमपीआई :: Irecv होना चाहिए?
मूल प्रश्न क्या मुझे एक एमपीआई :: Isend के लिए संबंधित एमपीआई :: Irecv होना चाहिए?
यही है, भले ही संदेश भेजने, गैर अवरुद्ध है जब तक मैं इंतजार भेजने बफ़र्स पुन: उपयोग से पहले पूरा करने के लिए भेजता है, मैं गैर अवरुद्ध का उपयोग करने के & इंतजार प्राप्त भेजा बफ़र्स प्राप्त करने के लिए की जरूरत है?
मेरा मुद्दा यह है कि, मैं संदेश भेज रहा हूं, जबकि गैर-अवरोधन "अन्य सामान" करने के लिए भेजता है लेकिन रिसीवर प्रक्रिया तुरंत बफर का उपयोग करेगी, इसलिए मैं उन्हें बफर को वास्तव में प्राप्त होने तक अवरुद्ध करना चाहता हूं।
ऐसा लगता है कि मुझे MPI :: Recv के साथ संदेश प्राप्त करने में सक्षम होना चाहिए, भले ही उन्हें MPI :: Isend के साथ भेजा गया हो लेकिन मुझे आश्चर्य है कि मुझे कुछ याद आ रहा है?
सरल छद्म एक छोटा सा कोड
if(rank == 0){
int r;
for (int i = 0; i < n; i++){
// DO SOME STUFF HERE...
request.Wait(status);
request2.Wait(status);
request3.Wait(status);
r = i;
memcpy(key, fromKey(i), ...);
memcpy(trace, fromTrace(i), ...);
request = MPI::COMM_WORLD.Isend(&r, 1, MPI::INT, node, tag);
request2 = MPI::COMM_WORLD.Isend(key, 10, MPI::INT, node, tag);
request3 = MPI::COMM_WORLD.Isend(trace, nBytesTotal, MPI::BYTE, node, tag);
// DO SOME MORE STUFF HERE.
}
r = -1;
request = MPI::COMM_WORLD.Isend(&r, 1, MPI::INT, node, tag);
// Carry on ...
} else {
int r = -1;
MPI::COMM_WORLD.Recv(&r, 1, MPI::INT, 0, tag, status);
while(r >= 0){
MPI::COMM_WORLD.Recv(&key, 10, MPI::INT, 0, tag, status);
memcpy(saveKey, key, ...);
MPI::COMM_WORLD.Recv(&trace, nBytesTotal, MPI::BYTE, 0, tag, status);
memcpy(saveTrace, trace, ...);
MPI::COMM_WORLD.Recv(&r, 1, MPI::INT, 0, tag, status);
}
यहां का जवाब आपको रूचि दे सकता है: http://stackoverflow.com/questions/9408704/mpi-send-and-receive-questions –