昇腾社区首页
中文
注册

使用前必读

什么是零拷贝

单算子模式下算子的输入输出buffer是动态变化的,为了避免每次通信都进行两端进程的内存注册,HCCL在通信域内部构造了一个buffer进行中转完成集合通信,因此会引入额外的内存拷贝开销。

为了降低上述内存拷贝开销,使得HCCL可以直接对业务传入的内存进行操作,避免使用中转HCCL buffer,HCCL提供了本节所述接口,从而实现零拷贝。

通用约束

零拷贝功能当前存在如下使用限制与约束:

  • 仅支持 Atlas A3 训练系列产品/Atlas A3 推理系列产品
  • 相关接口仅支持Ascend Extension for PyTorch插件后端代码调用,其他场景暂不支持。
  • 仅支持通信算法的编排展开位置在AI CPU的场景。

    关于通信算法编排展开位置的详细说明可参见环境变量HCCL_OP_EXPANSION_MODE

  • 仅支持通信域范围是单Server,且通信算子未开启重执行的场景。

    通信算子是否开启重执行特性可通过环境变量HCCL_OP_RETRY_ENABLE设置。

  • 仅支持集合通信算子AllGather、ReduceScatter、Broadcast、AllReduce,其中ReduceScatter、AllReduce算子使能零拷贝功能后会修改用户的输入内存。
  • 算子的输入、输出内存必须是激活内存,且输入数据大于等于32MB。
  • 开启零拷贝功能时,建议开发者使用较大的通信域(即覆盖最大卡数的通信域)进行虚拟地址设置与激活,此通信域中所有进程调用集合通信算子时都可实现零拷贝(未设置、激活虚拟地址的通信域无法实现零拷贝)。

使用流程

零拷贝功能的实现流程示例如下所示:

  1. 调用AscendCL提供的aclrtReserveMemAddress接口预留虚拟内存。
  2. 调用HcclCommSetMemoryRange接口通知HCCL通信域预留的虚拟内存地址。
  3. 调用AscendCL提供的aclrtMallocPhysical接口申请Device物理内存。
  4. 调用AscendCL提供的aclrtMapMem接口将申请的物理内存映射到预留的虚拟内存。
  5. 调用HcclCommActivateCommMemory接口激活预留的虚拟内存。
  6. 执行集合通信任务,需要注意通信域中每个进程传入的输入、输出内存需要为已激活内存,这样才能正确使能零拷贝功能。
  7. 调用HcclCommDeactivateCommMemory接口去激活预留的虚拟内存。
  8. 调用AscendCL提供的aclrtUnmapMem接口取消物理内存与预留虚拟内存的映射。
  9. 调用AscendCL提供的aclrtFreePhysical接口释放Device物理内存。
  10. 调用HcclCommUnsetMemoryRange接口通知HCCL通信域取消使用预留的虚拟内存。
  11. 调用AscendCL提供的aclrtReleaseMemAddress接口释放虚拟内存。