十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN SHMEM 原子操作接口同步语义全解析:标准 AMO 与 MTE/RDMA 后端的同步/异步行为对照

CANN SHMEM 原子操作接口同步语义全解析:标准 AMO 与 MTE/RDMA 后端的同步/异步行为对照 CANN SHMEM 原子操作接口同步语义全解析标准 AMO 与 MTE/RDMA 后端的同步/异步行为对照【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem本文基于 CANN SHMEM 仓库的实际代码实现编写系统梳理 Device 侧原子操作AMO三层接口——标准接口aclshmem_type_atomic_op、MTE 后端aclshmemx_mte_atomic_op、RDMA 后端aclshmemx_roce_atomic_op——的同步/异步语义、类型与硬件平台支持范围、对称内存约束及同步规则帮助开发者正确写出无数据竞争的跨 PE 原子操作代码。导读在昇腾多卡场景中跨 PEProcessing Element的原子操作通常经由 MTEMemory Transfer Engine或 RDMARoCE两条硬件通路完成而两条通路的同步语义截然不同MTE 后端全部异步、需开发者按数据依赖插入 Kernel Runtime 级SetFlag/WaitFlagRDMA 后端则“带返回值为同步、无返回值为异步”。本文从仓库源码出发逐层拆解标准接口的后端自动分派逻辑、各接口的支持类型与硬件平台矩阵、同步规则速查与可运行的代码示例让你在编写 Device Kernel 时能准确判断“什么时候该同步、用什么原语同步、哪些类型/通路组合根本不可用”。一、接口层次关系标准接口如何自动分派到 MTE/RDMA 后端atomic 接口在仓库中分为两层aclshmem_type_atomic_op() ← 标准接口 │ ├── topo MTE → aclshmemx_mte_atomic_op() ← MTE 后端 └── topo ROCE → aclshmemx_roce_atomic_op() ← RDMA 后端标准接口根据device_state-topo_list[pe]即对端 PE 的拓扑/传输类型自动分派到 MTE 或 RDMA 后端并在后端调用之上额外添加同步保证。从 src/device/gm2gm/shmem_device_amo.hpp 的实现可以看到每个标准接口都先通过aclshmemi_get_state()取得device_state再对topo_list[pe]做位掩码判断ACLSHMEM_TRANSPORT_MTE→ 走 MTE 后端ACLSHMEM_TRANSPORT_ROCE→ 走 RDMA 后端其余分支还会尝试 UDMA 通路ACLSHMEM_TRANSPORT_UDMA这也是为何头文件注释中 atomic_add 的支持矩阵里同时出现 MTE / RDMA / UDMA 三列的原因。分派路径上的同步差异总结如下详见下文各节aclshmem_type_atomic_op(dst, val, pe) │ ├── topo_list[pe] MTE │ ├── fetch 变体: 调用 aclshmemx_mte_atomic_fetch_op() PipeBarrierPIPE_ALL │ ├── swap/cas: 调用 aclshmemx_mte_atomic_swap/compare_swap() PipeBarrierPIPE_ALL │ ├── add/inc: 透传 aclshmemx_mte_atomic_add/inc()未加 PipeBarrier │ └── set/and/or/xor: 透传底层异步接口未加 PipeBarrier │ └── topo_list[pe] ROCE ├── fetch 变体: 透传 aclshmemx_roce_atomic_fetch_op()后端已 quiet ├── swap/cas: 透传 aclshmemx_roce_atomic_swap/compare_swap()后端已 quiet ├── add/inc: 透传 aclshmemx_roce_atomic_add/inc()后端异步未加 quiet └── set/and/or/xor: 透传底层异步接口未加 quiet二、MTE 后端接口aclshmemx_mte_atomic_op全部异步头文件include/device/gm2gm/engine/shmem_device_mte.h 实现文件src/device/gm2gm/engine/shmem_device_mte.hpp核心特征所有 MTE 后端接口均为异步不论是否带返回值。接口仅发起硬件原子操作即返回内部不执行任何 quiet/fence。同步原语由调用方选择aclshmemx_mte_quiet()实现为AscendC::PipeBarrierPIPE_ALL()清空指令流水再dcci_entire_cache()冲刷数据缓存到 GM见 shmem_device_mte.hppKernel Runtime 级SetFlag/WaitFlag推荐按数据依赖精确同步性能更好。2.1 接口清单接口完整名返回值支持类型硬件平台aclshmemx_mte_atomic_fetchTint32, uint32, float, int64, uint64950aclshmemx_mte_atomic_setvoiduint32, uint64950aclshmemx_mte_atomic_swapTuint32, uint64950aclshmemx_mte_atomic_compare_swapTuint32, uint64950aclshmemx_mte_atomic_incvoidint32, uint32, float, int64, uint64950aclshmemx_mte_atomic_addvoidint8, int16, bf16, half, int32, float (A2/A3/950) uint32, uint64, int64 (950)A2/A3/950aclshmemx_mte_atomic_fetch_incTint32, uint32, float, int64, uint64950aclshmemx_mte_atomic_fetch_addTint32, uint32, float, int64, uint64950从源码看这些接口的实现本质上都是“先把dst通过aclshmem_ptr(dst, pe)换算成远端地址再调用底层硬件原语”atomic_fetch→aclshmemi_mte_amo_add(remote_ptr, 0)加 0 读旧值atomic_set→aclshmemi_mte_amo_swap即AscendC::AtomicExchatomic_compare_swap→aclshmemi_mte_amo_cas即AscendC::AtomicCasatomic_inc/atomic_fetch_inc→aclshmemi_mte_amo_add(remote_ptr, 1)。底层原语aclshmemi_mte_amo_add/cas/swap均以__NPU_ARCH__ 3510Ascend950为编译条件非 950 平台会调用aclshmemi_kernel_abort报错见 shmem_device_mte.hpp。2.2 同步要求按数据依赖插入 SetFlag/WaitFlag所有 MTE 后端接口调用后如果存在标量计算单元Scalar与搬运单元MTE2/MTE3之间的数据依赖开发者需根据实际数据流插入同步时机场景同步方式调用前其他单元如 MTE2正在写同一 UB 区域SetFlag/WaitFlagonMTE2_S调用后后续操作依赖原子操作在 GM 中的结果SetFlag/WaitFlagonMTE3_MTE2调用后需要复用同一 UB 区域写入新数据SetFlag/WaitFlagonMTE3_SMTE 原子操作使用的 UB 缓冲区默认 offset 为 0可通过aclshmemx_set_mte_config(offset, ub_size, sync_id)调整对应device_state-mte_config中的aclshmem_ub、ub_size、sync_id字段。2.3aclshmemx_mte_atomic_add的类型差异重要aclshmemx_mte_atomic_add在 Ascend950 上按类型有两种实现路径其同步要求完全不同见 shmem_device_mte.hpp类型组支持类型实现方式同步要点UB MTE3 路径int8, int16, bf16, half, int32, floatScalar 写操作数到 UB → MTE3 读 UB → MTE3 atomic add 写 GM需关注 UB 相关 fenceMTE2_S、MTE3_S和 GM fenceMTE3_MTE2Scalar AtomicAdd 路径uint32, uint64, int64Scalar 单元直接执行标量 AtomicAdd 写 GM不经过 UB 和 MTE3不需要 UB/MTE3 相关 fence仅在 Scalar↔MTE2/MTE3 有 GM 数据依赖时按通用规则同步UB MTE3 路径对应源码中的aclshmemi_mte_amo_add_via_ub先用LocalTensor::SetValue(0, value)将操作数写入 UB再SetFlag/WaitFlagS_MTE3保证 Scalar 写 UB 完成随后开启AscendC::SetAtomicAddT()并通过aclshmemi_copy_ub2gm发起带原子语义的 GM 写入最后SetAtomicNone()关闭见 shmem_device_mte.hpp。而 Scalar AtomicAdd 路径直接调用AscendC::AtomicAdd(dst, value)完全不经过 UB 与 MTE3因此无需任何 UB fence。三、RDMA 后端接口aclshmemx_roce_atomic_op返回值决定同步性头文件include/device/gm2gm/engine/shmem_device_rdma.h 实现文件src/device/gm2gm/engine/shmem_device_rdma.hpp核心特征有返回值的接口为同步接口内部完成 quiet无返回值的接口为异步接口需调用者 quiet。同步原语为aclshmemx_roce_quiet(pe, buf, sync_id)声明形如ACLSHMEM_DEVICE void aclshmemx_roce_quiet(uint32_t pe, __ubuf__ T* buf, uint32_t sync_id)。地址换算约束RDMA AMO 的 target/source 参数会作为本地对称地址换算到指定 PE因此必须指向对称内存不能把任意本地 GM 地址直接用作该参数。可通过aclshmem_malloc等对称内存分配接口准备目标对象该限制来自远端地址换算方式并非 RDMA 引擎对 GM 地址的固有限制。3.1 同步接口带返回值内部完成 quiet接口完整名返回值支持类型硬件平台aclshmemx_roce_atomic_fetchT32/64 位整数950aclshmemx_roce_atomic_fetch_addT32/64 位整数950aclshmemx_roce_atomic_fetch_incT32/64 位整数950aclshmemx_roce_atomic_fetch_andTint32, uint32, int64, uint64950aclshmemx_roce_atomic_fetch_orTint32, uint32, int64, uint64950aclshmemx_roce_atomic_fetch_xorTint32, uint32, int64, uint64950aclshmemx_roce_atomic_compare_swapT32/64 位整数950aclshmemx_roce_atomic_swapT32/64 位整数950以上接口在返回前内部调用aclshmemx_roce_quiet调用者无需额外同步。3.2 异步接口无返回值需调用者 quiet接口完整名返回值支持类型硬件平台aclshmemx_roce_atomic_setvoid32/64 位整数950aclshmemx_roce_atomic_addvoid32/64 位整数950aclshmemx_roce_atomic_incvoid32/64 位整数950aclshmemx_roce_atomic_andvoidint32, uint32, int64, uint64950aclshmemx_roce_atomic_orvoidint32, uint32, int64, uint64950aclshmemx_roce_atomic_xorvoidint32, uint32, int64, uint64950以上接口仅发起操作即返回调用者必须在依赖结果前调用aclshmemx_roce_quiet(pe, buf, sync_id)。3.3 并发限制警告使用 RDMA 作为底层传输时不支持对同一 PE 的并发 RMA/AMO 操作。请使用device_state.rdma_config中的sync_id进行流水线同步该约束在 shmem_device_rdma.h 与标准接口头文件 shmem_device_amo.h 的同步模型中均有明确标注。四、标准接口aclshmem_type_atomic_op的同步语义与分派细节头文件include/device/gm2gm/shmem_device_amo.h 实现文件src/device/gm2gm/shmem_device_amo.hpp标准接口的同步性由返回值决定这一点在头文件的 “Atomic Interface Synchronization Model” 段落中被明确定义带返回值fetch_add、fetch_inc、fetch_and、fetch_or、fetch_xor、fetch、swap、compare_swap同步接口调用返回即完成调用者无需额外同步无返回值add、inc、and、or、xor、set异步接口返回时操作可能尚未完成调用者必须显式同步RDMA 用aclshmemx_roce_quietMTE 按数据依赖插SetFlag/WaitFlag。标准 AMO 接口会将用户传入的dst、dest或source交给aclshmem_ptr(..., pe)换算为指定 PE 上的目标地址因此这些参数必须指向对称内存。该要求来自标准接口的地址换算方式并不表示 MTE 引擎本身只能访问对称内存传输层自动分派不会改变这一接口语义。4.1 同步接口带返回值函数内部完成同步后才返回调用者无需额外同步。接口完整名以 int32 为例返回值MTE 路径同步方式RDMA 路径同步方式aclshmem_int32_atomic_fetch_addint32_taclshmemx_mte_atomic_fetch_addPipeBarrierPIPE_ALLaclshmemx_roce_atomic_fetch_add内部 quietaclshmem_int32_atomic_fetch_incint32_taclshmemx_mte_atomic_fetch_incPipeBarrierPIPE_ALLaclshmemx_roce_atomic_fetch_inc内部 quietaclshmem_int32_atomic_fetch_andint32_t✗ 不支持 MTEaclshmemx_roce_atomic_fetch_and内部 quietaclshmem_int32_atomic_fetch_orint32_t✗ 不支持 MTEaclshmemx_roce_atomic_fetch_or内部 quietaclshmem_int32_atomic_fetch_xorint32_t✗ 不支持 MTEaclshmemx_roce_atomic_fetch_xor内部 quietaclshmem_int32_atomic_fetchint32_taclshmemx_mte_atomic_fetchPipeBarrierPIPE_ALLaclshmemx_roce_atomic_fetch内部 quietaclshmem_uint32_atomic_swapuint32_taclshmemx_mte_atomic_swapPipeBarrierPIPE_ALLaclshmemx_roce_atomic_swap内部 quietaclshmem_uint32_atomic_compare_swapuint32_taclshmemx_mte_atomic_compare_swapPipeBarrierPIPE_ALLaclshmemx_roce_atomic_compare_swap内部 quietMTE 路径上的PipeBarrierPIPE_ALL在标准接口实现中直接可见例如aclshmem_##NAME##_atomic_fetch_add在 MTE 分支中先调用aclshmemx_mte_atomic_fetch_add随后执行AscendC::PipeBarrierPIPE_ALL()再返回见 shmem_device_amo.hpp这与 MTE 后端裸接口的“纯异步”形成了鲜明对比。4.2 异步接口不带返回值必须显式同步接口完整名以 int32 为例返回值MTE 路径RDMA 路径调用者必须的同步aclshmem_int32_atomic_addvoidaclshmemx_mte_atomic_add异步aclshmemx_roce_atomic_add异步MTE: SetFlag/WaitFlag按需RDMA:aclshmemx_roce_quietaclshmem_int32_atomic_incvoidaclshmemx_mte_atomic_inc异步aclshmemx_roce_atomic_inc异步MTE: SetFlag/WaitFlag按需RDMA:aclshmemx_roce_quietaclshmem_int32_atomic_andvoid✗ 不支持 MTEaclshmemx_roce_atomic_and异步RDMA:aclshmemx_roce_quietaclshmem_int32_atomic_orvoid✗ 不支持 MTEaclshmemx_roce_atomic_or异步RDMA:aclshmemx_roce_quietaclshmem_int32_atomic_xorvoid✗ 不支持 MTEaclshmemx_roce_atomic_xor异步RDMA:aclshmemx_roce_quietaclshmem_uint32_atomic_setvoidaclshmemx_mte_atomic_set异步aclshmemx_roce_atomic_set异步MTE: SetFlag/WaitFlag按需RDMA:aclshmemx_roce_quietatomic_add的 MTE 路径同步细节按数据类型分两条路径参见本文「二、2.3」节。值得注意的还有一处实现细节atomic_add/atomic_inc/atomic_set/atomic_swap/atomic_compare_swap等标准接口对int32、int64、float类型存在CAST 变体由宏ACLSHMEM_TYPE_FUNC_ATOMIC_SWAP_CAST、ACLSHMEM_TYPE_FUNC_ATOMIC_CAS_CAST生成实现中先把dst/cond/value按位 reinterpret_cast 到对应的无符号整数类型int32→uint32、int64→uint64、float→uint32再下发到底层返回前再按位转回原类型见 shmem_device_amo.hpp。五、同步规则速查MTE 与 RDMA 通路使用 aclshmem_type_atomic_op 接口 │ ├── fetch_add / fetch_inc / fetch_and / fetch_or / fetch_xor / fetch / swap / compare_swap │ └── 同步接口带返回值调用返回即完成返回值可靠 │ MTE: fetch_add/fetch_inc/fetch/swap/compare_swap 有 PipeBarrier │ RDMA: 全部内部 quiet │ MTE 路径 PipeBarrier 已保证传输完成调用前如有其他单元写 UB 仍需 SetFlag/WaitFlag │ ├── add / inc / and / or / xor / set │ └── 异步接口不带返回值必须显式同步 │ RDMA: aclshmemx_roce_quiet(pe, buf, sync_id) │ MTE: 根据实际数据依赖插入 SetFlag/WaitFlagand/or/xor 不支持 MTE六、各标准接口支持的类型与硬件平台以下矩阵同时得到头文件 shmem_device_amo.h 中宏定义注释与实现文件分派逻辑的双重印证。实现层面还多出 UDMA 通路Ascend950但本文聚焦文档约定的 MTE 与 RDMA 两条通路。6.1aclshmem_type_atomic_add传输通路支持类型MTE 实现方式硬件平台MTEint8, int16, bf16, half, int32, floatUB MTE3A2/A3/950MTEuint32, uint64, int64Scalar AtomicAdd950RDMAint32, uint32, int64, uint64—9506.2aclshmem_type_atomic_fetch_add传输通路支持类型硬件平台MTEint32, uint32, uint64, int64, float950RDMAint32, uint32, int64, uint649506.3aclshmem_type_atomic_inc传输通路支持类型硬件平台MTEint32, uint32, uint64, int64950RDMAint32, uint32, int64, uint64, float9506.4aclshmem_type_atomic_fetch_inc传输通路支持类型硬件平台MTEint32, uint32, uint64, int64, float950RDMAint32, uint32, int64, uint649506.5 位运算系列atomic_and/or/xor及 fetch 变体传输通路支持类型硬件平台RDMAint32, uint32, int64, uint64950注意位运算接口不支持 MTE 通路对应源码分支中atomic_and/or/xor只有 ROCE 与 UDMA 两个传输分支MTE 分支缺失见 shmem_device_amo.hpp。6.6aclshmem_type_atomic_fetch传输通路支持类型硬件平台MTEuint32, uint64, int32, int64, float950RDMAuint32, uint64, int32, int64, float9506.7aclshmem_type_atomic_set传输通路支持类型硬件平台MTEuint32, uint64, int32, int64, float950RDMAuint32, uint64, int32, int64, float950CAST 变体ACLSHMEM_TYPE_FUNC_ATOMIC_SWAP_CASTint32→uint32、int64→uint64、float→uint32 通过类型转换实现。6.8aclshmem_type_atomic_swap传输通路支持类型硬件平台MTEuint32, uint64, int32, int64, float950RDMAuint32, uint64, int32, int64, float950CAST 变体同上。6.9aclshmem_type_atomic_compare_swap传输通路支持类型硬件平台MTEuint32, uint64, int32, int64950RDMAuint32, uint64, int32, int64950CAST 变体ACLSHMEM_TYPE_FUNC_ATOMIC_CAS_CASTint32→uint32、int64→uint64。七、跨 PCIe跨节点限制MTE 通路不支持跨 PCIe跨节点场景请使用 RDMA 通路。该限制在 shmem_device_amo.h 中各接口的note注释中反复出现如 atomic_add、atomic_fetch_add、atomic_inc、atomic_fetch、atomic_set、atomic_swap、atomic_compare_swap 的注释均写明 “MTE transport does not support cross-PCIe (inter-node) communication”与本文档结论一致。八、代码示例以下示例中的dst必须来自对称分配。Host 侧所有 PE 以相同大小集合调用分配接口并把返回地址传给执行 Device AMO 的 kernelvoid *symmetric_target aclshmem_malloc(sizeof(uint64_t)); // Pass symmetric_target to the kernel and use the typed pointer as dst.不能用aclrtMalloc分配的普通本地 GM 地址替代标准 AMO 的 target该限制来自远端地址换算而不是 MTE 或 RDMA 引擎对 GM 地址的固有限制。8.1 异步接口 RDMAaclshmem_int32_atomic_add// 异步 atomic addRDMA 通路 aclshmem_int32_atomic_add(dst, 42, pe); // ... 其他不依赖 dst 的计算 ... // 读取结果前必须 quiet aclshmemx_roce_quiet(pe, ub_buf, sync_id); // 现在可以安全使用 dst 的值 int32_t result *dst;8.2 同步接口aclshmem_int32_atomic_fetch_add// 同步接口调用返回即可直接使用返回值 int32_t old_val aclshmem_int32_atomic_fetch_add(dst, 42, pe); // old_val 是可靠的旧值无需额外 quiet8.3 MTE 路径 UB 复用aclshmem_int32_atomic_addUBMTE3 路径aclshmemx_set_mte_config(0, 256, sync_id); // fence MTE2 写 UB 完成如果 MTE2 之前写入了同一 UB 区域 SetFlagHardEvent::MTE2_S(sync_id); WaitFlagHardEvent::MTE2_S(sync_id); // 异步 atomic addScalar 写 UB → MTE3 读 UB → MTE3 写 GM aclshmem_int32_atomic_add(dst, 1, pe); // fence MTE3 写 GM 完成——后续需要读 GM 结果 SetFlagHardEvent::MTE3_MTE2(sync_id); WaitFlagHardEvent::MTE3_MTE2(sync_id); // fence MTE3 读 UB 完成——如果要复用 UB SetFlagHardEvent::MTE3_S(sync_id); WaitFlagHardEvent::MTE3_S(sync_id); // 现在可以安全读 GM 结果和复用 UB8.4 同步接口 MTE 路径aclshmem_int32_atomic_swap// atomic_swap 标准接口 MTE 路径已加 PipeBarrier返回即完成 int32_t old aclshmem_int32_atomic_swap(dst, new_val, pe); // old 是可靠的旧值无需额外同步 // 如果调用前有其他单元正在写同一 UB 区域仍需 SetFlag/WaitFlag SetFlagHardEvent::MTE2_S(sync_id); WaitFlagHardEvent::MTE2_S(sync_id);8.5 异步接口 RDMAaclshmem_int32_atomic_andRDMA 通路// atomic_and 不带返回值标准接口透传 roce_atomic_and异步 aclshmem_int32_atomic_and(dst, mask, pe); // 读取结果前必须 quiet aclshmemx_roce_quiet(pe, ub_buf, sync_id); // 现在可以安全读取 int32_t val *dst;8.6aclshmem_uint32_atomic_set需显式同步// atomic_set 底层为异步无论 MTE 还是 RDMA aclshmem_uint32_atomic_set(dst, 99, pe); // RDMA 通路需 quiet aclshmemx_roce_quiet(pe, ub_buf, sync_id); // 或 MTE 通路需按数据依赖插入 SetFlag/WaitFlag仓库中的单元测试可进一步佐证这些用法例如 tests/unittest/device/mem/atomic/ 目录下的atomic_arithmetic_kernel.cpp算术类 atomic 的 Device 侧用例、atomic_arithmetic_mte_kernel.cppMTE 通路、atomic_arithmetic_rdma_kernel.cppRDMA 通路、atomic_logic_kernel.cpp/atomic_logic_rdma_kernel.cpp位运算类、atomic_swap_kernel.cpp/atomic_swap_mte_kernel.cpp/atomic_swap_rdma_kernel.cppswap/cas 类以及 tests/unittest/host/mem/atomic/ 下对应的 Host 侧测试。九、函数名映射标准 SHMEM 风格的宏定义映射见 shmem_device_amo.h#define shmem_int8_atomic_add aclshmem_int8_atomic_add #define shmem_int16_atomic_add aclshmem_int16_atomic_add #define shmem_int32_atomic_add aclshmem_int32_atomic_add #define shmem_half_atomic_add aclshmem_half_atomic_add #define shmem_bfloat16_atomic_add aclshmem_bfloat16_atomic_add #define shmem_float_atomic_add aclshmem_float_atomic_add其他类型同理遵循shmem_type_atomic_op→aclshmem_type_atomic_op的映射规则。类型与接口的生成由一组类型宏驱动ACLSHMEM_TYPE_FUNC_ATOMIC_ADD、ACLSHMEM_TYPE_FUNC_ATOMIC_ADD_910、ACLSHMEM_TYPE_FUNC_ATOMIC_ADD_EXT、ACLSHMEM_TYPE_FUNC_ATOMIC_ADD_950、ACLSHMEM_TYPE_FUNC_ATOMIC_SWAP、ACLSHMEM_TYPE_FUNC_ATOMIC_SWAP_CAST、ACLSHMEM_TYPE_FUNC_ATOMIC_CAS_CAST、ACLSHMEM_TYPE_FUNC_ATOMIC_LOGIC每种宏对应一组固定类型与硬件平台组合这也是“哪些类型支持哪些接口”这一矩阵的直接来源。十、各接口层同步性总表MTE 后端aclshmemx_mte_atomic_op接口返回值同步性同步方式mte_atomic_fetchT异步需 SetFlag/WaitFlag 或aclshmemx_mte_quietmte_atomic_setvoid异步同上mte_atomic_swapT异步同上mte_atomic_compare_swapT异步同上mte_atomic_incvoid异步同上mte_atomic_addvoid异步同上按类型有两条路径见「2.3」节mte_atomic_fetch_incT异步同上mte_atomic_fetch_addT异步同上RDMA 后端aclshmemx_roce_atomic_op接口返回值同步性同步方式roce_atomic_fetchT同步内部roce_quietroce_atomic_fetch_addT同步内部roce_quietroce_atomic_fetch_incT同步内部roce_quietroce_atomic_fetch_andT同步内部roce_quietroce_atomic_fetch_orT同步内部roce_quietroce_atomic_fetch_xorT同步内部roce_quietroce_atomic_compare_swapT同步内部roce_quietroce_atomic_swapT同步内部roce_quietroce_atomic_setvoid异步需aclshmemx_roce_quietroce_atomic_addvoid异步需aclshmemx_roce_quietroce_atomic_incvoid异步需aclshmemx_roce_quietroce_atomic_andvoid异步需aclshmemx_roce_quietroce_atomic_orvoid异步需aclshmemx_roce_quietroce_atomic_xorvoid异步需aclshmemx_roce_quiet标准接口aclshmem_type_atomic_op接口返回值MTE 路径RDMA 路径调用者需同步atomic_fetch_addT同步PipeBarrier同步透传否atomic_fetch_incT同步PipeBarrier同步透传否atomic_fetchT同步PipeBarrier同步透传否atomic_fetch_andT✗ 不支持同步透传否atomic_fetch_orT✗ 不支持同步透传否atomic_fetch_xorT✗ 不支持同步透传否atomic_swapT同步PipeBarrier同步透传否atomic_compare_swapT同步PipeBarrier同步透传否atomic_andvoid✗ 不支持异步透传是atomic_orvoid✗ 不支持异步透传是atomic_xorvoid✗ 不支持异步透传是atomic_addvoid异步异步是atomic_incvoid异步异步是atomic_setvoid异步异步是十一、源码参考层级头文件实现文件标准接口声明include/device/gm2gm/shmem_device_amo.h—标准接口实现—src/device/gm2gm/shmem_device_amo.hppMTE 后端接口include/device/gm2gm/engine/shmem_device_mte.hsrc/device/gm2gm/engine/shmem_device_mte.hppRDMA 后端接口include/device/gm2gm/engine/shmem_device_rdma.hsrc/device/gm2gm/engine/shmem_device_rdma.hpp结语写 Device AMO 代码前先回答三个问题我调的是哪一层接口裸后端接口aclshmemx_mte_*/aclshmemx_roce_*默认异步标准接口aclshmem_type_atomic_op则“看返回值定同步性”。我走的哪条通路MTE 只支持片内/无跨 PCIe 场景且位运算不可用RDMA 支持跨节点但不支持对同一 PE 的并发 RMA/AMO且所有参数必须指向对称内存。我的数据依赖在哪里读 GM 结果、复用 UB、调用前其他单元写 UB——每个依赖点都有对应的SetFlag/WaitFlag事件MTE2_S/MTE3_MTE2/MTE3_S或aclshmemx_roce_quiet。把这三件事在编码前理清就能完全避免“少一次 quiet / 少一对 fence”带来的数据竞争问题。【免费下载链接】shmemCANN SHMEM 是面向昇腾平台的多机多卡内存通信库基于OpenSHMEM 标准协议实现跨设备的高效内存访问与数据同步。项目地址: https://gitcode.com/cann/shmem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表