Как MPI_IN_PLACE работает с MPI_Scatter?

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

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

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

    Sendbuf MPI_scatter имеет значение только для корня в соответствии с mpich ,

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

    Из этого обсуждения,

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

    Поэтому вам необходимо использовать MPI_IN_PLACE в местоположении буфера recv в корневом процессе, например

     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 отправки и том же buf в позиции recv для каждого другого процесса. dummy буфер на принимающих процессорах, вероятно, также может быть заменен на MPI_IN_PLACE .