Зонд для МПИ брошены или MPI отправить


У меня есть программа, в которой есть настройка master/slave, и у меня есть некоторые функции, реализованные для master, который отправляет различные виды данных в slave. Некоторые функции посылают отдельным подчиненным устройствам, но некоторые передают информацию всем подчиненным устройствам через MPI_Bcast.

Я хочу иметь только одну функцию receive в ведомых устройствах, поэтому я хочу знать, могу ли я проверить сообщение и узнать, было ли оно передано или отправлено как обычное блокирующее сообщение, так как существуют различные методы, чтобы принимайте то, что было передано, и то, что было отправлено в обычном режиме.

1 2

1 ответ:

Нет, вы не можете решить, вызывать ли Bcast или Recv на основе зондирующего вызова.

Вызов MPI_Bcast является коллективной операцией - все задачи MPI должны участвовать. В результате они не похожи на коммуникацию точка-точка; они используют тот факт, что все процессы вовлечены в оптимизацию более высокого порядка.

Поскольку коллективные операции подразумевают такую большую синхронизацию, просто не имеет смысла позволять другим задачам проверять, должны ли они начните участвовать в коллективе; это то, что должно быть встроено в логику программы.

  • Роль корневого процесса в широковещательной передаче не похожа на отправку; в общем случае он не может просто вызвать MPI_Bcast и затем продолжить. Реализация почти наверняка будет блокироваться до тех пор, пока некоторое другое число процессов не примет участие в трансляции; и

  • Роль другого процесса в широковещательной передаче не похожа на получение сообщения; в общем случае он будет получать и то и другое и посылать информацию. Таким образом, участие в трансляции отличается от простого вызова Recv.

Таким образом, Probe не будет работать; документация для MPI_Probe довольно ясно, что она возвращает информацию о том, что произойдет при следующем MPI_Recv, и Recv-это другая операция, чем Bcast.

Вы можете получить часть того, что вы хотите в MPI 3.0, который сейчас дорабатывается, что позволяет использовать неблокирующие коллективы-например, MPI_Ibcast. В том дело в том, что вы можете запустить трансляцию и вызвать MPI_Test, чтобы проверить статус запроса. Тем не менее, даже здесь, каждый должен был бы вызвать MPI_Ibcast в первую очередь; это просто позволяет легче чередовать коллективные и точка-точка коммуникации.