常用集合通信函数:
// 归约:从每个进程收集数据到一个进程的单个值
int MPI_Reduce (void *sendbuf,
void *recvbuf,
int count,
MPI_Datatype datatype,
MPI_Op op, // 操作符:MPI_MAX, MPI_SUM...
int root,
MPI_Comm comm)
// 先归约得到值然后分发结果到每一个进程:
int MPI_Allreduce (void *sendbuf,
void *recvbuf,
int count,
MPI_Datatype datatype,
MPI_Op op,
MPI_Comm comm)
// 广播:将相同数据分发到各个进程,内存同步
int MPI_Bcast (void *buffer,
int count,
MPI_Datatype datatype,
int root,
MPI_Comm comm)
// 散射相同长度的数据:
int MPI_Scatter (void *sendbuf,
int sendcnt, // 指的是单个数据的长度,不是发多少个线程
MPI_Datatype sendtype,
void *recvbuf,
int recvcnt,
MPI_Datatype recvtype,
int root,
MPI_Comm comm)
// 散射不同长度数据
// 与MPI_Scatter类似,但允许sendbuf中每个数据块的长度不同并且可以按任意的顺序排放。
// sendbuf、sendtype、sendcnts和displs仅对根进程有意义。
// 数组sendcnts和displs的元素个数等于comm中的进程数,
// 它们分别给出发送给每个进程的数据长度和位移,均以sendtype为单位。
int MPI_Scatterv (void *sendbuf,
int *sendcnts,
int *displs,
MPI_Datatype sendtype,
void *recvbuf,
int recvcnt,
MPI_Datatype recvtype,
int root,
MPI_Comm comm)
// 数据聚焦:收集相同长度的数据块。
// 以root为根进程,所有进程(包括根进程自己) 将sendbuf中的数据块发送给根进程,
// 根进程将这些数据块按进程号的顺序依次放到recvbuf中。
int MPI_Gather (void *sendbuf,
int sendcnt,
MPI_Datatype sendtype,
void *recvbuf,
int recvcnt,
MPI_Datatype recvtype,
int root,
MPI_Comm comm)