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 #ID2.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