Comment MPI_IN_PLACE fonctionne-t-il avec MPI_Scatter?

Que fait exactement MPI_IN_PLACE lorsqu’il est donné comme argument à MPI_Scatter et comment doit-il être utilisé? Je n’arrive pas à comprendre l’ man MPI_Scatter :

Lorsque le communicateur est un intracommunicateur, vous pouvez effectuer une opération de regroupement sur place (le tampon de sortie est utilisé comme tampon d’entrée). Utilisez la variable MPI_IN_PLACE en tant que valeur du processus racine recvbuf. Dans ce cas, recvcount et recvtype sont ignorés et le processus racine n’envoie aucune donnée à lui-même. Etant donné que l’option in-situ convertit le tampon de réception en un tampon d’envoi-réception, une liaison Fortran incluant INTENT doit les marquer comme INOUT, pas OUT.

Ce que je veux faire, c’est utiliser le même tampon qui contient les données sur la racine en tant que tampon de réception à chaque processus (comme dans MPI_Bcast ). MPI_Scatter avec MPI_IN_PLACE me permettra-t-il de le faire?

Le sendbuf de MPI_scatter n’est pertinent que sur la racine selon mpich ,

sendbuf – adresse du tampon d’envoi (choix, significatif uniquement à la racine)

De cette discussion,

Pour scatter / scatterv, MPI_IN_PLACE doit être passé en tant que recvbuf. Pour rassembler et la plupart des autres collectifs, MPI_IN_PLACE doit être transmis en tant que sendbuf.

Vous devez donc utiliser MPI_IN_PLACE à l’emplacement du tampon recv du processus racine, par exemple:

 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); 

Vous pouvez ensuite utiliser buf dans la racine d’envoi et le même buf dans la position de réception de chaque processus. Le tampon dummy sur les processeurs récepteurs pourrait probablement aussi être remplacé par MPI_IN_PLACE .