В парах MPI_SEND / MPI_RECV могут быть потеряны данные, если он не синхронизирован правильно?
-
27-09-2019 - |
Вопрос
Позволь мне объяснить. Рассмотрим 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
структура, чтобы увидеть, откуда сообщение было отправлено.