📅  最后修改于: 2023-12-03 15:28:52.211000             🧑  作者: Mango
MPI(Message Passing Interface)是一个用于并行计算的通信协议和库,它允许在多个处理器之间传递消息和进行同步操作。其中,集体操作是 MPI 中一种常用的通信模式,用于在并行执行的多个进程之间协调同步操作。
MPI 中的集体操作指的是一组并行进程之间的协同工作。这些操作可以是同步或异步的,它们是 MPI 库中一组通用的函数调用,可以让进程之间协同完成某个特定的任务。集体操作的基本工作原理可以分为两类:
MPI 通信中的所有进程都是对等的,它们互相通信,执行一个 MPI 应用程序时,并不会有明确的主进程或协调者。MPI 应用程序通常包含许多进程,这些进程按照一个指定的拓扑结构分配在不同的计算节点中。
MPI 中,有四种集体操作:
MPI_Reduce() 函数是一个典型的聚合函数,它需要在活动进程以及其他进程之间收集一些数据,并使用指定的操作函数将它们合并为单个结果。
int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,MPI_Op op, int root, MPI_Comm comm)
其中,sendbuf 指针指向要与 MPI_Op 执行的数据缓冲区的地址,recvbuf 用于返回结果,在广播中使用,因此每个进程都必须创建一个缓冲区。count 是要聚合的数据元素数量,datatype 是数据类型。op 是一个操作,例如 MPI_SUM。root 是从信标的进程,comm 是通信器。
MPI_Bcast() 函数允许一个进程(root)将一个缓冲区的内容广播到其他进程中。root 进程发送数据,其他进程接收数据。
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
MPI_Scatter() 是一种高效率的规约方法,它将数据分散到所有进程中。所有进程以相同的方式调用 MPI_Scatter() 并形成缓冲区,其中每个进程都有唯一的数据子集。
int MPI_Scatter(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm)
参数:
MPI_Gather() 收集各进程中的数据,并将其汇集到一个进程,例如将计算集体的各个部分合并为一个整体。
int MPI_Gather(const void *sendbuf, int sendcnt, MPI_Datatype sendtype,void *recvbuf, int rececnt, MPI_Datatype recvtype, int root, MPI_Comm comm)
参数: