#c #mpi
#c #mpi
Вопрос:
Я заметил, что не все мои MPI_Isend / MPI_Irecv выполнялись. Я думаю, что это может быть либо порядок, в котором я выполняю отправку и получение, либо тот факт, что код не ожидает, пока не будут выполнены все команды. Я скопировал отрывок из приведенного ниже кода. Не могли бы вы подсказать, что я мог делать неправильно?
Спасибо!
MPI_Status status[8];
MPI_Request request[8];
....
....
if ((my_rank) == 0)
{
MPI_Isend(eastedge0, Rows, MPI_DOUBLE, my_rank 1, 0, MPI_COMM_WORLD, amp;request[0]);
MPI_Irecv(westofwestedge0, Rows, MPI_DOUBLE, my_rank 1, MPI_ANY_TAG, MPI_COMM_WORLD, amp;request[6]);
MPI_Wait(amp;request[6], amp;status[6]);
}
if ((my_rank) == 1)
{
MPI_Irecv(eastofeastedge1, Rows, MPI_DOUBLE, my_rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, amp;request[0]);
MPI_Wait(amp;request[0], amp;status[0]);
MPI_Isend(westedge1, Rows, MPI_DOUBLE, my_rank-1, 0, MPI_COMM_WORLD, amp;request[6]);
}
Ответ №1:
Данные ранга 0 или 1 все еще могут отправляться после выполнения этого блока кода (поскольку вы не ожидаете объект запроса отправки). Это может вызвать проблемы, если вы измените данные до завершения их отправки.
Для этого конкретного примера, возможно, MPI_Sendrecv было бы полезно?
Ответ №2:
Для каждого вызова неблокирующего вызова MPI должно быть соответствующее ожидание. Вам не хватает одного ожидания для каждого процесса.