CANN 组织链接: https://atomgit.com/cann
HIXL 仓库链接: https://atomgit.com/cann/hixl
hcomm 相关仓库链接: https://atomgit.com/cann/hcomm


在复杂的多机多卡(Multi-Node/Multi-Device)异构计算环境中,深度学习模型的训练和推理往往需要大量的数据在不同处理器之间高效交换。传统的通信模型,如基于 CPU 参与的 TCP/IP 协议栈,或需要接收端显式操作的 MPI 双边通信,在面对 T级别甚至 P级别的数据传输需求时,往往会成为性能瓶颈。

HIXL(Huawei Xfer Library) 正是为解决这一核心挑战而生。它是一款专门用于高性能点对点(Point-to-Point)数据传输的单边通信库,致力于提供比传统方案更低延迟、更高吞吐的显存间数据传输机制。HIXL 不仅屏蔽了底层复杂的硬件互联细节,更通过其独特的单边通信模型,为上层如 hcommHCCL 等集合通信库奠定了坚实的高效传输基础。

本文将深入 HIXL 的设计理念与实现机制,揭示它是如何通过驾驭底层硬件能力、优化数据路径以及精细化内存管理,来构建大规模异构计算集群中的通信高速公路。

一、 异构集群的通信痛点与单边模型解法

在大规模 AI 计算中,数十乃至上百个处理单元(PE)需要频繁交换数据。传统的通信模式在高并发场景下暴露出诸多问题。

1.1 双边通信的固有瓶颈

传统的双边(Two-sided)通信模型,如 MPI 的 MPI_SendMPI_Recv,要求发送方和接收方都显式地参与到通信流程中。

  • 同步开销:发送方必须等待接收方准备好接收,接收方也必须等待发送方准备好发送。这种握手机制增加了延迟,尤其是在大量的点对点通信中。
  • 接收方 CPU/PE 参与:接收方通常需要消耗自身的计算资源(CPU 或 PE 周期)来执行 recv 操作,这会中断其正常的计算任务,导致计算核心利用率下降。
  • 内存拷贝:数据在接收端往往需要从网络缓冲区拷贝到用户指定的内存区域,引入额外的内存拷贝开销。
1.2 单边通信:解耦的传输哲学

HIXL 采用的单边(One-sided)通信模型,也称为远程内存访问(Remote Memory Access, RMA)或 Putnam 风格通信,旨在彻底解决上述瓶颈。

  • 发送方主导:一个处理单元(源端 PE)可以直接在远程的另一个处理单元(目标 PE)的内存中执行读写操作,而目标 PE 的应用程序无需主动参与。
  • 计算与通信解耦:目标 PE 的应用程序可以专注于自身的计算任务,通信操作在后台通过专用的硬件引擎异步完成。这种解耦是实现通信与计算重叠(Overlap)的关键。
  • 更低的延迟:消除了接收方的同步等待和计算参与,减少了握手延迟,使得数据能够以最低的开销在 PE 间直接传输。

二、 HIXL 的核心机制:远程内存操作与异步执行

HIXL 通过提供简洁而强大的 API,将复杂的底层通信细节封装起来,暴露出直观的远程读写语义。

2.1 “不打扰”的远程读写操作

HIXL 提供了类似于 POSIX 文件系统操作的远程读(Get)和远程写(Put)原语,但操作的是远程 PE 的显存地址。

  • 远程写入(Put):源 PE 发起一个 shmem_put 指令,直接将本地显存(HBM)的数据写入目标 PE 的显存。目标 PE 上的应用程序对此操作是“无感”的,无需暂停计算或执行任何接收指令。
  • 远程读取(Get):源 PE 发起一个 shmem_get 指令,主动从目标 PE 的显存中抓取数据到本地显存。同样,目标 PE 并不需要专门的“发送”操作来响应。
2.2 异步流水线:通信与计算的艺术

HIXL 的所有核心传输接口都设计为异步非阻塞模式。这意味着:

  • 指令下发即返回:当开发者调用 HIXL 的 shmem_putshmem_get 函数时,库会立即将传输指令下发给底层硬件(如 DMA 引擎或 RDMA 引擎),并迅速将控制权返回给应用程序。
  • 硬件后台执行:实际的数据搬运工作由专用的通信硬件在后台异步执行。应用程序可以继续执行后续的计算任务,而无需等待数据传输完成。
  • 显式同步点:只有当应用程序需要确保某个数据传输已经完成,以便后续计算能够安全地使用该数据时,才需要调用 HIXL 提供的同步原语(如 shmem_fenceshmem_quiet)来等待传输完成。这种异步性是实现计算通信重叠,最大限度利用硬件资源的基石。

三、 底层互联的驾驭:零拷贝与硬件直通

HIXL 实现高性能的核心秘诀在于其对异构计算平台中高速互联硬件的直接利用,从而实现了**零拷贝(Zero-copy)**的数据传输。

3.1 RDMA:跳过操作系统的快车道

HIXL 库深度利用了硬件支持的远程直接内存存取(RDMA)能力。

  • 内核旁路(Kernel Bypass):通信指令绕过了操作系统的内核协议栈,直接与网络适配器(NIC)或片间互联(HCCS)硬件进行交互。这消除了操作系统上下文切换、数据包处理等高昂的开销。
  • Host CPU 卸载(CPU Offload):整个数据传输过程由 DMA/RDMA 引擎完全驱动。Host CPU 仅负责指令的初始下发和最终完成的硬件中断接收,而无需在数据搬运的整个过程中参与,从而极大地减轻了 CPU 的负载,并避免了数据在 CPU 内存和设备内存之间来回拷贝的开销。
3.2 智能路径选择与带宽聚合

HIXL 能够感知集群的物理拓扑结构,并据此优化数据传输路径。

  • 链路类型判断:在单机多卡环境中,HIXL 会优先选择低延迟、高带宽的片间互联(HCCS)专用链路进行通信。而在跨机通信中,它会依赖于如 RoCE(RDMA over Converged Ethernet)等高速网络协议。
  • 多路径聚合:在支持多路径的硬件环境中,HIXL 能够智能地将数据流分配到多条物理路径(如多端口网卡)上,以平衡负载、提升整体通信带宽并提供一定的冗余能力。

四、 内存一致性与精细化同步控制

在单边通信模型中,源 PE 对目标 PE 内存的修改,如何保证对目标 PE 自身是可见的,并且操作是按照预期的顺序进行的,是至关重要的。HIXL 提供了丰富的内存屏障和同步原语来确保这一点。

4.1 可见性保障:从栅栏到静默

HIXL 提供了一系列内存同步原语,以控制数据传输的可见性:

  • shmem_fence:这是一种轻量级的内存屏障。它确保了在 shmem_fence 调用之前发出的所有 Put 或 Get 请求,在本地处理单元上都是可见和有序的。但它不保证这些操作在远程处理单元上的完成状态。
  • shmem_quiet:比 shmem_fence 更强的同步语义。它会阻塞当前处理单元,直到所有针对当前处理单元的本地内存或远程内存的操作都已完成。它常用于确保某个关键数据已经被完全写入远程内存后,才开始依赖该数据的计算。
4.2 存储侧计算:原子操作的威力

当需要对远程内存中的共享数据进行同步更新时(例如,全局计数器或锁),HIXL 支持基于硬件的远程原子内存操作(Atomic Memory Operations, AMO)。

  • 直接在远端执行:HIXL 允许源 PE 发送指令到目标 PE 的内存控制器或 RDMA 引擎,直接在远程内存地址上执行原子加、原子减、原子比较并交换(Compare-and-Swap)等操作。
  • 避免数据回传:这避免了传统模式下需要将数据读取到本地、修改后再写回远程的两次往返延迟,极大地提升了共享变量更新的效率和一致性保障。

五、 HIXL 的核心结构:一次远程传输的元数据

为了更好地理解 HIXL 是如何调度和管理一次远程传输任务的,我们可以设想其内部用于描述一次 PutGet 请求的元数据结构。这并非一个可执行的“实战代码”,而是一个内部用于传递给驱动或硬件队列的抽象“任务包”。

// HIXL 内部核心层 - 远程传输请求描述符
// 该结构体用于封装一次 shmem_put/get 任务的所有配置信息

#include <cstdint>
#include <vector>

namespace hixl {
namespace internal {

// 传输类型枚举
enum class TransferType : uint8_t {
    PUT = 0,    // 远程写入
    GET = 1     // 远程读取
};

// 数据类型枚举
enum class DataType : uint8_t {
    DT_UNDEFINED = 0,
    DT_FLOAT16   = 1,
    DT_FLOAT32   = 2,
    DT_INT8      = 3,
    DT_INT32     = 4
};

// 远程传输请求的控制块
struct RemoteTransferRequest {
    // 传输任务基本信息
    uint32_t local_pe_id;       // 本地 PE 的唯一 ID
    uint32_t remote_pe_id;      // 目标 PE 的唯一 ID
    TransferType type;          // 传输类型:PUT 或 GET
    DataType data_type;         // 传输数据类型
    uint64_t byte_size;         // 传输数据大小(字节)

    // 源地址信息
    uint64_t local_src_vaddr;   // 本地源虚拟地址
    uint64_t local_src_paddr;   // 本地源物理地址 (用于RDMA注册内存)
    uint32_t local_src_rkey;    // 本地源的RDMA注册密钥 (如果需要)

    // 目的地址信息
    uint64_t remote_dst_vaddr;  // 远程目的虚拟地址
    uint64_t remote_dst_paddr;  // 远程目的物理地址 (用于RDMA注册内存)
    uint32_t remote_dst_rkey;   // 远程目的的RDMA注册密钥

    // 传输完成通知机制 (可选)
    // 可以是本地寄存器、内存地址,或中断信号量
    uint64_t completion_notify_addr; 
    uint32_t completion_value; // 完成时写入的值
  
    // 异步回调函数指针或索引,在传输完成后触发
    void (*callback_fn)(void* user_data); 
    void* callback_user_data;

    // 内部状态和硬件句柄
    uint32_t hardware_qp_handle; // 对应的硬件队列对句柄
    uint32_t request_id;         // 内部请求ID,用于追踪
    volatile uint8_t status_flag; // 状态标志位,如 0:Pending, 1:Complete, 2:Error
};

} // namespace internal
} // namespace hixl

六、 代码逻辑深度解析

上述 RemoteTransferRequest 结构体,虽然不是直接的 API,但它揭示了 HIXL 内部管理远程传输任务的复杂性。

  • local_pe_id, remote_pe_id:这些字段定义了通信的起点和终点,是构建通信拓扑的基础。HIXL 需要根据这些 ID 来查找并激活对应的物理互联链路。
  • local_src_paddr, remote_dst_paddr, local_src_rkey, remote_dst_rkey:这是实现 RDMA 零拷贝的关键。不同于虚拟地址,物理地址和 RDMA 注册密钥(RKey)是直接暴露给硬件通信引擎使用的。这意味着数据绕过了操作系统的内存管理单元,直接从源 PE 的物理内存传输到目标 PE 的物理内存。
  • completion_notify_addr, completion_value:这是实现异步通信完成通知的机制。当底层硬件完成数据传输后,它可以直接将一个特定值写入到指定内存地址。本地应用程序可以通过轮询这个地址或设置中断来感知传输完成,而无需 CPU 的持续介入。
  • callback_fn:这代表了一种更高级的异步通知机制,允许 HIXL 在传输完成后执行用户定义的回调函数,从而灵活地将通信结果与上层应用逻辑集成。

七、 实践应用:性能洞察与系统集成

对于开发者而言,虽然 HIXL 处于软件栈的底层,但理解其性能特征和集成方式,对于优化整个分布式计算系统至关重要。

7.1 性能诊断的要素

在 HIXL 层面的性能调优,往往聚焦于以下几个关键指标:

  1. 端到端延迟(Latency):通过 Profiling 工具测量单个 shmem_putshmem_get 操作从发起指令到完成通知的耗时。高延迟可能指示 Host CPU 负载过高、通信队列拥塞或链路问题。
  2. 带宽利用率(Bandwidth Utilization):监测底层 NIC 或 HCCS 接口的实际数据吞吐量。如果远低于物理链路的理论值,可能需要调整 HIXL 传输的分块大小(Packet Size),以更好地适配 RDMA 引擎的最佳传输粒度。
  3. 计算通信重叠度:评估应用程序中计算任务和 HIXL 通信任务的并行程度。理想情况下,当通信正在进行时,计算核心应处于忙碌状态。低的重叠度意味着通信阻塞了计算,需要重新设计任务调度。
7.2 与上层通信库的协同

HIXL 通常不会被终端 AI 开发者直接使用。它是 hcommHCCL 等集合通信库的基石。

  • hcommHCCL 会利用 HIXL 提供的点对点远程读写能力,在内部构建出高效的 AllReduce、AllGather、Broadcast 等集合通信原语。
  • HIXL 的异步特性和零拷贝机制,使得上层集合通信库能够实现复杂的流水线(Pipeline)和通信调度策略,从而在多设备、多节点环境下实现近线性的扩展性。
Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐