📜  集体操作 MPI (1)

📅  最后修改于: 2023-12-03 15:28:52.211000             🧑  作者: Mango

集体操作 MPI

MPI(Message Passing Interface)是一个用于并行计算的通信协议和库,它允许在多个处理器之间传递消息和进行同步操作。其中,集体操作是 MPI 中一种常用的通信模式,用于在并行执行的多个进程之间协调同步操作。

集体操作的概述

MPI 中的集体操作指的是一组并行进程之间的协同工作。这些操作可以是同步或异步的,它们是 MPI 库中一组通用的函数调用,可以让进程之间协同完成某个特定的任务。集体操作的基本工作原理可以分为两类:

  • 数据发送和接收
  • 计算协同

MPI 通信中的所有进程都是对等的,它们互相通信,执行一个 MPI 应用程序时,并不会有明确的主进程或协调者。MPI 应用程序通常包含许多进程,这些进程按照一个指定的拓扑结构分配在不同的计算节点中。

MPI 中,有四种集体操作:

  1. Reduction
  2. Broadcast
  3. Scatter
  4. Gather
集体操作之 Reduction

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 是通信器。

集体操作之 Broadcast

MPI_Bcast() 函数允许一个进程(root)将一个缓冲区的内容广播到其他进程中。root 进程发送数据,其他进程接收数据。

int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)
  • buffer:要广播的缓冲区的地址。
  • count:缓冲区中的项目数。
  • datatype:缓冲区中的数据类型。
  • root:广播的根进程的标识符。
  • comm:广播树可用的通信器。
集体操作之 Scatter

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)

参数:

  • sendbuf:从根进程发送的缓冲区的地址。
  • sendcount:发送到子集的项目数。
  • sendtype:缓冲区中的数据类型。
  • recvbuf:子集接收数据的缓冲区的地址。
  • recvcount:从根进程接收到的每个子集中的项目数。
  • recvtype:子集中接收到的数据类型。
  • root:散布数据的根进程。
  • comm:数据散布可用的通信器。
集体操作之 Gather

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)

参数:

  • sendbuf:发件人的开头。
  • sendcnt:每个发件人发送到接收器的元素数。
  • sendtype:发送数据类型。
  • recvbuf:接收所有元素的地址。
  • recvcnt:每个接收器期望接收的元素数。
  • recvtype:接收器接收的类型。
  • root:这是接收的进程。
  • comm:通信器,其中所有进程都要参与。