第2章 集合通信

2.1 通信模式

在并行编程中,由于每个控制流都有自己独立的地址空间,彼此无法访问对方的地址空间,因此需要显式通过消息机制进行协作,比如通过显式发送或者接收消息来实现控制流之间的数据交换。由于消息传递范式可以使用户很好地分解问题,因此适合大规模可扩展并行算法。并行任务的主要通信模式有两种。

(1)点对点(Point-to-Point)通信。这是高性能计算(HPC)中最常使用的模式,通常是节点与其最近的邻居进行通信,特点是:单发送方,单接收方;相对容易实现。

点对点通信的原型如图2-1所示。

图2-1

(2)集合(Collective)通信。集合通信的特点是:存在多个发送方和接收方;通信模式包括Broadcast、Scatter、Gather、Reduce、All-to-All等;实现相对困难。

下面将使用PyTorch和NVIDIA公司的图例/代码来为大家解析。为了便于理解,我们先给出两个名词的定义。首先,我们用world size来标识将要参与训练的进程数(或者计算设备数)。其次,因为需要多台机器或者进程之间彼此识别,所以需要有一个机制来为每台机器做唯一的标识,这就是rank。每个进程都会被分配一个rank,该rank是一个介于0和world size-1之间的数字,该数字在Job(作业)中是唯一的。它作为进程标识符,用于代替地址,用户可以依据rank(而非地址)将张量发送到指定的进程。