ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CANN SHMEM 标量 Put/Get 主机侧对称内存通信实战:rma_d2h_demo 原理与运行指南

CANN SHMEM 标量 Put/Get 主机侧对称内存通信实战:rma_d2h_demo 原理与运行指南 CANN SHMEM 标量 Put/Get 主机侧对称内存通信实战rma_d2h_demo 原理与运行指南【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem导读本文围绕 CANN SHMEM 开源仓库中的examples/rma_d2h_demo示例系统讲解如何在昇腾平台上使用 SHMEM 标量 put/get 数据接口访问主机侧Host内存从示例的整体实现流程、设备端内核代码逐行解读到构建运行、结果校验再到 A3 SuperPoD 环境下运行该示例必须满足的内存容量与 Server ID 等前置条件。读完本文你将掌握aclshmem_int32_p/aclshmem_int32_g与aclshmem_quiet组合完成跨 PE 标量数据传递的典型写法并能够在 A3 与 Ascend 950 两类产品形态上独立编译、运行与验证该示例。一、示例定位D2H 场景下的标量 RMA 数据传输CANN SHMEM 是基于 OpenSHMEM 标准协议的多机多卡内存通信库。OpenSHMEM 将参与通信的进程/计算单元抽象为 PEProcessing Element并提供基于对称内存Symmetric Memory的一侧读get与一侧写put远程内存访问RMA能力。rma_d2h_demo中的 d2h 指的是 Device-to-Host 方向的数据访问示例通过aclshmemx_malloc(2*1024*1024, HOST_SIDE)在主机侧分配对称内存并让设备端Device内核通过标量 put/get 接口直接读写该主机内存。与之形成对照的是常规的 Device-Side 对称内存分配aclshmemx_malloc(size, DEVICE_SIDE)即默认值。从源码结构看aclshmem_mem_type_t枚举在 include/host_device/shmem_common_types.h 中定义enum aclshmem_mem_type_t { HOST_SIDE 0, // The memory address allocated by shmem is on the host side DEVICE_SIDE // The memory address allocated by shmem is on the device side };主机侧对称内存为 D2H/H2D 方向的高效访问提供了支撑本示例正是围绕这一能力的最小可运行演示。支持的硬件形态原文档明确了示例的适用产品型号仓库源码中的 SoC 判断逻辑也与之呼应examples/utils/utils.h中按Ascend950区分时钟周期换算Atlas A3 训练/推理产品Atlas A3 SuperPoD 环境Ascend 950PRAscend 950DT 暂不支持。说明下文Ascend950即对应上述产品型号不同 SoC 在构建参数-soc_type上有所区分见构建与运行一节。二、示例实现Host 侧标量 put/get 全流程整个示例的测试流程与原文档描述一致可在 examples/rma_d2h_demo/main.cpp 中逐段对应。2.1 测试用例四步走初始化 ACL 与 SHMEM分配并初始化输入输出数据调用aclInit、aclrtSetDevice、aclrtCreateStream初始化 ACL通过aclshmemx_init_attrACLSHMEMX_INIT_WITH_DEFAULT模式初始化 SHMEM。输入数据初始化为0输出数据初始化为当前my_pe。随后通过aclshmemx_malloc(2*1024*1024, HOST_SIDE)在主机侧分配对称内存作为input并通过aclrtMalloc在设备侧分配output。调用run_demo_scalar启动内核执行内核实现并在内核启动前后分别调用aclshmem_barrier_all()插入同步屏障保证各 PE 在内核运行期间互不干扰。aclshmem_barrier_all为全 PE 集合屏障接口声明见 include/host/data_plane/shmem_host_cc.h。校验执行结果通过aclrtMemcpyACL_MEMCPY_DEVICE_TO_HOST把input/output拷回主机侧判断每个 PE 上的结果是否符合预期。清理与释放aclshmemx_free、aclshmem_finalize、aclrtFreeHost、aclrtDestroyStream、aclrtResetDevice、aclFinalize依次释放 SHMEM 与 ACL 资源。2.2 主机侧对称内存的初始化属性示例通过公共工具函数test_set_attr定义于 examples/utils/utils.h填充aclshmemx_init_attr_tattributes-my_pe my_pe; attributes-n_pes n_pes; attributes-ip_port[ip_len] \0; // 例tcp://127.0.0.1:8998 attributes-local_mem_size local_mem_size; // 例1 GB 1024*1024*1024 attributes-option_attr {attr_version, ACLSHMEM_DATA_OP_MTE, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT}; attributes-comm_args reinterpret_castvoid *(default_flag_uid);其中关键字段local_mem_size本 PE 申请的本地对称内存大小示例中为1024UL * 1024UL * 10241 GBip_portPE 间通信的 IP 与端口示例使用tcp://127.0.0.1:8998option_attr指定数据通路引擎ACLSHMEM_DATA_OP_MTE与超时参数comm_args通过 UIDaclshmemx_uniqueid_t方式完成 PE 间握手对应shmemi_bootstrap_uid.cpp的 UID 引导机制。2.3 设备端内核实现内核函数kernel_testexamples/rma_d2h_demo/main.cpp执行以下三步逻辑int mype aclshmem_my_pe(); // 当前 PE ID int npes aclshmem_n_pes(); // PE 总数 int peer (mype 1) % npes; // 目标 PE环形后继 for (int iii 0; iii 10; iii) { aclshmem_int32_p(input, peer, peer); // 把本 PE 的 ID 写入下一 PE 的 input aclshmem_quiet(); // 等待标量 put 完成 auto get_num aclshmem_int32_g(input, peer); // 读取下一 PE 的 input aclshmem_quiet(); // 等待标量 get 完成 *(output) get_num; }要点解读PE 角色获取aclshmem_my_pe()返回当前 PE 编号0 ~ npes-1aclshmem_n_pes()返回程序中的 PE 总数声明见 include/host/team/shmem_host_team.hput 语义aclshmem_int32_p(dst, value, pe)是低延迟的单元素 put 接口把标量value写入远端 PE 的对称地址dst。它属于非数据块scalar/word同步语义接口不需要像putmem那样指定元素大小include/host/data_plane/shmem_host_rma.hget 语义aclshmem_int32_g(src, pe)返回远端 PE 对称地址src处的单个元素是低延迟的单元素 get 接口include/host/data_plane/shmem_host_rma.hquiet 语义aclshmem_quiet()等待此前发起的 put/get 数据传输全部完成保证后续读到的数据是最新值环形数据流第mype号 PE 把peer自己的 IDput 给后继 PE 的input再从后继 PE 的input中 get 回数据写入自己的output。因此最终每个 PE 的output应等于(my_pe 1) % n_pes即后继 PE 的编号——这正是第 2.1 节结果校验的判据。注意int32_p/int32_g在公开头文件中同时提供了不带acl前缀的 OpenSHMEM 风格别名例如shmem_int32_p/shmem_int32_g见 include/host/data_plane/shmem_host_rma.h以及设备侧对应声明include/device/gm2gm/shmem_device_rma.h用户可按 OpenSHMEM 习惯使用。2.4 多进程编排run.shexamples/rma_d2h_demo/run.sh负责按 PE 数拉起多个独立进程export SHMEM_UID_SESSION_ID127.0.0.1:8899 export LD_LIBRARY_PATH${PROJECT_ROOT}/build/lib:${ASCEND_HOME_PATH}/lib64:$LD_LIBRARY_PATH for (( idx 0; idx ${GNPU_NUM}; idx idx 1 )); do ${PROJECT_ROOT}/build/bin/rma_d2h_demo ${GNPU_NUM} $idx # 每个 PE 一个后台进程 ... done默认启动 8 个 PEGNPU_NUM8支持通过-pes N指定更小的 PE 数每个进程以rma_d2h_demo n_pes my_pe的形式启动对应main()中的argc/argv解析my_pe从 0 开始递增SHMEM_UID_SESSION_ID为 UID 引导会话标识LD_LIBRARY_PATH指向构建产物与 CANN 运行时脚本等待所有后台进程结束任一进程返回非 0 即整体失败。三、构建与运行3.1 环境准备环境配置请参考快速入门。核心前提包括已安装与硬件匹配的驱动、固件、CANN Toolkit 与 ops 包并已配置ASCEND_HOME_PATH等环境变量。本仓库根目录的 scripts/set_env.sh 与构建脚本会自动定位 CANN 环境。3.2 编译命令在仓库根目录执行构建脚本为 scripts/build.sh-examples表示同时编译示例-cann表示启用 CANN 构建# A3 平台构建 bash scripts/build.sh -examples -cann # Ascend950 平台构建需显式指定 SoC 类型 bash scripts/build.sh -soc_type Ascend950 -examples -cann-soc_type的可选值见scripts/build.sh的print_usage例如Ascend950构建产物输出到仓库build/目录示例二进制为build/bin/rma_d2h_demo。示例自身的 CMake 配置位于 examples/rma_d2h_demo/CMakeLists.txt通过aclshmem_add_fusion_example(rma_d2h_demo main.cpp)纳入整体构建。3.3 运行与结果判定cd examples/rma_d2h_demo bash run.sh执行过程中每个 PE 会打印[INFO] demo run end in pe my_pe表示该 PE 的用例执行完毕若打印[SUCCESS] run success in pe my_pe表示该 PE 结果校验通过output (my_pe 1) % n_pes若打印[ERROR] run result incorrect in pe my_pe说明结果不正确需按下文限制排查环境问题。四、运行限制与 A3 SuperPoD 环境排查4.1 Ascend950 运行时要求若初始化阶段报错aclrtMemSetAccess failed需要核对驱动driver、固件firmware、CANN Toolkit 与 ops 包是否为兼容版本。这通常是组件版本不一致导致的设备侧内存访问配置失败。4.2 查询 A3 SuperPoD 可用内存容量本示例默认申请的本地主机侧对称内存为 1 GBlocal_mem_size 1 GB因此当前节点的总可用物理内存必须大于 1 GB否则初始化可能失败。仓库提供了check_support.py脚本扫描节点上可用的物理内存examples/rma_d2h_demo/check_support.pypython3 check_support.py脚本原理简述读取/sys/devices/system/node/枚举所有 NUMA 节点遍历各节点的 memory block通过/proc/kpageflags的KPF_BUDDY位第 10 位判断物理页是否处于 Buddy 分配器的空闲链表中从而扫描出空闲物理页段与脚本内置的 4 个目标地址段RANGES每段 682 GB求交集统计各 NUMA 节点上空闲 ∩ 目标地址段的内存总量并汇总为TotalFree支持-n node指定 NUMA 节点、-m min-mb指定最小连续块默认 2 MB若内核配置为CONFIG_FORCE_MAX_ZONEORDER可读取到则以该值推算 zone 页大小否则按 Ubuntu13/ 其他发行版11回退。运行后会输出各 NUMA 节点的可用内存与总量单位为 MB/GB只要总量大于 1 GB 即满足本示例运行前提。4.3 A3 SuperPoD 服务器 Server ID 配置要求在 A3 SuperPoD 环境中运行本示例时每台服务器的 Server ID 配置必须正确。尤其是在故障硬件更换后Server ID 可能未正确配置导致示例无法运行。这一点并非示例代码自身的问题而是 A3 SuperPoD 组网对节点标识的一致性与合法性要求。如何查询 Server ID使用 npu-smi 工具查询当前服务器的 Server ID 配置npu-smi info -t spod-info -i 0 -c 0示例输出SDID : 16777216 Super Pod Size : 384 Super Pod ID : 0 Server Index : 4其中Server Index即当前服务器的 Server ID。同一计算节点内的所有 NPU 上查询到的Server Index必须完全一致若不一致或数值非法需按下面的方法修正。如何配置 Server ID若 Server ID 不正确可通过Redfish API进行修改具体操作流程可参考 Redfish API 相关文档EDOC1100401665 中关于 SPOD 信息管理的章节按其 Server Index / SPOD 配置接口调整。修改完成后建议重启相关服务或节点并再次用 npu-smi 校验确保示例运行前 Server ID 已就绪。五、总结rma_d2h_demo是理解 CANN SHMEM 主机侧对称内存与标量 RMA 语义的最佳入门示例之一知识点示例体现仓库依据主机侧对称内存分配aclshmemx_malloc(size, HOST_SIDE)include/host/mem/shmem_host_heap.h标量 putaclshmem_int32_p(dst, value, pe)include/host/data_plane/shmem_host_rma.h标量 getaclshmem_int32_g(src, pe)include/host/data_plane/shmem_host_rma.h同步屏障aclshmem_quiet()/aclshmem_barrier_all()include/host/data_plane/shmem_host_cc.h构建参数-examples -cann/-soc_type Ascend950scripts/build.sh通过该示例开发者可以快速掌握初始化 SHMEM → 主机侧对称内存分配 → 内核内标量 put/get quiet 同步 → 全 PE 屏障 → 结果校验 → 资源清理这一完整开发范式为后续基于aclshmem_putmem/getmem的大块数据传输、多实例multi-instance及 RDMA 后端开发打下基础。在 A3 SuperPoD 上运行前请务必确认节点可用内存大于 1 GB且各服务器 Server ID 配置一致、正确。【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表