MPI Isend и Ireceive не работает
У меня проблема с использованием Isend и Ireceive. Я пытаюсь отправить сообщение всем другим процессорам и после этого получать сообщения такого же типа от других процессоров, которые выполняли тот же метод Isend.
void msgs(int my_rank, int num_procs){
int arrive_count = 1;
int leave_count = 0;
int i;
bool b_req = true;
MPI_Request req, req2;
//Send to all other procs
for(i=0; i<num_procs; i++){
if(i != my_rank){
MPI_Isend(&b_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req);
}
}
bool c_req;
//Receive msgs from all other procs
while(arrive_count != num_procs){
for(i=0; i<num_procs; i++){
if(i != my_rank){
MPI_Irecv(&c_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req2);
if(c_req){
c_req = false;
arrive_count ++;
}
MPI_Request_free(&req2);
}
}
}
printf("Done from rank: %d \n", my_rank);
}
1 ответ
Решение
В вашем фрагменте есть как минимум три проблемы:
- вы не можете использовать
MPI_BYTE
сbool
, Стандарт MPI позволяет использоватьMPI_C_BOOL
с_Bool
Другим вариантом является ручное преобразование междуbool
а такжеbyte
перед передачейMPI_BYTE
- ты не используешь
MPI_Isend()
ниMPI_Recv()
правильно. У вас должен быть массив запросов, звонитеMPI_Waitall()
в конце. - вы также можете
MPI_Irecv()
все удаленные узлы в первом цикле, а затемMPI_Test()
чтобы проверить, поступило ли сообщение в другой цикл (обратите внимание, вам понадобится массивc_req
), или иметь один цикл, которыйMPI_Iprobe()
а такжеMPI_Recv()
сразу после того, как сообщение пришло (и это потребовало одногоc_req
,
Как примечание, и если вы не делаете какую-либо обработку в while
цикл, вы можете рассмотреть коллективные операции, такие как MPI_Alltoall()
,