2015-04-02 5 views
4

Что именно делает MPI_IN_PLACE в качестве аргумента для MPI_Scatter и как его использовать? Я не могу понять из man MPI_Scatter:Как MPI_IN_PLACE работает с MPI_Scatter?

Когда коммуникатор является интракоммуникаторами, вы можете выполнить операцию сбора на месте (выходной буфер используется в качестве входного буфера). Используйте переменную MPI_IN_PLACE как значение корневого процесса recvbuf. В этом случае recvcount и recvtype игнорируются, а корневой процесс не отправляет данные самому себе. Поскольку опция in-place конвертирует буфер приема в буфер отправки и получения, привязка Fortran, которая включает INTENT, должна маркировать их как INOUT, а не OUT.

Что я хочу сделать, это использовать тот же буфер, который содержит данные о корне в качестве буфера приема друг на друга (например, в MPI_Bcast). Будет ли MPI_Scatter с MPI_IN_PLACE позвольте мне сделать это?

ответ

3

sendbuf из MPI_Scatter имеет значение только на корню по mpich,

sendbuf - адрес буфера отправителя (выбор, значимы только в корне)

От this обсуждения,

Для рассеивания/рассеивания MPI_IN_PLACE следует передавать как recvbuf. Для сбора и большинства других коллективов MPI_IN_PLACE должен быть передан как sendbuf.

Вам необходимо использовать MPI_IN_PLACE в буфере рекурсивного каталога в корневом процессе, например.

if (rank == iroot) 
    MPI_Scatter(buf, sendcount, MPI_Datatype, MPI_IN_PLACE, sendcount, 
       MPI_Datatype, iroot, MPI_COMM_WORLD); 
else 
    MPI_Scatter(dummy, sendcount, MPI_Datatype, buf, sendcount, MPI_Datatype, 
       iroot, MPI_COMM_WORLD); 

Вы можете затем использовать buf в посыле на корне и те же buf в положении Recv на каждом другом процессе. Буфер dummy на принимающих процессорах, вероятно, также может быть заменен на MPI_IN_PLACE.

+1

Буфер-пустышка может быть заменен на «NULL», поскольку он никогда не читается. –

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