سؤال

أقوم بتنفيذ برنامج 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top