[AI][昇腾950]核间同步原理介绍
·
DaVinci 950 跨核同步性能提升深度分析
第1章: 硬件同步机制
1.1 FFTS (Fast Fine-Grained Task Scheduler) 架构
D950 引入了片内专用同步硬件 FFTS,实现零总线延迟的跨核同步:
┌─────────────────────────────────────────────────────────────────────┐
│ D950 SoC │
│ │
│ ┌─ Block 0 ──────┐ ┌─ Block 1 ──────┐ ┌─ Block M-1 ────┐ │
│ │ CubeCore │ │ CubeCore │ │ CubeCore │ │
│ │ VecCore (×2) │ │ VecCore (×2) │ │ VecCore (×2) │ │
│ └────┬────────────┘ └────┬────────────┘ └────┬───────────┘ │
│ │ │ │ │
│ │ SET_CROSS_CORE │ SET_CROSS_CORE │ │
│ └──────────────────────┼──────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ FFTS │ │
│ │ (片内专用同步硬件) │ │
│ │ │ │
│ │ flag_id 0: counter │ │
│ │ flag_id 1: counter │ │
│ │ ... │ │
│ │ flag_id 15: counter │ │
│ │ │ │
│ │ 每核每ID: │ │
│ │ 4-bit counter (0~15)│ │
│ │ 收集逻辑 (Mode 0~3) │ │
│ │ 自动唤醒机制 │ │
│ └──────────────────────┘ │
│ │ │
│ WAIT_FLAG_DEV │ WAIT_FLAG_DEV │
│ ┌──────────────────────┼──────────────────────┐ │
│ ▼ ▼ ▼ │
│ Core 0 唤醒 Core 1 唤醒 Core M-1 唤醒 │
└─────────────────────────────────────────────────────────────────────┘
1.2 SET_CROSS_CORE 指令
SET_CROSS_CORE.pipe Xt // Xt[11:8] = flag_id, Xt[5:4] = sync_mode
| 特征 | 说明 |
|---|---|
| 延迟 | ~1-2 cycle (写片内 FFTS 计数器) |
| 阻塞 | 非阻塞 (发出即继续执行) |
| 可用管线 | M, MTE1, MTE2, F (不可 S) |
| 目标 | FFTS 硬件计数器 (不经过 GM/系统总线) |
Xt 编码:
Xt[63:0]:
┌──────────────────────┬───────┬───────┐
│ ... 忽略 ... │ flag │ mode │
│ │ ID │ │
│ │[11:8] │ [5:4] │
└──────────────────────┴───────┴───────┘
flag_id: 0~15 (4-bit, 最大计数 15, 不可溢出)
sync_mode: 见下节
1.3 四种同步模式
Mode 0 (Inter-Block): 所有 M 个 Block 互相同步
┌──── Block 0 ────┐ ┌──── Block 1 ────┐
│ Core A │ │ Core B │
│ SET ─────────→ │ │ SET ─────────→ │
│ FFTS ←─┼────┤──→ FFTS │
│ counter│ │ counter │
│ += 2 │ │ += 2 │
│ WAIT ←─────── │ │ WAIT ←─────── │
│ (到齐, 继续) │ │ (到齐, 继续) │
└─────────────────┘ └─────────────────┘
Mode 1 (Inter-SubBlock): 同组 N 个 SubBlock 间同步
┌── Block X ──┐
│ SB0 ↘ │
│ SB1 FFTS │
│ ... ↙ │
│ SBN-1 │
└─────────────┘
Mode 2 (Intra-Block): 单 Block 内 Block↔SubBlock 同步
┌── Block X ──┐
│ Block ↕ │
│ SB0..N │
└─────────────┘
Mode 3 (Unicast Block): SubBlock→Block 单播 (不等收集)
SB ──→ FFTS ──→ Block (立即转发, 不等其他 SB)
| Mode | Xt[5:4] | 名称 | 粒度 | 收集逻辑 |
|---|---|---|---|---|
| 0 | 2’b00 | Inter-Block | 跨 Block | 所有 Block SET 到齐后才递增 |
| 1 | 2’b01 | Inter-SubBlock | Block 组内 | 同组 SubBlock 全部 SET |
| 2 | 2’b10 | Intra-Block | Block 内部 | Block↔SubBlock 双向 |
| 3 | 2’b11 | Unicast Block | 单播 | 1 个 SET 即递增, 不等收集 |
1.4 WAIT_FLAG_DEV 指令
WAIT_FLAG_DEV.pipe Xt // 寄存器版本
WAIT_FLAG_DEVI.pipe #uimm8 // 立即数版本
| 特征 | 说明 |
|---|---|
| 行为 | 阻塞等待 FFTS 对应 flag_id 的 counter > 0 |
| 唤醒 | 硬件自动唤醒 (counter > 0 时) |
| 计数器操作 | 唤醒后 counter -= 1 (自动消耗) |
| 可用管线 | S, M, MTE1, MTE2, F (全管线!) |
1.5 D950 同步时序
D950 跨核 Barrier 时序 (4 核 Inter-Block, flag_id=5):
T=0 Core A: SET_CROSS_CORE.M X10 // 1 cycle, 非阻塞!
T=0 Core A: 继续做其他计算... // 不等!
T=5 Core B: SET_CROSS_CORE.M X10 // 1 cycle
T=5 Core B: 继续做其他计算...
T=10 Core C: SET_CROSS_CORE.M X10 // 1 cycle
T=15 Core D: SET_CROSS_CORE.M X10 // 1 cycle
FFTS: counter[5] = 4 = M (到齐!)
T=15 Core A: WAIT_FLAG_DEVI.M 0x50 // counter=4>0 → 立即返回!
Core A: counter[5] -= 1 → 3
T=15 Core B: WAIT_FLAG_DEVI.M 0x50 // counter=3>0 → 立即返回!
Core B: counter[5] -= 1 → 2
T=15 Core C: WAIT_FLAG_DEVI.M 0x50 // counter=2>0 → 立即返回!
Core C: counter[5] -= 1 → 1
T=15 Core D: WAIT_FLAG_DEVI.M 0x50 // counter=1>0 → 立即返回!
Core D: counter[5] -= 1 → 0
总同步延迟: ~1 cycle (WAIT 命中时)
第2章:SET_INTRA_BLOCK — Mix-Mode 核内同步
2.1 用途
Mix-Mode Block (1 CubeCore + 1~2 VecCore) 内 CubeCore↔VecCore 的轻量同步。
SET_INTRA_BLOCKI.pipe #ID // ID: 0~15
WAIT_INTRA_BLOCKI.pipe #ID
2.2 机制
CubeCore (Block X) VecCore (Block X)
┌───────────────────┐ ┌───────────────────┐
│ │ │ │
│ SET_INTRA_BLOCK │── ID 3 ─→│ counter[3] += 1 │
│ (CubeCore 的 │ │ (VecCore 的 ID 3 │
│ counter 由 │ │ counter 由 │
│ VecCore SET │ │ CubeCore SET │
│ 来递增) │ │ 来递增) │
│ │←─ ID 3 ──│ SET_INTRA_BLOCK │
│ counter[3] += 1 │ │ │
│ │ │ │
│ WAIT_INTRA_BLOCK │ │ WAIT_INTRA_BLOCK │
│ (counter>0 → -1) │ │ (counter>0 → -1) │
└───────────────────┘ └───────────────────┘
延迟: ~1-2 cycle (片内互连, 不出 Block)
第3章:根因总结
3.1 D950 性能提升的 4 个硬件根因
┌────────────────────────────────────────────────────────────────────┐
│ D950 跨核同步性能提升的硬件根因 │
├────────────────────────────────────────────────────────────────────┤
│ │
│ Root Cause 1: 专用硬件 vs 通用总线 │
│ ───────────────────────────────────── │
│ V220: ATOM/RED 走系统总线 → 延迟不可控 (50-200 cyc) │
│ D950: FFTS 片内计数器 → 固定 1-2 cycle │
│ 本质: 同步从"内存事务"变成"寄存器写" │
│ │
│ Root Cause 2: 事件驱动 vs 轮询驱动 │
│ ───────────────────────────────────── │
│ V220: LD + CMP + JUMP 循环轮询 → 延迟×次数, 空转Core │
│ D950: WAIT 硬件阻塞, counter>0 自动唤醒 → 零空转 │
│ 本质: 从"问有没有"变成"等通知" │
│ │
│ Root Cause 3: 全管线可用 vs 仅 S 管线 │
│ ───────────────────────────────────── │
│ V220: ATOM/CMP/JUMP 全在 S 管线 → 其他管线空闲 │
│ D950: SET/WAIT 可在 M/MTE1/MTE2/F/S 执行 → 与计算并行 │
│ 本质: 同步不阻塞计算管线 │
│ │
│ Root Cause 4: O(N) 可扩展性 │
│ ───────────────────────────────────── │
│ V220: N 核 = N×ATOM + O(N²) poll (总线竞争恶化) │
│ D950: N 核 = N×SET + N×WAIT = O(N), 硬件并行收集 │
│ 本质: FFTS 收集逻辑是硬件并行的, 不增加延迟 │
│ │
└────────────────────────────────────────────────────────────────────┘
3.2 硬件代价
D950 为此付出的硬件成本:
| 资源 | 代价 |
|---|---|
| FFTS 计数器 | 每核 16 个 flag_id × 4-bit counter × 4 种 mode = 小面积 |
| 片内互连 | Core↔FFTS 专用路径, 不复用系统总线 |
| SET/WAIT 指令 | ISA 编码空间 + 各管线解码逻辑 |
| 全管线支持 | M/MTE1/MTE2/F/S 都需 SET/WAIT 接口 |
这些代价相对于性能提升(100-200x 同步延迟降低)是极低成本的投入。
3.3 SPR 配置(内部实现)
FFTS_BASE_ADDR 必须在首次 SET_CROSS_CORE 前配置:
CubeCore: SPR.FFTS_BASE_ADDR = 0x0002_1B00_0008 + ONLY_COREID × 0x20000
VecCore: SPR.FFTS_BASE_ADDR = 0x0002_1B01_0008 + ONLY_COREID × 0x20000
配置示例:
MOV_SPR2X X0, ONLY_COREID
MOVI X1, 0x0002
SHLI X2, X0, 17
OR X3, X1, X2
ADDI X3, X3, 0x1B000008
MOV_X2SPR X3, FFTS_BASE_ADDR
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)