В парах 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?

Сообщения от RINGS 1: 4 не будут потеряны - они будут очевидны до того, как ранг 0 выбирают их, чтобы получить их. Это поведение предусмотрено стандартом MPI.

Если сообщения достаточно большие, ранг 1: 4 могут блокировать, пока они не смогут на самом деле не смогут отправлять свои сообщения на ранг 0 (большинство реализаций MPI имеют ограниченную буферизацию).

Вы также можете рассмотреть вопрос о том, чтобы ранг 0 сделать MPI_ANY_SOURCE Получите для первого получения, чтобы увидеть, кто готов отправить. Вам нужно будет позаботиться, хотя для обеспечения размещения последующих получений для соответствующего источника - посмотрите в MPI_Status структура, чтобы увидеть, откуда сообщение было отправлено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top