第一章原子操作总览1.1 四种原子操作类别指令总线地址空间返回旧值用途ATOM系统总线Global Memory (OUT)Xt跨核共享内存原子操作RED系统总线Global Memory (OUT)无跨核共享内存归约 (不回读)1.2 原子操作通用特性原子操作 Read → Modify → Write (不可分割) 内存地址: ┌───────────┐ │ 原始值 V │ └─────┬─────┘ │ Read (读取旧值) ↓ ┌─────────────────┐ │ Compute (计算) │ ← 不可被中断 │ V_new V op X │ └────────┬────────┘ │ Write (写回新值) ↓ ┌───────────┐ │ 新值 V_new│ └───────────┘1.3 流水线与约束属性ATOM/REDATOM_HSCB/RED_HSCB流水线Pipe SPipe SDCache旁路N/ACache 一致性需 DCCI DSB不涉及 DCCI地址隔离cacheable/non-cacheable 需 4KB—第二章ATOM — 全局内存原子操作2.1 指令语法ATOM.op.type Xm, [Xn], Xt参数说明.op操作类型: cas / exch / add / min / max / casp.type数据类型: u32 / s32 / u64 / s64Xm操作数寄存器 (.cas 时同时为比较值和返回目标)[Xn]目标地址寄存器 (地址 Xn × 8)Xt.cas: 条件写入值; 其他: 返回旧值2.2 操作类型与支持矩阵u32s32u64s64说明.cas✅—✅—Compare-And-Swap.exch✅—✅—原子交换.add✅✅✅✅原子加.min✅✅✅✅原子最小值.max✅✅✅✅原子最大值第三章ATOM 各操作详细语义3.1 .cas — Compare-And-Swap功能比较内存值与预期值相等则写入新值始终返回旧值。// 伪代码size(.typeu32||.types32)?32:64;addrXn;tmpMem[addrsize-1:addr];// 读取当前值cmpdataXm[size-1:0];// 预期值swpdataXt[size-1:0];// 欲写入值Mem[addrsize-1:addr](cmpdatatmp)?swpdata:tmp;// 相等写新值, 否则不变Xmzeroext(tmp);// 返回旧值到 Xm图解内存 [addr]: 42 Xm (期望值): 42 Xt (写入值): 99 执行: 42 42 ? → YES → Mem[addr] 99 Xm 42 (旧值) ───────────────────────────────────── 内存 [addr]: 42 Xm (期望值): 10 Xt (写入值): 99 执行: 42 10 ? → NO → Mem[addr] 42 (不变) Xm 42 (旧值, 可以判断 CAS 是否成功)支持类型: u32, u64典型功能: 实现多线程可使用的锁3.2 .exch — 原子交换功能将 Xm 写入内存返回内存中的旧值到 Xt。tmpMem[addrsize-1:addr];Xtzeroext(tmp);// 返回旧值到 XtMem[addrsize-1:addr]Xm[size-1:0];// 写入 Xm图解内存 [addr]: 100 Xm: 200 执行后: Xt 100 (旧值) Mem[addr] 200 (新值)支持类型: u32, u643.3 .add — 原子加图解内存 [addr]: 100 Xm: 50 执行后: Xt 100 (旧值) Mem[addr] 150 (100 50)支持类型: u32, s32, u64, s64典型用途: 计数器、累加器、Barrier3.4 .min — 原子最小值功能取内存值与 Xm 的最小值写回返回旧值到 Xt。图解内存 [addr]: 100 (s32) Xm: 80 执行后: Xt 100 (旧值) Mem[addr] 80 (min(100, 80)) ───────────────────────────────────── 内存 [addr]: 50 (s32) Xm: 80 执行后: Xt 50 (旧值) Mem[addr] 50 (min(50, 80)) 值不变支持类型: u32, s32, u64, s64典型用途: 全局最小值追踪、Loss 监控3.5 .max — 原子最大值功能取内存值与 Xm 的最大值写回返回旧值到 Xt。图解内存 [addr]: 100 (s32) Xm: 150 执行后: Xt 100 (旧值) Mem[addr] 150 (max(100, 150))支持类型: u32, s32, u64, s64典型用途: 全局最大值追踪、进度标记第四章RED — 全局内存归约操作4.1 指令语法RED.op.type [Xn], Xm参数说明.op操作类型: add / min / max.type数据类型: u32 / s32 / f16 / bf16 / f32[Xn]目标地址寄存器 (*Xn 表示内存地址)Xm操作数寄存器4.2 操作类型与支持矩阵u32s32f16bf16f32说明.add✅✅✅✅✅归约加.min✅✅✅✅✅归约最小值.max✅✅✅✅✅归约最大值4.3 语义*Xn*Xn op Xm;// 直接在目标地址上归约, 不返回旧值4.4 ATOM 与 RED 的区别属性ATOMRED返回旧值✅ (Xt)❌支持浮点❌✅ (f16/bf16/f32)操作种类cas/exch/add/min/maxadd/min/max典型用途锁、计数器、需回读场景纯归约、累加、无需回读第五章Cache 一致性与原子操作因为 atomic 会 bypass 掉 DCache ; 不会 bypass L2Cache 受Ctrl 寄存器的 hint 位控制 一定要注意 DCCI 与 Atomic 之间的影响Scalar 写 gm 数据会在DCacheLine 缓存 通过 st_dev 指令不会在 cacheline 缓存 Atomic 写 gm 数据 Bypss DCacheLine 缓存 若要一致需要调用dcci5.1 为什么需要 Cache 维护问题: 核 A Cache: │ 100 │ ← 缓存了旧值 └──┬──┘ │ ATOM.add → 直接写 Global Memory │ (旁路 Cache) Global Memory: │ 150 │ ← 新值 └──────┘ 核 B Cache: │ 100 │ ← 缓存了旧值 (未更新!) └──────┘ 解决方案: DCCI DSB5.2 正确的 Cache 维护模式// // 原子操作前: 确保看到最新数据 // pre_atomic: DCCI X0, 1, OUT // 清理并无效化所有 OUT 相关 cache DSB DDR // 等待清理完成 // 现在读取将直接从 Global Memory 获取最新值 ATOM.add.u32 Xm, [Xn], Xt // // 原子操作后: 确保其他核可见 // post_atomic: DSB DDR // 等待原子操作完成 // 其他核通过 SET_CROSS_CORE 通知或 DSB 确认5.3 特性示意同步需求推荐指令组合方式互斥锁ATOM.cas自旋 CAS公平锁ATOM.add LDTicket Lock计数器ATOM.add直接累加BarrierATOM.add LD SET_CROSS_CORE计数同步AllReduce 整数RED.add / ATOM.add多核归约有确定性风险AllReduce 浮点RED.add (f16/f32)多核浮点归约有确定性风险全局最大值RED.max / ATOM.max追踪极值全局最小值RED.min / ATOM.min追踪极值生产者-消费者ATOM.add LD DSB计数读写屏障