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

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐