MPI RECV من مصدر غير معروف
-
30-09-2019 - |
سؤال
أقوم بتنفيذ برنامج MPI حيث يجب أن تكون العملية الرئيسية (مع المرتبة = 0) قادرة على تلقي طلبات من العمليات الأخرى التي تطلب قيم المتغيرات المعروفة فقط من قبل الجذر. إذا قمت بعمل MPI_RECV (...) بالمرتبة 0 ، يجب أن أحدد رتبة العملية التي ترسل طلبًا إلى الجذر ، لكن لا يمكنني التحكم في ذلك نظرًا لأن العمليات لا تعمل بالترتيب 1،2،3 ، .... كيف يمكنني تلقي الطلب من أي رتبة واستخدام رقم عملية الانبعاث لإرسال المعلومات اللازمة؟
المحلول
هذا يفترض أنك تستخدم C. هناك مفاهيم مماثلة في C ++ و Fortran. ستحدد فقط MPI_ANY_SOURCE
كمصدر في MPI_recv()
. يحتوي هيكل الحالة على المصدر الفعلي للرسالة.
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);
نصائح أخرى
MPI_ANY_SOURCE هي الإجابة الواضحة.
ومع ذلك ، إذا كانت جميع الرتب سترسل طلبًا إلى المرتبة 0 ، فقد يعمل MPI_IRECV مع mpi_testall أيضًا كنمط. سيتيح ذلك تنفيذ مكالمات MPI_SEND بأي أمر ، ويمكن استلام المعلومات ومعالجتها بالترتيب الذي تتم مطابقة مكالمات MPI_IRECV.