ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

HCCL 代码示例完全指南:从点对点通信到自定义集合通信算子

2026/9/18 21:23:31 拓冰建站 浏览量
HCCL 代码示例完全指南:从点对点通信到自定义集合通信算子 HCCL 代码示例完全指南从点对点通信到自定义集合通信算子【免费下载链接】hccl集合通信库Huawei Collective Communication Library简称HCCL是基于昇腾AI处理器的高性能集合通信库为计算集群提供高性能、高可靠的通信方案项目地址: https://gitcode.com/cann/hccl导读本文以 CANN 开源仓库 examples 目录为线索系统梳理 HCCLHuawei Collective Communication Library从入门到进阶的完整示例生态既有基于HcclSend/HcclRecv的点对点通信与九大集合通信算子的 C 直调示例也有 PyTorch、TensorFlow 框架集成示例更有基于 AICPU、AIV、CCU 通信引擎开发自定义通信算子的完整工程。读完本文你将掌握 HCCL 单进程多线程的编程范式HcclCommInitRootInfo 多线程绑定多设备、各集合算子的接口签名与结果语义、Makefile 编译运行方式以及如何用build.sh编译、安装、加载一套自定义 HCCL 通信算子。示例总览与目录结构examples/README.md 是 HCCL 示例代码的索引总览将全部示例按使用场景划分为五大类类别示例对应目录点对点通信HcclSend/HcclRecv基础收发、HcclBatchSendRecvRing 环状通信examples/01_point_to_point集合通信AllReduce、Broadcast、AllGather、ReduceScatter、Reduce、AlltoAll、AlltoAllV、AlltoAllVC、Scatterexamples/02_collectivesAI 框架PyTorch AllReduce、TensorFlow AllReduceexamples/03_ai_framework自定义点对点算子基于 AICPU 通信引擎的自定义 Send/Recv 算子examples/04_custom_ops_p2p自定义集合算子基于 AICPU / AIV / CCU 引擎的自定义 AllGather 算子examples/05_custom_ops_allgather从源码结构看前两类01、02是开箱即跑的编译型示例每个示例目录都包含main.cc样例源文件、Makefile编译/构建配置和编译生成的可执行文件后两类04、05是完整的自定义算子工程需要借助仓库根目录的 build.sh 与 cmake 配置进行独立编译打包。所有示例在编程范式上高度统一均采用单进程多线程 单机多卡的组网模型主线程查询设备数量、生成 RootInfo再为每张卡启动一个线程执行通信任务不需要 MPI 依赖AIV 示例除外见后文。点对点通信HcclSend / HcclRecv 与 HcclBatchSendRecv基础收发send_recv 示例HcclSend/HcclRecv基础收发功能示例 展示单机 N 卡N2 且为偶数上最基本的点对点通信偶数卡0/2/4/6发送数据奇数卡1/3/5/7接收数据。示例覆盖的功能点包括通过aclrtGetDeviceCount()查询可用设备数量将 rank0 作为 root 节点通过HcclGetRootInfo()生成 rootinfo 标识信息——该标识主要包含 Device IP、Device ID 等信息需广播至集群内所有 rank 用于初始化通信域在每个线程中基于同一份 rootinfo通过HcclCommInitRootInfo()初始化通信域调用HcclSend()/HcclRecv()完成收发并打印结果。核心执行逻辑位于 main.ccif (device % 2 0) { // 偶数卡将输入数据初始化为 DeviceId然后执行 Send 操作 ACLCHECK(aclrtMalloc(sendBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY)); void* hostBuf nullptr; ACLCHECK(aclrtMallocHost(hostBuf, mallocSize)); float* tmpHostBuf static_castfloat*(hostBuf); for (uint64_t i 0; i count; i) { tmpHostBuf[i] static_castfloat(device); } ACLCHECK(aclrtMemcpy(sendBuf, mallocSize, hostBuf, mallocSize, ACL_MEMCPY_HOST_TO_DEVICE)); ACLCHECK(aclrtFreeHost(hostBuf)); HCCLCHECK(HcclSend(sendBuf, count, HCCL_DATA_TYPE_FP32, device 1, hcclComm, stream)); } else { // 奇数卡执行 Recv 操作接收上一偶数卡的数据 ACLCHECK(aclrtMalloc(recvBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY)); HCCLCHECK(HcclRecv(recvBuf, count, HCCL_DATA_TYPE_FP32, device - 1, hcclComm, stream)); }从接口签名看见 include/hccl.hHcclSend/HcclRecv的参数为收发缓冲区、数据元素个数、数据类型此处为HCCL_DATA_TYPE_FP32、对端 rank 号、通信域句柄与任务流。示例源码注释明确提示HcclSend 与 HcclRecv 采用同步调用方式且必须配对使用。main()中的启动模板后文所有 01/02 类示例共用如下ACLCHECK(aclInit(NULL)); // 设备资源初始化 uint32_t devCount; ACLCHECK(aclrtGetDeviceCount(devCount)); // 查询设备数量 std::cout Found devCount NPU device(s) available std::endl; int32_t rootRank 0; ACLCHECK(aclrtSetDevice(rootRank)); void* rootInfoBuf nullptr; ACLCHECK(aclrtMallocHost(rootInfoBuf, sizeof(HcclRootInfo))); HcclRootInfo* rootInfo (HcclRootInfo*)rootInfoBuf; HCCLCHECK(HcclGetRootInfo(rootInfo)); // 生成 Root 节点信息各线程使用同一份 RootInfo std::vectorstd::thread threads(devCount); std::vectorThreadContext args(devCount); for (uint32_t i 0; i devCount; i) { args[i].rootInfo rootInfo; args[i].device i; args[i].devCount devCount; threads[i] std::thread(Sample, (void*)args[i]); } for (uint32_t i 0; i devCount; i) { threads[i].join(); } ACLCHECK(aclrtFreeHost(rootInfoBuf)); ACLCHECK(aclFinalize()); // 设备去初始化每个线程的Sample()函数内部还负责aclrtSetDevice、创建任务流aclrtCreateStream、aclrtSynchronizeStream阻塞等待任务完成、最后HcclCommDestroyaclrtFreeaclrtDestroyStreamaclrtResetDevice完成资源释放。在 8 卡环境上偶数节点sendBuf初始化为 Device Id 并发送至下一奇数节点因此各奇数节点收到的是上一节点的 Device Id预期输出Found 8 NPU device(s) available rankId: 1, output: [ 0 0 0 0 0 0 0 0 ] rankId: 3, output: [ 2 2 2 2 2 2 2 2 ] rankId: 5, output: [ 4 4 4 4 4 4 4 4 ] rankId: 7, output: [ 6 6 6 6 6 6 6 6 ]批量收发batch_send_recv_ring 示例HcclBatchSendRecv实现 Ring 环状通信示例 展示用单次HcclBatchSendRecv()调用同时下发多个收发任务构造 Ring 环状拓扑每个节点将数据发送至下一节点next (device 1) % count同时接收上一节点prev (device - 1 count) % count的数据。核心代码 使用HcclSendRecvItem描述每个收发子任务并将两个子任务打包成数组一次下发uint32_t next (device 1) % count; uint32_t prev (device - 1 count) % count; HcclSendRecvItem sendRecvInfo[2]; sendRecvInfo[0] HcclSendRecvItem{HCCL_SEND, sendBuf, count, HCCL_DATA_TYPE_FP32, next}; sendRecvInfo[1] HcclSendRecvItem{HCCL_RECV, recvBuf, count, HCCL_DATA_TYPE_FP32, prev}; HCCLCHECK(HcclBatchSendRecv(sendRecvInfo, 2, hcclComm, stream));每个节点的sendBuf初始化为 Device Id环上每个节点最终收到的是上一节点的 Device Id因此 8 卡时 rank i 的结果是[i-1 i-1 ... ]rank 0 收到 rank 7 的数据Found 8 NPU device(s) available rankId: 0, output: [ 7 7 7 7 7 7 7 7 ] rankId: 1, output: [ 0 0 0 0 0 0 0 0 ] rankId: 2, output: [ 1 1 1 1 1 1 1 1 ] ... rankId: 7, output: [ 6 6 6 6 6 6 6 6 ]集合通信九大算子示例逐一解读examples/02_collectives 下按算子逐一给出可编译运行的示例全部采用单机 N 卡N2组网支持 Ascend 950PR/Ascend 950DT、Atlas A3/A2 训练与推理系列产品。九个示例的输入数据初始化与接口调用方式对比如下示例核心接口输入初始化结果语义01_allreduceHcclAllReduce每 rank 数据为 0~7所有 rank 得到全量求和结果[0 8 16 24 32 40 48 56]02_broadcastHcclBroadcastroot 节点数据为 0~7root 数据广播至所有 rank03_allgatherHcclAllGather每 rank 数据为其 rank id所有 rank 得到按 rank_id 顺序拼接的全量数据04_reduce_scatterHcclReduceScatter每 rank 数据为 0~7求和后按 rank 顺序分散rank i 得到第 i 个和05_reduceHcclReduce每 rank 数据为 0~7求和结果只发往 root 节点06_alltoallHcclAlltoAll每 rank 数据为其 rank id每 rank 得到全量数据拼接07_alltoallvHcclAlltoAllV每 rank 数据为其 rank id每 rank 得到全量数据拼接08_alltoallvcHcclAlltoAllVC每 rank 数据为其 rank id每 rank 得到全量数据拼接09_scatterHcclScatterroot 数据为 0~7root 数据均分散布rank i 得到元素 i以 AllReduce 示例 为例其接口调用只有一行却完整展示了数据准备Host→Device→ 集合通信 → 结果回拷Device→Host的完整流程// 将 Host 侧输入数据拷贝到 Device 侧数据初始化为 0,1,2,… 递增序列 ACLCHECK(aclrtMemcpy(sendBuf, mallocSize, hostBuf, mallocSize, ACL_MEMCPY_HOST_TO_DEVICE)); ACLCHECK(aclrtFreeHost(hostBuf)); // 初始化集合通信域 HcclComm hcclComm; HCCLCHECK(HcclCommInitRootInfo(ctx-devCount, ctx-rootInfo, device, hcclComm)); // 创建任务流 aclrtStream stream; ACLCHECK(aclrtCreateStream(stream)); // 执行 AllReduce通信域内所有节点的 sendBuf 相加后发送到所有节点的 recvBuf HCCLCHECK(HcclAllReduce(sendBuf, recvBuf, count, HCCL_DATA_TYPE_FP32, HCCL_REDUCE_SUM, hcclComm, stream)); ACLCHECK(aclrtSynchronizeStream(stream));HcclAllReduce的签名在 include/hccl.h 中有完整声明核心参数包括输入/输出缓冲区、元素个数、数据类型、规约操作此处为HCCL_REDUCE_SUM、通信域与任务流。8 卡运行时每个 rank 的输出均为全量求和结果Found 8 NPU device(s) available rankId: 0, output: [ 0 8 16 24 32 40 48 56 ] rankId: 1, output: [ 0 8 16 24 32 40 48 56 ] ...所有 rank 输出一致其余八个示例的代码骨架与 AllReduce 完全一致仅在接口与数据初始化上有所不同Broadcast只有 root 节点填充数据并调用HcclBroadcast(sendBuf, recvBuf, count, HCCL_DATA_TYPE_FP32, 0, hcclComm, stream)root 参数为 0非 root 节点同样调用但数据会被覆盖为 root 数据AllGather每个 rank 的数据是长度为 1 的 rank id输出缓冲为 N 个元素调用后所有 rank 得到[0 1 2 3 4 5 6 7]ReduceScatter输出只有 1 个元素rank i 得到的是 8 个 rank 在第 i 个位置的和rankId: 0, output: [ 0 ]、rankId: 7, output: [ 56 ]Reduce只有 root 节点打印[0 8 16 24 32 40 48 56]其他 rank 输出为初始化的 0AlltoAll / AlltoAllV / AlltoAllVC将输入在特定维度切分成与 rank 数相同的块数并按顺序交换各节点最终内容为所有节点输入数据的拼接[0 1 2 3 4 5 6 7]。三者区别在于数据切分与描述方式HcclAlltoAll要求每 rank 发送等量数据HcclAlltoAllV允许每个发送块与接收块数量/大小各异对应 HcclAlltoAllV 接口文档HcclAlltoAllVC进一步支持自定义 count 描述对应 HcclAlltoAllVC 接口文档Scatterroot 数据 0~7 被均分rank i 得到元素[i]。所有集合通信示例均使用aclrtMalloc(..., ACL_MEM_MALLOC_HUGE_ONLY)申请 Device 内存、aclrtMallocHost申请 Host 内存并通过aclrtMemcpy完成 H2D/D2H 拷贝这些用法与 docs/zh/api_ref/comm_op_interface 中各接口的语义文档相互印证。编译运行与 Makefile 说明01/02 类示例的编译与运行高度统一。以 send_recv 的 Makefile 为例ifndef ASCEND_HOME_PATH $(error ASCEND_HOME_PATH is not set, please ensure CANN is properly installed and \ source environment variables by running source /path/to/Ascend/cann/set_env.sh) endif CXXFLAGS : -stdc17 -Werror -fstack-protector-strong -fPIE -pie -O2 -s \ -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -Wl,--copy-dt-needed-entries SOURCES main.cc ASCEND_INC_DIR ${ASCEND_HOME_PATH}/include ASCEND_LIB_DIR ${ASCEND_HOME_PATH}/lib64 LIBS -L$(ASCEND_LIB_DIR) -lhccl -lascendcl INCS -I$(ASCEND_INC_DIR) TARGET send_recv all: g $(CXXFLAGS) $(SOURCES) $(INCS) $(LIBS) -o ${TARGET} echo ${TARGET} compile completed test: ./$(TARGET) clean: rm ${TARGET}Makefile 提供了all默认编译、test编译并运行、clean清理产物、help四个目标。编译依赖两个关键点必须已安装 CANN 并执行环境变量脚本ASCEND_HOME_PATH由set_env.sh注入默认安装路径下为/usr/local/Ascend链接-lhccl -lascendcl即 HCCL 通信库与昇腾 CANN 运行时库ACL 接口。完整操作流程以任意示例目录为例# 1. 设置 CANN 环境变量root 用户默认安装路径 source /usr/local/Ascend/cann/set_env.sh # 2. 编译并运行 make make test可选配置可通过HCCL_OP_EXPANSION_MODE环境变量配置通信算子的展开模式不同产品型号支持的范围以官方环境变量列表为准。在昇腾硬件上通常可设置为 AI CPU 通信引擎模式# 设置通信算子的展开模式为 AI CPU 通信引擎 export HCCL_OP_EXPANSION_MODEAI_CPU该环境变量的完整说明可参考仓库文档 docs/zh/user_guide/hccl_env/HCCL_OP_EXPANSION_MODE.md。从源码看它控制算子执行路径的任务编排展开位置AI_CPU表示在 Device 侧的 AI CPU 上展开Device 侧会根据硬件型号自动选择相应的调度器。AI 框架集成示例PyTorch 与 TensorFlowPyTorch一行dist.all_reduce完成 AllReducePyTorch AllReduce 示例 展示通过torch_npu插件把 HCCL 作为 PyTorch 分布式后端的标准用法依赖torch与torch_npu两个 Python 包运行方式为source /usr/local/Ascend/cann/set_env.sh python hccl_pytorch_allreduce_test.pyhccl_pytorch_allreduce_test.py 的流程与 C 示例一一对应用torch_npu.npu.device_count()查询可用设备数对应 C 的aclrtGetDeviceCount用torch.multiprocessing.spawn()拉起多进程对应 C 的多线程模型每个进程中torch_npu.npu.set_device(rank)绑定设备并以backendhccl调用dist.init_process_group()初始化进程组对应HcclCommInitRootInfoHcclCommDestroy通过dist.all_reduce(tensor, opdist.ReduceOp.SUM)执行 AllReduce对应HcclAllReduce。def run_hccl(rank: int, world_size: int, master_ip: str, master_port: int): torch_npu.npu.set_device(rank) init_method ftcp://{master_ip}:{master_port} dist.init_process_group(backendhccl, rankrank, world_sizeworld_size, init_methodinit_method) torch_tensor torch.arange(world_size, dtypetorch.float32, devicenpu) print([Rank %d] Input: %s % (rank, torch_tensor)) dist.all_reduce(torch_tensor, opdist.ReduceOp.SUM) print([Rank %d] Output: %s % (rank, torch_tensor))脚本内部使用tcp://127.0.0.1:50001作为进程组初始化方式8 卡时每个 rank 的输入为[0.,1.,2.,3.,4.,5.,6.,7.]AllReduce 后每个 rank 输出[0., 8., 16., 24., 32., 40., 48., 56.]。TensorFlow基于 ranktable.json 初始化TensorFlow AllReduce 示例 基于ranktable.json配置文件初始化通信域适用于单机 8 卡。需要特别注意的是该示例基于 TensorFlow 1.x 开发不兼容 TensorFlow 2.x推荐使用 TensorFlow 1.15.0。运行方式source /usr/local/Ascend/cann/set_env.sh export RANK_TABLE_FILEranktable.json bash run_tensorflow.shranktable.json见 examples/03_ai_framework/02_tensorflow/ranktable.json描述集群拓扑与设备信息其格式与 docs/zh/user_guide/cluster_info_config 中介绍的 rank_table 配置规范一致。run_tensorflow.sh负责按 rank_table 拉起 8 个进程分别绑定 8 张卡。运行成功时每个 device 打印INFO:tensorflow:{allreduce_sum_output: array([ 0., 8., 16., 24., 32., 40., 48., 56. ], dtypefloat32)} device:0 tensorflow hccl test success自定义通信算子从 AICPU 到 AIV / CCU如果内置接口不满足业务需求examples/04_custom_ops_p2p 与 examples/05_custom_ops_allgather 提供了完整的三套自定义算子工程分别基于AICPU 通信引擎、AIVAI Vector通信引擎和CCU_SCHED 通信引擎实现全部支持独立构建、独立部署。基于 AICPU 引擎的自定义 Send/Recv 与 AllGather自定义 Send/Recv 算子 与 自定义 AllGather 算子AICPU 版 采用同一套工程结构op_host/放 Host 侧算子实现send.cc/recv.cc/allgather.cc、load_kernel.cc加载逻辑、launch_kernel.cc下发逻辑op_kernel_aicpu/放 AICPU Kernel 实现aicpu_kernel.cc、exec_op.cc算子编排、*.json算子描述文件inc/放对外接口头文件如 hccl_custom_p2p.h、hccl_custom_allgather.h。编译与安装hccl 代码仓根目录提供了自定义算子编译打包工程依赖 build.sh、根目录 CMakeLists.txt 与 cmake含config.cmake变量定义、func.cmake函数定义、package.cmake签名打包、makeself_custom.cmakeMakeSelf 打包逻辑以及 scripts/custom/install.sh 安装脚本# 下载 hccl 代码仓 git clone https://gitcode.com/cann/hccl.git # 编译自定义算子包--vendor 指定算子标识--ops 指定算子名称--custom_ops_path 指定工程路径 cd hccl bash build.sh --vendorcust --opsp2p --custom_ops_path./examples/04_custom_ops_p2p # 安装自定义算子包安装包生成于 ./build_out 目录 ./build_out/cann-hccl_custom_p2p_linux-arch.run --install --install-pathascend_cann_path其中arch是当前编译环境的系统架构ascend_cann_path是可选参数默认为ASCEND_CUSTOM_OPP_PATH或ASCEND_OPP_PATH环境变量所在的 CANN 软件包路径。安装后产物位于${ASCEND_HOME_PATH}/opp/vendors/cust/下包括头文件include/hccl_custom_p2p.h、动态库lib64/libhccl_custom_p2p.so、AICPU 算子描述文件与算子包aicpu/...及安装脚本scripts/install.sh。编译环境要求 gcc/g 7.3.0 至 13.3.x、cmake 3.16.0。运行前准备AICPU 版特有关闭 AICPU 算子验签源码编译生成的算子包不含签名信息加载时默认会被驱动安全验签拦截。需配套 Ascend HDK 25.5.T2.B001 及以上版本以 root 用户在物理机上执行以 device 0 为例npu-smi set -t custom-op-secverify-enable -i 0 -d 1 # 开启验签配置 npu-smi set -t custom-op-secverify-mode -i 0 -d 0 # 关闭用户自定义验签其中-i指定设备 IDnpu-smi info -l查出的 NPU ID-d指定属性值。注意关闭驱动安全验签存在安全风险需自行确保自定义算子安全可靠。修改 AICPU 白名单AICPU 默认只加载白名单中配置的包需将下列内容追加到/usr/local/Ascend/cann/conf/ascend_package_load.ininame:aicpu_hccl_custom_p2p.tar.gz install_path:2 optional:true package_path:opp/vendors/cust/aicpu/kernel load_as_per_soc:false字段含义name为 tar 包文件名install_path为 Device 侧安装路径枚举值AICPU kernel 文件须设为 2optional默认为 true包不存在则跳过加载package_path为 tar 包在 Host 侧 CANN Toolkit 包下的相对路径load_as_per_soc表示是否每种芯片类型都加载。编译与运行测试样例进入对应 testcase 目录执行make/make test或手动设置LD_LIBRARY_PATH后直接运行二进制cd examples/04_custom_ops_p2p/testcase make make test # 或直接运行 export LD_LIBRARY_PATH${ASCEND_HOME_PATH}/opp/vendors/cust/lib64:${LD_LIBRARY_PATH} ./send_recv自定义 P2P 算子的运行结果与原生 HcclSend/HcclRecv 示例一致奇数卡收到上一偶数卡的 Device Id并额外输出P2PCustom test completed successfully表示算子执行成功。基于 AIV 引擎的自定义 AllGatherAIV 版自定义 AllGather 展示了基于 AIV 通信引擎实现集合算子的完整工程与 AICPU 版的最大区别在于Kernel 侧使用Ascend Claunch_kernel_asc.asc实现工程内还包含aiv_all_gather_mesh_1d.hAIV AllGather 核心算法实现、aiv_communication_base_v2.hAIV 通信基类、sync_interface.h同步接口等 Device 侧头文件。支持产品为 Ascend 950PR/950DT以及 Atlas A3 系列仅超节点内通信、Atlas A2 系列仅单机通信。运行测试用例需要 MPI 环境支持。# 编译仓库根目录 bash build.sh --vendorcust --opsallgather_aiv --custom_ops_path./examples/05_custom_ops_allgather/aiv # 安装 ./build_out/cann-hccl_custom_allgather_aiv_linux-arch.run --install --install-pathascend_cann_path # 运行测试二进制位于 build 目录下通过 mpirun 拉起多进程 export LD_LIBRARY_PATH${ASCEND_HOME_PATH}/opp/vendors/cust/lib64:${LD_LIBRARY_PATH} cd build/examples/05_custom_ops_allgather/testcase mpirun -n rank_size ./custom_allgather_test data_len其中rank_size为使用的卡数data_len为数据长度。运行日志会依次打印 MPI 初始化、设备选择、Root info 生成、HCCL 通信域初始化、缓冲区分配与结果校验VerifyResult Passed!。基于 CCU_SCHED 引擎的自定义 AllGatherCCU 版自定义 AllGather 基于 CCU_SCHED 通信引擎要求组网为支持 UB 协议的 Mesh 互联Ascend 950PR/950DTN2需配套 9.1.0 版本 CANN Toolkit。工程结构包含op_host/allgather.cc、op_kernel_ccu/ccu_kernel.cc、exec_op.cc编排逻辑与inc/。编译安装后运行前需显式指定算子展开模式# 设置通信算子的展开模式为 CCU 调度模式 export HCCL_OP_EXPANSION_MODECCU_SCHED export LD_LIBRARY_PATH${ASCEND_HOME_PATH}/opp/vendors/cust/lib64:${LD_LIBRARY_PATH} ./build/examples/05_custom_ops_allgather/testcase/custom_allgather_test rank_size data_len运行成功后会打印各 rank 的设备绑定、通信域初始化、执行耗时与VerifyResult Passed!校验通过信息。环境要求与常见配置要点所有示例共同的运行前提产品支持主流示例支持 Ascend 950PR/Ascend 950DT、Atlas A3 训练/推理系列、Atlas A2 训练系列、Atlas 训练/推理系列AIV 版仅支持 Ascend 950PR/950DT 及部分 A3/A2 场景CCU 版仅支持 Ascend 950PR/950DT具体以各示例 README 为准组网形态01 点对点示例要求偶数卡其余示例要求 N2TensorFlow 示例固定单机 8 卡环境变量所有示例第一步都是source /usr/local/Ascend/cann/set_env.sh非 root 用户替换为${HOME}/Ascend/cann/set_env.sh该脚本注入ASCEND_HOME_PATH、LD_LIBRARY_PATH等关键变量也是 Makefile 编译的前置条件可选调优HCCL_OP_EXPANSION_MODE可切换算子展开模式如AI_CPU、CCU_SCHED相关说明见 HCCL_OP_EXPANSION_MODE.md。从示例到生产进一步的阅读路径各集合通信接口的完整参数语义与约束可对照 docs/zh/api_ref/comm_op_interface 下的HcclAllReduce.md、HcclAllGather.md、HcclAlltoAllV.md等接口文档以及 include/hccl.h 中的接口声明集合算子在仓库内的实现入口位于 src/ops如 src/ops/all_reduce、src/ops/all_gather每个算子目录下都有algorithm/算法实现、selector/算法选择、op_graph/等模块是深入理解 HCCL 内部算法编排的起点rank_table 集群配置的详细字段说明见 docs/zh/user_guide/cluster_info_configTensorFlow 示例中的ranktable.json即按此规范编写自定义算子工程依赖的编译打包框架位于 cmake 与 scripts/custom其中 scripts/custom/install.sh 定义了算子包的安装布局。总结CANN 开源仓库的 examples 目录从三个层次覆盖了 HCCL 的完整使用路径会用——通过make make test一键体验点对点与九大集合算子的标准编程范式HcclGetRootInfoHcclCommInitRootInfo 多线程绑定多设备 同步等待会集成——通过 torch_npu 的dist.init_process_group(backendhccl)与 TensorFlow 的 rank_table 机制接入主流 AI 框架会扩展——借助build.sh与 cmake 打包框架基于 AICPU、AIV、CCU 三种通信引擎开发并部署自定义通信算子。无论你是初次接触 HCCL 的应用开发者还是需要定制通信语义的算子开发者都可以从本文对应章节直接取用可编译、可运行的样例作为起点。【免费下载链接】hccl集合通信库Huawei Collective Communication Library简称HCCL是基于昇腾AI处理器的高性能集合通信库为计算集群提供高性能、高可靠的通信方案项目地址: https://gitcode.com/cann/hccl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考