Я столкнулся со сценарием, в котором мне нужно выделить статический массив типа MPI_Request для отслеживания асинхронных операций отправки и получения MPI.У меня всего 8 операций Isend и Irecv, из которых 4 - Isend, а остальные - Irecv.Однако я не вызываю эти 8 функций сразу.В зависимости от входящих данных эти функции вызываются парами, что означает, что я могу вызвать пару из 1 отправка / получение или 2 отправка / получение или 3 отправка / получение или все сразу.Тот факт, что их будут вызывать парами, точно известен, но сколько их будет называться, неизвестно.Ниже приведен псевдокод:
MPI_Request reqs[8];
MPI_Status stats[8];
if (Rank A exists){
//The process have to send data to A and receive data from A
MPI_Isend(A, ..., &reqs[0]);
MPI_Irecv(A, ..., &reqs[1]);
}
if(Rank B exists){
//The process have to send data to B and receive data from B
MPI_Isend(B, ..., &reqs[2]);
MPI_Irecv(B, ..., &reqs[3]);
}
if(Rank C exists){
//The process have to send data to C and receive data from C
MPI_Isend(C, ..., &reqs[4]);
MPI_Irecv(C, ..., &reqs[5]);
}
if(Rank D exists){
//The process have to send data to D and receive data from D
MPI_Isend(D, ..., &reqs[6]);
MPI_Irecv(D, ..., &reqs[7]);
}
//Wait for asynchronous operations to complete
MPI_Waitall(8, reqs, stats);
Теперь я не уверен, как поведет себя программа.Всего имеется 8 различных асинхронных вызовов функций отправки и получения, и для каждой функции в MPI_reqs[8]
имеется один слот для каждого вызова, но не все функции будут использоваться всегда.Когда некоторые из них не вызываются, некоторые слоты в MPI_reqs[8]
будут неинициализированы.Однако мне нужно MPI_Waitall(8, reqs, stats)
для возврата независимо от того, инициализированы ли все слоты в MPI_reqs[8]
или нет.
Может кто-нибудь объяснить, как программа может вести себя в этом конкретном сценарии?