新闻详情

新闻详情

首页 / 资讯中心 / 详情

CANN shmem HCCS SIO Link 链路测试工具全解析:A3 芯片 Die 间双路并行传输原理与实战

发布时间:2026/9/19 6:53:27来源:尧图网络
CANN shmem HCCS SIO Link 链路测试工具全解析:A3 芯片 Die 间双路并行传输原理与实战
CANN shmem HCCS SIO Link 链路测试工具全解析A3 芯片 Die 间双路并行传输原理与实战【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem导读HCCS SIO Link 是 CANN shmem 开源仓库中的一款 Die 间链路测试工具用于验证昇腾 NPU 之间 SIO 与 HCCS 两条链路的正确性并支持 SIO HCCS 双路并行传输的性能测量。它依托 A3 芯片单 NPU 双 Die的硬件架构利用aclrtMemMapSelectedLink将同一物理地址PA通过不同虚拟地址VA和链路索引映射到不同物理链路从而在一个 NPU 内部实现双链路并发 DMA。读完本文你将掌握该工具的链路原理、HCCS 映射建立/销毁的完整代码路径、编译运行方式、全部命令行参数与测试模式以及其性能测试内部参数与源码级实现细节。背景A3 芯片的双 Die 与 SIO/HCCS 两条互连链路对于昇腾 A3 芯片Atlas A3 训练系列/Atlas A3 推理系列一个 NPU 包含两个 Diedie两 Die 之间通过 SIO 链路互连。本工具方案在原有 SIO 链路基础上新增 HCCS 链路实现SIO/HCCS 双路并行传输从而提高 Die 间数据传输速度。三种传输路径的定位如下SIODie 间原有互连链路。shmem 初始化后默认获得的 VA 访问对端 Die 时即走 SIO 链路。HCCS新增的 Die 间互连链路。通过aclrtMemMapSelectedLink将新 VA 映射到与原 SIO VA 相同的 PA并使用ACL_RT_MEM_LINK_IDX_1选中 HCCS 链路此时通过新 VA 访问即走 HCCS 链路。SIO HCCS 双路并行同时使用 SIO 和 HCCS 两条链路传输数据充分利用双链路带宽提升传输性能。重要限制本示例依赖 Die 间 SIO/HCCS 链路仅在 A3Atlas A3 训练系列/Atlas A3 推理系列上支持不支持 A2Atlas A2 训练系列/Atlas A2 推理系列与 Ascend950。关键原理VA 分流、PA 共享SIO 与 HCCS 两条链路共享同一物理地址PA但通过不同的虚拟地址VA和链路索引实现分流从而支持双路并行传输。也就是说两条 VA 指向同一 PA但访问时经过不同的物理链路。这是本工具所有正确性测试与性能测试的底层基础。核心函数说明建立与销毁 HCCS 链路映射工具的核心逻辑位于 examples/hccs_sio_link/main.cpp。main.cpp在文件头部通过extern C声明引用了aclrtMemMapSelectedLink见 main.cpp 第 34 行随后实现两个关键函数。setup_hccs_mapping四步建立 HCCS 映射该函数main.cpp 第 40-70 行为当前 PE 创建一条通过 HCCS 链路访问对端 PE 堆内存的虚拟地址通道共执行以下四个步骤获取本地堆基址调用aclshmemx_get_heap_base()获取当前 PE 的对称堆基址main.cpp 第 43 行。转换为对端地址调用aclshmem_ptr()将本地堆基址转换为对端 PE 的可访问虚拟地址peer_heap_basemain.cpp 第 49 行该地址走 SIO 链路。预留虚拟地址空间调用aclrtReserveMemAddress()在当前 PE 的虚拟地址空间中预留一段未映射的 VA 区域hccs_ptrmain.cpp 第 57 行映射区域大小为local_mem_size ACLSHMEM_EXTRA_SIZE。映射到 HCCS 链路调用aclrtMemMapSelectedLink(*hccs_ptr, heap_map_size, peer_heap_base, ACL_RT_MEM_LINK_IDX_1)main.cpp 第 63 行将预留的 VA 映射到与peer_heap_base所对应的物理地址PA并指定ACL_RT_MEM_LINK_IDX_1选中 HCCS 链路。此时通过hccs_ptr访问即走 HCCS 链路而通过原 SIO 路径的 VA 访问仍走 SIO 链路。参数说明参数类型说明peerint对端 PE 编号即需要建立 HCCS 映射的目标 PElocal_mem_sizeuint64_t与aclshmemx_init_attr初始化时设定的对称堆大小相同字节实际映射区域大小为local_mem_size ACLSHMEM_EXTRA_SIZEhccs_ptrvoid **输出参数成功时返回 HCCS 链路映射的虚拟地址基址失败时值取决于失败发生的步骤若aclrtReserveMemAddress已成功但后续步骤失败*hccs_ptr可能包含已预留但未映射的地址需通过teardown_hccs_mapping或HccsMappingGuard释放以防泄漏返回值trueHCCS 映射建立成功*hccs_ptr为有效的 HCCS 虚拟地址基址。false映射过程中任一步骤失败如aclshmemx_get_heap_base、aclshmem_ptr、aclrtReserveMemAddress、aclrtMemMapSelectedLink任一返回异常函数会向stderr打印错误信息并返回。teardown_hccs_mapping释放映射资源与setup_hccs_mapping配对的清理函数main.cpp 第 72-87 行用于释放 HCCS 映射资源若映射已建立hccs_mapped为 true调用aclrtUnmapMem()解除 VA 到 PA 的映射关系。调用aclrtReleaseMemAddress()释放预留的虚拟地址空间。HccsMappingGuardRAII 自动释放在示例代码中HccsMappingGuard结构体main.cpp 第 112-116 行利用 RAII 机制在析构时自动调用teardown_hccs_mapping确保映射资源不会泄漏。所有测试路径test_hccs_path、test_mixed_path、test_mixed_get_perf_path、test_mixed_put_perf_path都通过HccsMappingGuard hccs; hccs.mapped setup_hccs_mapping(...)的写法使用它即使后续步骤失败也能安全释放。编译方法本示例需要通过-examples编译选项启用CMake 会自动检测当前 CANN 版本是否支持aclrtMemMapSelectedLink函数若支持则自动编译本示例。示例的构建注册位于 examples/hccs_sio_link/CMakeLists.txt通过aclshmem_add_fusion_example注册并引入kernels与utils两个头文件目录。bash scripts/build.sh -examples编译产物build/bin/hccs_sio_link前置条件已按上述方式编译 shmem 项目。已设置ASCEND_HOME_PATH环境变量。环境依赖CANN 版本 9.1.0Ascend HDK 版本 26.0.0LingQu Computing Network 版本 1.5.3。硬件限制仅支持 Atlas A3A3 训练系列 / A3 推理系列。多实例说明aclshmemx_get_heap_base返回当前活跃实例的堆基址。在多实例场景下需先通过aclshmemx_instance_ctx_set_impl切换到目标实例再调用aclshmemx_get_heap_base。用法本工具通过run.sh脚本启动。脚本会为每个 PE 启动一个后台进程见 examples/hccs_sio_link/run.sh 第 123-128 行的循环启动逻辑各 PE 之间通过 shmem 初始化建立通信随后逐进程wait等待全部完成并聚合返回码。直接运行二进制run.sh会在性能测试模式下自动创建output目录run.sh 第 111 行。如果绕过脚本直接运行build/bin/hccs_sio_link请先在进程的工作目录中执行mkdir -p output否则性能 CSV 文件无法写入。运行命令bash run.sh [选项]典型用例# 默认配置2 个 PESIOHCCS 全链路测试4KB 数据int 类型 bash run.sh # 指定 4 个 PE仅测 HCCS 链路 bash run.sh -pes 4 -mode hccs # 指定 8 个 PE8KB 数据fp32 类型仅测 SIO 链路 bash run.sh -pes 8 -size 8 -type fp32 -mode sio # SIO HCCS 混合测试3/5 数据走 SIO2/5 数据走 HCCS bash run.sh -mode mixed # 混合 Get 性能测试PE 0 采集 cycle 数据 export SHMEM_CYCLE_PROF_PE0 bash run.sh -mode mixed_get_perf # 混合 Put 性能测试PE 1 采集 cycle 数据 export SHMEM_CYCLE_PROF_PE1 bash run.sh -mode mixed_put_perfrun.sh 会为每个后台进程传入PE_SIZE PE_ID IPPORT PE_SIZE FIRST_PE FIRST_NPU TEST_TYPE LINK_MODE DATA_SIZE_KB等参数run.sh 第 124 行main.cpp的main函数在启动时打印link_mode、data_size_kb、data_elements等信息main.cpp 第 619-620 行。参数说明脚本命令行参数参数默认值说明-ipporttcp://127.0.0.1:8766通信初始化地址-pes2参与测试的 PE 总数与 NPU 数量一致-fpe0首个 PE 编号-fnpu0首个 NPU 编号-typeint测试数据类型int/int64/fp32-modeall测试模式见下表-size4每个 PE 的数据大小KBmain.cpp中根据data_type计算元素数量data_elements (data_size_kb * 1024) / sizeof(type)main.cpp 第 609 行并校验data_size_kb 0且元素数不超过INT_MAXmain.cpp 第 611-615 行。测试时对端 PE 通过get_peer_pe计算偶数 PE 与下一个 PE 配对、奇数 PE 与上一个 PE 配对main.cpp 第 127-134 行。测试模式模式说明sioSIO 链路正确性测试hccsHCCS 链路正确性测试allSIO HCCS 全链路正确性测试mixedSIO HCCS 混合正确性测试3/5 数据走 SIO2/5 数据走 HCCSmixed_get_perfSIO HCCS 混合 Get 性能测试3/5 数据走 SIO2/5 数据走 HCCSmixed_put_perfSIO HCCS 混合 Put 性能测试3/5 数据走 SIO2/5 数据走 HCCSrun.sh对-mode取值做了白名单校验仅接受上述六种模式之一run.sh 第 76 行。正确性测试原理正确性测试的核心思想是每个 PE 通过aclshmem_malloc在对称堆分配缓冲区并用pe_id * 1000 i % 1000的规则初始化数据main.cpp 第 153-155 行然后从对端 PE 通过 SIO 或 HCCS 路径读取数据verify_buffer按同样规则逐元素比对main.cpp 第 185-194 行全部一致才输出PASSED。test_sio_path直接通过aclshmem_ptr得到的对端 VA 发起 MTE Get。test_hccs_path先建立 HCCS 映射然后计算offset symm_addr - heap_base再以hccs_base offset作为 HCCS 路径的目标地址发起读取main.cpp 第 226-233 行——这与混合模式中计算hccs_src的方式完全一致即 HCCS VA 与 SIO VA 相对堆基址的偏移保持一致仅基址不同。test_mixed_path将数据按 3:2 拆分前 3/5 元素走 SIO 路径、后 2/5 元素走 HCCS 路径分别读取到独立的 SIO/HCCS 缓冲区后再分别校验main.cpp 第 379-385 行。在 Kernel 侧examples/hccs_sio_link/kernels/hccs_sio_link_kernel.cppSIO 路径直接调用aclshmemx_mte_get_nbi完成跨 PE 非阻塞 DMAkernel 第 36 行而 HCCS 路径因为目标 VA 位于本地虚拟地址空间采用GM→UB→GM的绕行方案local_mte_get_hccs按 UB 大小分块用DataCopyPad先将远端数据拷入 UB再从 UB 拷入本地 GM并通过MTE2_MTE3、MTE3_MTE2硬件事件做流水同步kernel 第 90-105 行。性能测试mixed_get_perf 与 mixed_put_perfmixed_get_perf和mixed_put_perf模式用于测量 SIO HCCS 双路并行传输的性能cycle 数分别测试 Get远端读和 Put远端写操作。工作原理数据按 3:2 比例分配到 SIO 和 HCCS 链路3/5 数据走 SIO2/5 数据走 HCCS。Kernel 内部按 block 维度划分部分 block 负责 SIO 链路传输其余 block 负责 HCCS 链路传输。具体地32 个 block 中32 * 3 / 5 19个 block 走 SIO剩余 13 个 block 走 HCCS见calc_sio_block_count与mte_get_mixed_perf_kernel中的划分逻辑examples/hccs_sio_link/utils/hccs_sio_link_config.h 第 22-30 行与 perf kernel 第 92-97 行。使用aclshmemx_mte_get_nbi/aclshmemx_mte_put_nbi进行非阻塞 DMA 传输。通过 cycle 计数器采集每次传输的耗时AscendC::GetSystemCycle()前后两次取差值累加并利用 shmem profiling 机制aclshmemx_get_prof输出统计结果。do_prof判定会同时检查frame_id ACLSHMEM_CYCLE_PROF_FRAME_CNT、block_idx ACLSHMEM_CYCLE_PROF_MAX_BLOCK以及 PE 匹配perf kernel 第 102-105 行。性能数据在 prof_pe 侧汇总每个 block 将累计的cycles与ccount写入device_state-profs-block_prof[block_idx]perf kernel 第 171-174 行host 侧通过aclshmemx_get_prof取回后由 examples/hccs_sio_link/utils/hccs_sio_link_perf_utils.h 中的print_perf_result计算最大/平均 Core 耗时与带宽Bandwidth transfer_bytes / MaxCoreTimeperf_utils.h 第 78-80 行并追加写入 CSV 行。所有数据量档位测完后由write_perf_csv写入output/hccs_sio_link_perf_mixed_{get,put}_perf_pe{pe_id}.csvmain.cpp 第 714、756 行。环境变量环境变量说明SHMEM_CYCLE_PROF_PE指定进行性能采集的 PE 编号默认为0。仅该 PE 会执行 cycle 采集逻辑其余 PE 仅参与 barrier 同步main.cpp对该环境变量做了严格解析与范围校验非数字、空串或取值超出[0, n_pes)都会直接报错退出main.cpp 第 675-685 行。在 Kernel 侧当is_unilateral即HCCS_SIO_PERF_IS_UNILATERAL为 true 时非 prof_pe 的 PE 直接走aclshmemx_sync_vec_all()同步后返回只有 prof_pe 执行测量循环perf kernel 第 83-86 行。运行示例# 混合 Get 性能测试2 个 PE4KB 数据int 类型PE 0 采集性能数据 export SHMEM_CYCLE_PROF_PE0 bash run.sh -mode mixed_get_perf # 混合 Put 性能测试2 个 PE8KB 数据fp32 类型PE 1 采集性能数据 export SHMEM_CYCLE_PROF_PE1 bash run.sh -pes 2 -size 8 -type fp32 -mode mixed_put_perf内部参数性能测试内部参数定义在 examples/hccs_sio_link/utils/hccs_sio_link_config.h 中参数常量名值说明kernel block 数HCCS_SIO_BLOCK_DIM32kernel 启动的 block 总数UB 缓冲区大小HCCS_SIO_UB_SIZE_KB16每个 block 的 Unified Buffer 大小KBSIO 比例分子HCCS_SIO_RATIO_NUM3SIO 数据量 total × NUM / DENSIO 比例分母HCCS_SIO_RATIO_DEN5HCCS 数据量 total - SIO 数据量数据大小下限HCCS_SIO_PERF_MIN_LOG2_BYTES4最小传输数据量的 log2(bytes)4 16B数据大小上限HCCS_SIO_PERF_MAX_LOG2_BYTES20最大传输数据量的 log2(bytes)20 1MB数据大小步进HCCS_SIO_PERF_STEP_LOG21log2 步进1 每次翻倍预热轮次HCCS_SIO_PERF_WARMUP100预热迭代次数不计入统计测试轮次HCCS_SIO_PERF_LOOP_COUNT1000正式测量迭代次数单向/双向模式HCCS_SIO_PERF_IS_UNILATERALtruetrue单向仅 prof_pe 执行false双向所有 PE 执行性能测试在 main 中按log2从 4 到 20 步进 1 依次测完所有数据量档位main.cpp 第 691 行每档数据量total_bytes per_block_bytes × HCCS_SIO_BLOCK_DIM即单 block 传输量从 16B 到 1MB 逐次翻倍。注意性能采集受ACLSHMEM_CYCLE_PROF_MAX_BLOCK最大记录核数和ACLSHMEM_CYCLE_PROF_FRAME_CNT最大记录帧数限制超出范围的 block 或帧不会被记录。此外cycle 到微秒的换算系数cycle2us在 perf_utils.h 中通过aclrtGetSocName()获取芯片名确定默认取 50Ascend950 芯片取 1000perf_utils.h 第 26-37 行且该换算与src/host/utils/prof中的prof_data_print保持一致。输出示例正确性测试PE 0: [SIO] path verification PASSED for PE 1 PE 1: [SIO] path verification PASSED for PE 0 PE 0: [HCCS] path verification PASSED for PE 1 PE 1: [HCCS] path verification PASSED for PE 0混合测试PE 0: [MIXED-SIO] path verification PASSED for PE 1 PE 0: [MIXED-HCCS] path verification PASSED for PE 1 PE 1: [MIXED-SIO] path verification PASSED for PE 0 PE 1: [MIXED-HCCS] path verification PASSED for PE 0源码结构速览文件职责examples/hccs_sio_link/main.cpphost 侧参数解析、HCCS 映射建立/销毁、各模式测试流程编排、性能数据汇总与 CSV 输出examples/hccs_sio_link/kernels/hccs_sio_link_kernel.cppSIO/HCCS/混合正确性测试的 MTE 搬运 kernel 实现examples/hccs_sio_link/kernels/hccs_sio_link_perf_kernel.cpp混合 Get/Put 性能测试 kernel含 cycle 采集与 block 级比例划分examples/hccs_sio_link/utils/hccs_sio_link_config.hblock 数、UB 大小、SIO 比例、性能测试档位等全部内部参数examples/hccs_sio_link/utils/hccs_sio_link_perf_utils.h性能结果打印、带宽计算、cycle2us 换算与 CSV 写入examples/hccs_sio_link/run.sh多 PE 后台进程启动、环境变量设置、性能模式 output 目录创建总结HCCS SIO Link 工具完整展示了在 A3 芯片上利用aclrtMemMapSelectedLink与链路索引实现同一 PA、双 VA、双链路的 Die 间并行传输方案正确性测试验证 SIO、HCCS、混合三种路径的数据一致性性能测试则通过 block 级 3:2 比例划分与 cycle 采集量化双路并行带宽。该示例既是 shmem 对称堆与 RMA/MTE 接口的典型应用也是理解昇腾 A3 Die 间互连架构与虚拟内存多链路映射机制的极佳参考。【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Celery 与 Django 集成实战:从零搭建异步任务队列(celery.py、shared_task 与事务安全触发) 2026/9/19 7:38:34

Celery 与 Django 集成实战:从零搭建异步任务队列(celery.py、shared_task 与事务安全触发)

Celery 与 Django 集成实战:从零搭建异步任务队列(celery.py、shared_task 与事务安全触发) 【免费下载链接】celery Distributed Task Queue (development branch) 项目地址: https://gitcode.com/gh_mirrors/ce/celery 导读 本文基…

阅读更多 →
uni-app一键登录实战:从云函数配置到前端调用全流程 2026/9/19 7:38:34

uni-app一键登录实战:从云函数配置到前端调用全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
tsParticles Stars 预设:在网页中打造闪烁的星空夜效果 2026/9/19 7:38:34

tsParticles Stars 预设:在网页中打造闪烁的星空夜效果

tsParticles Stars 预设:在网页中打造闪烁的星空夜效果 【免费下载链接】tsparticles tsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for y…

阅读更多 →
STM32铅酸蓄电池内阻测试仪:交流阻抗法+四线制设计全解析 2026/9/19 7:38:34

STM32铅酸蓄电池内阻测试仪:交流阻抗法+四线制设计全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
高等代数复习方法论:从知识框架到SymPy验证的冲刺策略 2026/9/19 7:38:34

高等代数复习方法论:从知识框架到SymPy验证的冲刺策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
LVGL 8.x Keypad驱动与实体按键无缝对接实战指南 2026/9/19 7:35:33

LVGL 8.x Keypad驱动与实体按键无缝对接实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞