[AI][昇腾950]MixCore 最高效同步
·
SetIntraBlock 实现原理与应用
1. 概述
SetIntraBlock / WaitIntraBlock 是 昇腾950 架构中专为 Mix-Mode Block(1 个 CubeCore + 1~2 个 VecCore)设计的轻量级核内同步机制,用于 CubeCore 与 VecCore 之间的高效协作同步。
昇腾950 架构同步层级
Level 5: SoC 全局同步 (WFE/SEV)
Level 4: 跨 Block 同步 (SetCrossCore / WaitFlagDev)
Level 3: Block 内同步 ← SetIntraBlock / WaitIntraBlock (本文)
Level 2: 管线间 Buffer 同步 (GetBuf / RlsBuf) [昇腾950, 新增加,建议使用]
Level 1: 管线间事件同步 (SetFlag / WaitFlag) [昇腾950, 建议废弃不用]
Level 0: 存储屏障 (DSB / DCCI)
2. 实现原理
2.1 硬件机制
每个 Mix-Mode Block 内维护 两组 4-bit 计数器(CubeCore 端和 VecCore 端各 16 个),核心原理为:
- SET 端:写入方将对方计数器递增(counter[id] += 1)
- WAIT 端:读取方检查自身计数器,若 > 0 则减 1 并通过;若 = 0 则阻塞等待
关键特性:SET 递增的是对方的 counter,而非自身的。
CubeCore (Block X) VecCore (Block X)
┌───────────────────┐ ┌───────────────────┐
│ │ │ │
│ SetIntraBlock ├── ID 3 ──→│ counter[3] += 1 │
│ (CubeCore 的 │ │ (VecCore 的 ID 3 │
│ counter 由 │ │ counter 由 │
│ VecCore SET │ │ CubeCore SET │
│ 来递增) │ │ 来递增) │
│ │←─ ID 3 ───┤ SetIntraBlock │
│ counter[3] += 1 │ │ │
│ │ │ │
│ WaitIntraBlock │ │ WaitIntraBlock │
│ (若 counter[3]=0 │ │ (若 counter[3]=0 │
│ 阻塞, 否则 -1) │ │ 阻塞, 否则 -1) │
│ │ │ │
└───────────────────┘ └───────────────────┘
2.2 ID 映射规则
| 属性 | 值 |
|---|---|
| ID 范围 | 0~15(CubeCore 端 16 个,VecCore 端 16 个) |
| 计数器宽度 | 4-bit |
| 最大计数值 | 15(不可溢出) |
| 映射关系 | VecCore SET ID 0~15 → CubeCore counter 0~15;反之亦然 |
2.3 指令格式
汇编级(底层指令)
// 寄存器版本
SET_INTRA_BLOCK.pipe Xt // Xt[4:0] = sync_id
WAIT_INTRA_BLOCK.pipe Xt
// 立即数版本
SET_INTRA_BLOCKI.pipe #ID // ID: 0~15
WAIT_INTRA_BLOCKI.pipe #ID
其中 .pipe 为管线后缀:S(标量)、M(矩阵)、V(向量)、MTE1/MTE2(搬运)、F(FixPipe)。
C++ API
inline void set_intra_block(pipe_t pipe, uint8_t flag_id) {}
inline void wait_intra_block(pipe_t pipe, uint8_t flag_id) {}
2.4 延迟
| 路径 | 延迟 |
|---|---|
| SetIntraBlock(SET 端) | ~1-2 cycle |
| WaitIntraBlock(WAIT 端,计数器 > 0) | ~1 cycle |
| 片内互连总延迟 | ~1-2 cycle(不出 Block) |
3. 管线可用性
| 指令 | S | M | MTE1 | MTE2 | F |
|---|---|---|---|---|---|
| SetIntraBlock / WaitIntraBlock | Y | Y | Y | Y | Y |
所有管线均可用,不受限制。
4. 约束与注意事项
| 约束 | 说明 |
|---|---|
| 仅 Mix-Mode Block | 只在 CubeCore + VecCore 组成的 Mix-Mode Block 中可用 |
| 计数器不可溢出 | 4-bit 计数器最大值 15,溢出将导致异常 |
| SET/WAIT 成对使用 | 每次 SET 必须有对应的 WAIT |
| 同 ID 单管线等待 | 同一个 ID 不可被多条管线同时等待 |
| 无 DSB 开销 | 不涉及 DCache 操作,无需 DSB/DCCI |
5. 应用场景
5.1 CubeCore↔VecCore 流水线协作
最典型的场景:CubeCore 完成矩阵计算后通知 VecCore 开始向量后处理,VecCore 完成后再通知 CubeCore。
// ============================================================
// CubeCore 侧 (.M 管线)
// ============================================================
GET_BUFI.M 0, 0 // 获取 L0A buf
// ... MMAD 指令 ...
RLS_BUFI.M 0, 0 // 释放 L0A buf
SET_INTRA_BLOCKI.M 0 // sync_id=0, 递增 VecCore 的 counter
WAIT_INTRA_BLOCKI.M 0 // 等待 VecCore 的 SET (counter > 0)
// CubeCore 继续下一步...
// ============================================================
// VecCore 侧 (.V 管线)
// ============================================================
WAIT_INTRA_BLOCKI.V 0 // 等待 CubeCore 的 SET
// ... 向量指令 ...
SET_INTRA_BLOCKI.V 0 // sync_id=0, 递增 CubeCore 的 counter
// VecCore 继续下一步...
5.2 单 ID 并发同步
在需要多阶段流水线时,可使用不同的 sync_id 实现并行通知:
// CubeCore 使用 ID 0 通知阶段1完成,ID 1 通知阶段2完成
SET_INTRA_BLOCKI.M 0 // 通知阶段1
// ... 继续 ...
SET_INTRA_BLOCKI.M 0 // 通知阶段2
// VecCore 分别等待两个阶段
WAIT_INTRA_BLOCKI.V 0 // 等待阶段1
// ... 阶段1处理 ...
WAIT_INTRA_BLOCKI.V 0 // 等待阶段2
5.3 循环使用
一定要注意 连续16次以上的 set_intra_block,
- 要么业务上,保证 16次的set_intra_block 内,必然消费,使得计数不超 16
- 要么算法上,通过 反向同步,等待
// CubeCore
for(int i=0; i< 32; i++){
copy_l0c_to_ub( ub_addr, l0c_buff,....);
set_intra_block( pipe_fixpipe, 0); //通知 aiv0 [id 的范围 0-15]
set_intra_block( pipe_fixpipe, 16); //通知 aiv1
if( i == 16) {
wait_intra_block( pipe_mte2, 0); //让aiv0 消费
wait_intra_block( pipe_mte2, 16); //让aiv0 消费
}
}
//VecCore AIV0, AIV1 都执
for(int i=0; i< 32; i++){
//等待L0C 的数据到 UB, 然后Vector 计算
wait_intra_block( pipe_v, 0); //aiv1 此时为0, 不是 16,
vecOp( ub_addr );
if( i == 16) {
set_intra_block( pipe_v, 0); ///aiv1 此时为0, 不是 16; 对应cube 为 16
}
}
6. 性能优势总结
| 特性 | V220 (旧架构) | 昇腾950 (新架构) |
|---|---|---|
| CubeCore↔VecCore 同步方式 | SSBUF 写入 | SetIntraBlock 原子计数器 |
| 单次同步延迟 | ~100+ cycle | ~8 cycle |
| 是否需要 DSB | 必需 | 不需要 |
| 是否需要 DCCI 失效 | 必需 | 不需要 |
| 提升 | — | 50~100 倍 |
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐
所有评论(0)