У меня есть приложение, в котором каждый процессор должен отправлять данные на определенное количество процессоров и данные recv из неизвестного количества процессоров с неизвестным размером данных при выполнении локальных файлов. Это то, что я имею в виду:Когда MPI_Iprobe вернется?
MPI_Isend(...)
// Do local computation
MPI_Wait(...)
int flag;
MPI_Status st;
MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st);
While(flag) {
MPI_Irecv(st.MPI_SOURCE,...);
MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st);
}
Am I гарантирует, что MPI_Iprobe
в этом случае будет иметь возможность найти каждый и каждый из отправленных сообщений? Я с подозрением отношусь к тому, что если текущий ранг имеет меньше работы, он достигнет MPI_Iprobe
, прежде чем у других процессоров будет достаточно времени для фактического отправки сообщения, и в этом случае я пропущу некоторые сообщения. В этом случае, используя MPI_Barrier
после MPI_Wait
решить проблему?
Какие еще варианты я могу решить эту проблему?
Проблема в том, что количество отдельных сообщений, их источников и все размеры сообщений неизвестны. Это означает, что я не могу использовать 'MPI_Probe' (я думаю), поскольку у меня нет способа узнать, сколько раз я должен его называть. ЕСЛИ я называю это более чем необходимым, этот процесс застрянет навсегда! Что касается приема, я использую 'MPI_Irec', чтобы разрешить вычисление/связь. Что меня смущает, я точно не знаю, что делает 'MPI_Iprobe' определять, что сообщение« прибыло », – GradGuy