当前位置: 首页 > news >正文

[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
inlinevoidset_intra_block(pipe_t pipe,uint8_tflag_id){}inlinevoidwait_intra_block(pipe_t pipe,uint8_tflag_id){}

2.4 延迟

路径延迟
SetIntraBlock(SET 端)~1-2 cycle
WaitIntraBlock(WAIT 端,计数器 > 0)~1 cycle
片内互连总延迟~1-2 cycle(不出 Block)

3. 管线可用性

指令SMMTE1MTE2F
SetIntraBlock / WaitIntraBlockYYYYY

所有管线均可用,不受限制。


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 倍
http://www.jsqmd.com/news/1112219/

相关文章:

  • 2026免费图片去水印工具推荐!无广告在线网站、电脑软件、手机APP汇总
  • 3步搞定缠论自动化分析:通达信插件终极安装指南
  • ComfyUI Flux插件:多Lora模型混合加载与优化指南
  • HoRain云--C++预处理器核心机制与最佳实践
  • 从0到上线仅4小时:某跨国企业用ChatGPT+本地ASR搭建会议纪要流水线(吞吐量200+场/日,错误率<0.8%)
  • Python 自动化之文件批量整理——重命名、分类归档、清理重复
  • Ollama本地大模型部署指南:从安装到应用实战
  • 5分钟快速上手:原神抽卡记录导出与数据分析终极指南
  • 终极指南:如何使用TradSimpChinese插件快速实现Calibre繁简中文转换
  • MC6470与PIC18F87J50组合在嵌入式系统中的应用
  • 【BUG已解决】macOS zsh: command not found: python 解决方案
  • Unlock-Music:3种方式解锁加密音乐,让音乐真正属于你
  • AI海报设计新范式:Agent驱动图层分离技术实现可编辑生成
  • Windows 10终极优化指南:一键清理系统臃肿,释放电脑真正性能!
  • Web渗透测试学习路线:从零基础到实战的完整指南
  • AI Berkshire:多Agent协作的价值投资框架,让AI成为你的专业投研团队
  • 数据密集型 MCP Server:PostgreSQL 慢查询分析与自动调优
  • MAX9744与PIC18F86J16音频功率放大方案详解
  • 数字逃避行为识别与PTSD早期干预系统设计
  • AI专著撰写秘籍!AI写专著工具助力,快速生成20万字专著且格式规范!
  • AI Agent的实时感知与决策:流式处理与事件驱动架构
  • 上次骂了DeepSeekV4Flash,今天发现Pro的智商也一样
  • 如何用AI控制Figma:5大智能设计协作功能详解
  • HSTracker:macOS炉石传说智能辅助工具终极指南
  • Java毕业设计-基于 SpringBoot 的个性化课程推荐系统的设计与实现 基于 SpringBoot 的个性化教学信息推荐平台(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • Appium移动端自动化测试:从核心原理到实战案例完整指南
  • Simple Runtime Window Editor:免费工具终极指南,如何突破游戏窗口限制
  • 终极指南:使用yuzu模拟器在PC上畅玩Switch游戏的完整教程
  • 端侧 AI 推理部署:操作系统边界决定产品体验
  • 解锁B站缓存视频:m4s-converter技术实践指南