في أزواج MPI_SEND / MPI_RECV ، هل يمكن أن تضيع البيانات إذا لم يتم مزامنتها بشكل صحيح؟

StackOverflow https://stackoverflow.com/questions/4265693

سؤال

دعني أشرح. ضع في اعتبارك 4 عقد عبيد 1 و 2 و 3 و 4 وعقدة رئيسية 0. الآن ، 1 ، 2 ، 3 ، 4 ، تحتاج إلى إرسال البيانات إلى 0. 0 يتلقى هذه البيانات بالتنسيق التالي.

for(int proc = 1;proc<procCount;proc++) // for each processor cpu (procCount = 5)
{
    for(int p = 0;p<50;p++)
    {

    std::cout<<proc<<"\tA\t"<<p<<std::endl;

    // read in binary datas
   int chunkP;
   int realP;
   real fitnessVal;
   real fitnessValB;
   real fitnessValC;
   int conCount;
   real subConCount;
   real networkEnergyLoss;
   real movementEnergyLoss;
   long spikeCount;

   MPI_Recv (reinterpret_cast < char *>(&chunkP),
      sizeof (chunkP),
                     MPI_CHAR,proc,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
   MPI_Recv (reinterpret_cast < char *>(&realP),
      sizeof (realP),
                        .
                        .
                        .
           }
     }

من الواضح أن الترتيب الذي لا يمكن افتراض البيانات 1 و 2 و 3 و 4 إلى 0 (لأنها تعمل جميعًا بشكل مستقل عن بعضها البعض - قد يرسل 2 البيانات قبل 1). لذلك ، على افتراض أن 2 لا يرسل بياناته قبل 1 (على سبيل المثال) ، لن تبدأ حلقة الاستلام في 0 الموضحة أعلاه حتى تتم مطابقة علامة المصدر "Proc" في أمر MPI_RECV مع المعالج "1" لأن الخارجي لقوات الحلقة هذا الترتيب.

إذن ما يحدث هو حلقة "الانتظار" حتى تكون هناك بيانات واردة من 1 قبل أن تتمكن من فعل أي شيء آخر حتى لو كانت هناك بيانات تصل بالفعل من 2 و 3 و 4. ما يحدث لهذه البيانات التي تصل من 2،3 و 4 إذا كانت يصل قبل 1؟ هل يمكن "نسيانها" بمعنى أنه بمجرد أن تبدأ البيانات من "1" في الوصول ، ثم قم بزيادة الزيادات إلى 2 ، فإن البيانات التي حاولت في الأصل تلقيها من 2 ليست ببساطة هناك؟ إذا تم نسيانها ، فسوف يتم تعليق المحاكاة الموزعة بأكملها ، لأنها لا تنتهي أبدًا من معالجة بيانات عملية عبيد معينة بشكل صحيح.

شكرا بن.

هل كانت مفيدة؟

المحلول

أولاً ، هل تقصد حقًا الحصول على MPI_CHAR في chunkp - int - ألا يجب أن تتلقى MPI_INT?

لن تضيع الرسائل من صفوف 1: 4 - سوف تحصل على قائمة الانتظار حتى تختار المرتبة 0 لاستلامها. يتم تكليف هذا السلوك وفقًا لمعيار MPI.

إذا كانت الرسائل كبيرة بما يكفي ، فقد تحتل المرتبات 1: 4 أن تتمكن بالفعل من إرسال رسائلها إلى المرتبة 0 (معظم تطبيقات MPI لها محدودة التخزين المؤقت).

قد تفكر أيضًا في الحصول على المرتبة 0 MPI_ANY_SOURCE تلقي لأول مرة لمعرفة من هو مستعد لإرساله. ستحتاج إلى الاهتمام على الرغم من أن يتم نشر استلام اللاحق للمصدر المقابل - انظر في MPI_Status بنية لمعرفة من أين تم إرسال الرسالة بالفعل من.

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