Bootstrap

通信原语学习记录

集合通信,作为并行计算中的核心概念,指的是在一组进程之间进行的协调通信模式,确保所有参与者都能高效地交换信息。这一领域的基石包括基本的通信动作,如数据的发送(Send)、接收(Receive)、数据的复制(Copy),以及关键的同步机制,如进程栅栏(Barrier)等。这些基础操作灵活组合,形成了丰富的通信模式,也就是我们所说的通信原语,它们构成了并行程序设计的基础构件,具体的通信原语包括但不限于下面几个:

Send 与 Receive

Send
Send操作是由发送方发起的,用于将数据从一个设备发送到另一个设备。在典型的Send操作中,发送方指定要发送的数据、目标地址(接收方的标识符)和通信通道(如果适用)。数据被封装成一个消息,并通过网络或共享内存传递给接收方。在某些情况下,如阻塞Send,发送方会等待直到数据被接收方确认接收后才继续执行。

Receive
Receive操作是由接收方执行的,用于从网络或通信通道接收数据。接收方通常需要指定一个缓冲区来存储接收到的数据,以及可能的源地址信息,以便接收来自特定发送方的消息。在非阻塞Receive中,接收方可以立即返回并继续执行,即使数据尚未完全到达。而在阻塞Receive中,接收方会等待直到数据完全到达并被读取到缓冲区中。

关键概念

  • 阻塞与非阻塞通信:阻塞通信会暂停调用进程直到操作完成,而非阻塞通信则允许调用进程在等待期间继续执行其他任务。
  • 同步与异步通信:同步通信要求发送方和接收方在通信过程中保持同步,而异步通信则允许双方独立操作,通过回调或事件通知完成通信。
  • 可靠与不可靠通信:可靠通信保证数据的无损传输,通常包括错误检测和重传机制;不可靠通信不提供这样的保证,适合于对延迟敏感的应用。
  • 点对点与多播通信:点对点通信是两个实体之间的直接通信,而多播通信则涉及一个发送方向多个接收方发送数据。

在并行计算框架如MPI中,Send和Receive原语被广泛使用,以支持大规模的并行和分布式计算任务。例如,MPI_Send 和 MPI_Recv 就是用于发送和接收消息的标准函数。

Barrier

在并行和分布式计算中,Barrier同步是一种常用的同步机制,主要用于确保一组进程在继续执行后续任务之前能够达到一个共同的“检查点”或同步点。Barrier操作通常在一个通信组(如MPI进程组或线程池)内使用。

Barrier的基本工作原理如下:

  • 初始化:在开始任何并行处理之前,所有参与的进程或线程都会知道存在一个Barrier同步点。
    到达Barrier:当每个进程或线程执行到代码中的某个特定点时,它们会调用Barrier同步操作。这相当于每个参与者都到达了一个约定的“等待区”。
  • 阻塞:一旦某个进程或线程调用了Barrier,它就会被阻塞,不会继续执行后续的指令,直到所有其他成员也到达了这个Barrier。
  • 释放:当通信组内的所有进程都到达了Barrier时,Barrier会释放所有等待的进程,允许它们继续执行接下来的任务。这保证了所有进程在继续下一步之前都已经达到了相同的执行点。
  • 继续执行:所有进程在通过Barrier后,可以继续执行后续的任务,此时它们都是同步的,即它们都从同一个执行点开始执行后续代码。

Broadcast

Broadcast:其具有一个数据发送者,多个数据接受者,其可以在集群内把自身的数据通过广播的方式发送到其他设备上。如图1所示,当设备1执行Broadcast时,数据将从设备1广播到其他设备。
在这里插入图片描述

图1 Broadcast示意图

Scatter

Scatter:其具有一个数据发送者,多个数据接受者,其可以在集群内把自身的数据通过广播的方式发送到其他设备上,但与Broadcast不同的是,Scatter是将自身数据进行切片后进行发送的。如图2所示,当设备1执行Scatter时,数据会先切片,然后从设备1发送到其他设备。
在这里插入图片描述

图2 Scatter示意图

Gather

Gather:其与Scatter相反,具有多个数据发送者,一个数据接收者,可以在集群内把多个设备的数据收集到一个设备上,如图3所示,不同的颜色的小方块代表不相同的数据,当设备1执行Gather时,设备1将获取集群内其他设备的数据。
在这里插入图片描述

图3 Gather示意图

All-Gather

All-Gather:其具有多个数据发送者,多个数据接收者,可以在集群内把多个设备的数据先通过Gather收集到一个主设备上,再把这个收集到的数据广播到其他设备上。如图4所示:
在这里插入图片描述

图4 All-Gather示意图

Reduce-Scatter

Reduce-Scatter:其具有多个数据发送者,多个数据接收者,其在集群内的所有设备上都执行相同的Reduce规约运算,再将结果Scatrer到集群内所有的设备上,如图5所示,其可以被视为All-Gather操作的逆过程。
在这里插入图片描述

图5 Reduce-Scatter示意图

Reduce

Reduce:其具有多个数据发送者,1个数据接收者,可以在集群内把多个节点的数据规约运算到一个主节点上,常用的规约运算有:求累加和SUM、求累乘积PROD、求最大值MAX、求最小值MIN等等,如图6所示,以求和为例,4个设备上的数据将规约到设备1上。
在这里插入图片描述

图6 Reduce示意图

All-Reduce

All-Reduce:其具有多个数据发送者,多个数据接收者,在集群内的所有设备上都执行相同的Reduce操作,如图7所示,可以将集群内所有设备的数据规约运算得到的结果发送到所有的设备上。
在这里插入图片描述

图7 All-Reduce示意图

All-To-All

All-To-All:其是All-Gather的扩展,具有多个数据发送者,多个数据接收者,可以理解成数据多对多的转置,具体效果如图8所示:
在这里插入图片描述

图8 All-To-All示意图

参考

https://www.changping.me/2022/04/04/ai-distributed-training-coll-lang/

;