2014-01-26 1 views
0

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

Какие еще варианты я могу решить эту проблему?

ответ

1

Если я не понял вашу проблему, вы можете просто использовать обычный MPI_PROBE. Это заставило бы ждать, пока сообщение действительно поступит.

Однако, я не совсем уверен, почему вам нужно использовать зонд вообще. Кажется, что из вашего примера кода вы будете хорошо использовать обычный MPI_RECV с MPI_ANY_SOURCE. MPI_RECV не требует именованного источника.

+0

Проблема в том, что количество отдельных сообщений, их источников и все размеры сообщений неизвестны. Это означает, что я не могу использовать 'MPI_Probe' (я думаю), поскольку у меня нет способа узнать, сколько раз я должен его называть. ЕСЛИ я называю это более чем необходимым, этот процесс застрянет навсегда! Что касается приема, я использую 'MPI_Irec', чтобы разрешить вычисление/связь. Что меня смущает, я точно не знаю, что делает 'MPI_Iprobe' определять, что сообщение« прибыло », – GradGuy

Смежные вопросы