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(),

Другие вопросы по тегам