Какая польза от статуса MPI_Isend, полученного с помощью MPI_Wait?
Случай: 1. Какой смысл использовать статус, полученный с помощью MPI_Wait()
if(rank==0)
MPI_Isend(&buffer0, count, MPI_INT, 1, 0, MPI_COMM_WORLD, &request0);
if(rank==1)
MPI_Recv(&buffer1, count, MPI_INT, 0, 0, MPI_COMM_WORLD);
if(rank==0)
MPI_Wait(&request0, &status);
// Can i use status here to do something?
MPI_Finalize();
Корпус:2. Использование статуса понятно здесь (просто добавлено для сравнения)
if(rank==0)
MPI_Ssend(&buffer0, count, MPI_INT, 1, 0, MPI_COMM_WORLD);
if(rank==1)
MPI_Irecv(&buffer1, count, MPI_INT, 0, 0, MPI_COMM_WORLD, &request1);
if(rank==1)
MPI_Wait(&request1, &status);
printf("The source is %d", status.MPI_SOURCE);
MPI_Finalize();
1 ответ
Решение
В общем-то MPI_Status
используется для получения следующих свойств полученных сообщений.
- звание отправителя, (
status.MPI_SOURCE
) особенно актуально, когдаMPI_ANY_SOURCE
использовался. - тег сообщения, (
status.MPI_TAG
) особенно актуально, когдаMPI_ANY_TAG
использовался - количество отправленных элементов, которое может отличаться от принятого буфера приема, используя
MPI_Get_count
,
Для отправки сообщений вы можете использовать статус для проверки MPI_Test_cancelled
, Кроме того, для функций, которые возвращают несколько статусов, таких как MPI_Waitall
, в случае ошибок, вы можете использовать status[i].MPI_ERROR
, Основная функция ожидания вернется MPI_ERR_IN_STATUS
в этом случае.
Если вам не нужно ничего из этого, вы можете пройти MPI_STATUS_IGNORE
вместо MPI_Status*
,