CANN/shmem RDMA同步栅栏示例

📅 2026/7/4 8:28:45
CANN/shmem RDMA同步栅栏示例
示例场景【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem本示例演示通过 RDMA RoCE 传输通路使用低阶接口aclshmemx_roce_put_nbi配合同步/栅栏原语完成多 PE 之间的全交换all-gather数据通信并验证数据正确性。具体包含以下 8 种同步模式sync_all使用aclshmemx_roce_put_nbiaclshmemx_roce_quietaclshmemx_roce_sync_all完成全局同步sync_all_buf使用aclshmemx_roce_put_nbiaclshmemx_roce_quietaclshmemx_roce_sync_all(buf, sync_id)显式传入 UB buffer 和 sync_idbarrier_all使用aclshmemx_roce_put_nbiaclshmemx_roce_barrier_all完成全局同步barrier 内部自动 quietbarrier_all_buf使用aclshmemx_roce_put_nbiaclshmemx_roce_barrier_all(buf, sync_id)显式传入 UB buffer 和 sync_idsync_team使用aclshmemx_roce_put_nbiaclshmemx_roce_quietaclshmemx_roce_team_sync(team)在 team 内完成同步sync_team_buf使用aclshmemx_roce_put_nbiaclshmemx_roce_quietaclshmemx_roce_team_sync(team, buf, sync_id)在 team 内显式传入参数barrier_team使用aclshmemx_roce_put_nbiaclshmemx_roce_barrier(team)在 team 内完成同步barrier_team_buf使用aclshmemx_roce_put_nbiaclshmemx_roce_barrier(team, buf, sync_id)显式传入参数环境要求运行本示例需要机器具备 RDMA 环境RDMA 网卡及驱动已正确安装配置。检查 RDMA 环境Ascend910B/C 平台for i in {0..7}; do hccn_tool -i $i -ip -g; done for i in {0..7}; do hccn_tool -i $i -net_health -g; done注7 需要根据实际要查看的卡数修改。可用环境命令输出如下Ascend950 平台使用ibv_devinfo命令检查 RDMA 设备信息。ibv_devinfo | grep xscale可用环境命令输出如下使用方式编译在shmem/目录执行以下命令进行编译Ascend910B/C 平台bash scripts/build.sh -enable_rdma -examplesAscend950 平台bash scripts/build.sh -soc_type Ascend950 -enable_rdma -rdma_backend XSCALE -examples运行方式一在examples/rdma_sync_barrier_demo目录下执行bash run.shrun.sh支持通过参数指定 demo 类型默认为sync_all。bash run.sh sync_all # 运行 sync_all demo默认 bash run.sh sync_all_buf # 运行 sync_all(buf, sync_id) demo bash run.sh barrier_all # 运行 barrier_all demo bash run.sh barrier_all_buf # 运行 barrier_all(buf, sync_id) demo bash run.sh sync_team # 运行 sync_team demo bash run.sh sync_team_buf # 运行 sync_team(buf, sync_id) demo bash run.sh barrier_team # 运行 barrier_team demo bash run.sh barrier_team_buf # 运行 barrier_team(buf, sync_id) demo注Ascend950 平台需要在run.sh中设置IBV_EXTEND_DRIVERS环境变量export IBV_EXTEND_DRIVERSpath_to_libxscale_nda.so方式二在shmem/目录手动运行命令单机 2 卡执行命令export PROJECT_ROOTshmem-root-directory export IBV_EXTEND_DRIVERSpath_to_libxscale_nda.so # 仅 Ascend950 平台需要 export LD_LIBRARY_PATH${PROJECT_ROOT}/build/lib:$LD_LIBRARY_PATH ./build/bin/rdma_sync_barrier_demo 2 0 tcp://127.0.0.1:8899 2 0 0 sync_all # PE 0 ./build/bin/rdma_sync_barrier_demo 2 1 tcp://127.0.0.1:8899 2 0 0 sync_all # PE 1注shmem-root-directory 为 SHMEM 项目的根目录。跨机 2 卡执行命令假设机器 A 的 IP 为 ip1机器 B 的 IP 为 ip2。 在机器 A 执行如下命令export PROJECT_ROOTshmem-root-directory export IBV_EXTEND_DRIVERSpath_to_libxscale_nda.so # 仅 Ascend950 平台需要 export LD_LIBRARY_PATH${PROJECT_ROOT}/build/lib:$LD_LIBRARY_PATH ./build/bin/rdma_sync_barrier_demo 2 0 tcp://ip1:8765 1 0 0 sync_all # PE 0同时在机器 B 执行如下命令export PROJECT_ROOTshmem-root-directory export IBV_EXTEND_DRIVERSpath_to_libxscale_nda.so # 仅 Ascend950 平台需要 export LD_LIBRARY_PATH${PROJECT_ROOT}/build/lib:$LD_LIBRARY_PATH ./build/bin/rdma_sync_barrier_demo 2 1 tcp://ip1:8765 1 1 0 sync_all # PE 1注shmem-root-directory 为 SHMEM 项目的根目录。如需在容器中运行跨机测试启动容器时指定--nethost模式即可。双机 16 卡每机 8 卡执行命令示例假设机器 A 的 IP 为 ip1机器 B 的 IP 为 ip2。 在机器 A 执行如下命令export PROJECT_ROOTshmem-root-directory export LD_LIBRARY_PATH${PROJECT_ROOT}/build/lib:$LD_LIBRARY_PATH pids() for pe in $(seq 0 7); do ./build/bin/rdma_sync_barrier_demo 16 $pe tcp://ip1:8765 8 0 0 sync_all pids($!) done for pid in ${pids[]}; do wait $pid; done在机器 B 执行如下命令export PROJECT_ROOTshmem-root-directory export LD_LIBRARY_PATH${PROJECT_ROOT}/build/lib:$LD_LIBRARY_PATH pids() for pe in $(seq 8 15); do ./build/bin/rdma_sync_barrier_demo 16 $pe tcp://ip1:8765 8 8 0 sync_all pids($!) done for pid in ${pids[]}; do wait $pid; done命令行参数说明./rdma_sync_barrier_demo n_pes pe_id ipport g_npus f_pe f_npu [demo_type]参数说明n_pes全局 PE 数量pe_id当前进程的 PE 号ipportSHMEM 初始化需要的 IP 及端口号格式为tcp://IP:端口号。若执行跨机测试需将 IP 设为 PE 0 所在 Host 的 IPg_npus当前机器上启动的 NPU 卡数量f_pe当前机器上使用的第一个 PE 号f_npu当前机器执行本样例使用的第一张 NPU 卡的卡号demo_type可选指定 demo 类型默认为sync_all。支持的值见下方表格demo_type 取值值说明sync_all使用aclshmemx_roce_sync_all完成全局同步sync_all_buf使用aclshmemx_roce_sync_all(buf, sync_id)完成全局同步barrier_all使用aclshmemx_roce_barrier_all完成全局同步barrier_all_buf使用aclshmemx_roce_barrier_all(buf, sync_id)完成全局同步sync_team使用aclshmemx_roce_team_sync(team)在 team 内完成同步sync_team_buf使用aclshmemx_roce_team_sync(team, buf, sync_id)在 team 内完成同步barrier_team使用aclshmemx_roce_barrier(team)在 team 内完成同步barrier_team_buf使用aclshmemx_roce_barrier(team, buf, sync_id)在 team 内完成同步预期输出每个 PE 向所有其他 PE 发送自己的数据值为pe_id 10同步完成后各 PE 校验收到的数据是否正确。校验通过后输出[PASS] check success, pepe_id若校验失败会打印具体的不匹配信息[FAIL] pepe_id offsetoffset gotactual expectedexpected【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考