Поведение MPI_Waitall () с массивом MPI_Request с возможно неинициализированными слотами для асинхронной отправки / записи - PullRequest
0 голосов
/ 31 мая 2018

Я столкнулся со сценарием, в котором мне нужно выделить статический массив типа 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] или нет.

Может кто-нибудь объяснить, как программа может вести себя в этом конкретном сценарии?

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете установить / инициализировать эти пропущенные запросы с помощью MPI_REQUEST_NULL.Тем не менее, почему бы не просто

int count = 0;
...
Isend(A, &reqs[count++]);
...
MPI_Waitall(count, reqs, stats);

Конечно, оставлять значение неинициализированным и передавать его какой-либо функции, которая читает из него, не очень хорошая идея.

...