MPI_Scatter 函数
将来自一个成员的数据分散到组的所有成员。 MPI_Scatter函数执行由 MPI_Gather 函数执行的运算的反函数。
语法
int MPIAPI MPI_Scatter(
_In_ void *sendbuf,
int sendcount,
MPI_Datatype sendtype,
_Out_ void *recvbuf,
int recvcount,
MPI_Datatype recvtype,
int root,
MPI_Comm comm
);
参数
sendbuf [in]
缓冲区的句柄,该缓冲区包含根进程要发送的数据。对于所有非根进程,将忽略 sendbuf 参数。
如果 comm 参数引用内部通信器,则可以通过在根进程中指定 MPI_IN_PLACE 来指定就地选项。 将忽略 recvcount 和 recvtype 参数。 散点向量仍被视为包含 n 段,其中 n 是组大小;与根进程对应的段不会移动。
sendcount
发送缓冲区中的元素数。 如果 sendcount 为零,则消息的数据部分为空。对于所有非根进程, 将忽略 sendcount 参数。
sendtype
缓冲区中每个元素的数据类型。对于所有非根进程, 将忽略 sendcount 参数。
recvbuf [out]
缓冲区的句柄,该缓冲区包含在每个进程中接收的数据。 缓冲区中元素的数目和数据类型在 recvcount 和 recvtype 参数中指定。recvcount
接收缓冲区中的元素数。 如果计数为零,则消息的数据部分为空。recvtype
接收缓冲区中元素的数据类型。root
指定通信器中发送进程的排名。comm
MPI_Comm通信器句柄。
返回值
返回成功 时MPI_SUCCESS 。 否则,返回值为错误代码。
在 Fortran 中,返回值存储在 IERROR 参数中。
Fortran
MPI_SCATTER(SENDBUF, SENDCOUNT, SENDTYPE, RECVBUF, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER SENDCOUNT, SENDTYPE, RECVCOUNT, RECVTYPE, ROOT, COMM, IERROR
注解
MPI_Scatter 函数的效果就像根进程使用 MPI_Send 函数发送消息一样。 此消息拆分为 n 个相等的段,组的每个成员对应一个段。 第 i段将发送到组中的第 i个进程。
如果 comm 是内部通信器,则结果就像根执行 n 个发送操作 MPI_Send(sendbuf + i*sendcount*extent(sendtype), sendcount, sendtype, I, …)
一样;并且每个进程都执行了接收 MPI_Recv(recvbuf, recvcount, recvtype, i,…)
。
由 根进程的 sendcount 和 sendtype 参数指定的类型签名必须等于 由 recvcount 指定的类型签名,以及所有进程的 recvtype 参数。 因此,发送的数据量必须等于在任何进程对之间接收的数据量。 仍允许在发送方和接收方之间进行不同的类型映射。
所有函数参数在根进程中都很重要,只有 recvbuf、 recvcount、 recvtype、 root 和 comm 参数在其他进程中都很重要。 根参数和 comm 参数在所有进程中必须相同。
计数和类型的规范不应导致多次读取根上的任何位置。
如果 comm 参数引用对讲器,则调用涉及对讲器中的所有进程,但包含一个组 A,用于定义根进程。 另一组 B 中的所有进程在根参数中设置相同的值,即组 A 中根进程的排名。根进程在根参数中MPI_ROOT设置值。 组 A 中的所有其他进程MPI_PROC_NULL根参数中设置值。 数据从根进程广播到组 B 中的所有进程。B 组中进程的 缓冲区 参数必须与根进程的 buffer 参数一致。
要求
产品 |
HPC Pack 2012 MS-MPI 可再发行程序包、HPC Pack 2008 R2 MS-MPI 可再发行程序包、HPC Pack 2008 MS-MPI 可再发行程序包或 HPC Pack 2008 客户端实用工具 |
标头 |
Mpi.h;Mpif.h |
库 |
Msmpi.lib |
DLL |
Msmpi.dll |