尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

[AI][昇腾950]SIMT 编程

[AI][昇腾950]SIMT 编程
📅 发布时间:2026/6/29 18:44:44

DaVinci 950 SIMT 编程介绍

1. 概述

DaVinci 950 VecCore(AIV)支持两种向量执行模式:

模式全称编程范式
SIMDSingle Instruction Multiple Data一条指令操作整条向量寄存器(VL宽)
SIMTSingle Instruction Multiple ThreadsCUDA风格的细粒度线程并行

SIMT 模式通过FORK指令从 SIMD 模式切换进入,提供与 CUDA 高度相似的编程模型,适合不规则并行、分支密集的算法。


2. 硬件线程模型

2.1 线程层次

┌─────────────────────────────────────────────────────────┐ │ VecCore (AIV) │ │ │ │ ┌─ Thread Block ─────────────────────────────────────┐ │ │ │ 2048 threads maximum per core │ │ │ │ │ │ │ │ ┌─ Warp 0 ──┐ ┌─ Warp 1 ──┐ ┌─ Warp 63┐ │ │ │ │ │ 32 threads │ │ 32 threads │ ... │ 32 thrd │ │ │ │ │ └────────────┘ └────────────┘ └─────────┘ │ │ │ │ │ │ │ │ Shared Memory: UB 分区 │ │ │ │ Register File: 128KB │ │ │ └────────────────────────────────────────────────────┘ │ │ │ │ 4 Warp Schedulers · DCache (32-128KB) │ └─────────────────────────────────────────────────────────┘

2.2 关键参数

参数值
最大线程数/Core2048
Warp 大小32 threads
最大 Warp 数64
Warp 调度器4 个
寄存器文件128 KB
DCache32-128 KB(可编程)
Divergence Stack126 entries/warp
共享内存UB 分区

2.3 线程索引

每个 SIMT 线程拥有唯一的三维索引(thread_x, thread_y, thread_z),类似 CUDA 的threadIdx:

维度来源说明
thread_x[11:0]X 维度线程数
thread_y[27:16]Y 维度线程数
thread_z[11:0]Z 维度线程数

Warp 内线程按(z, y, x)的行优先顺序排列,每个线程获得 1-based 的 thread_id。


3. 进入 SIMT 模式

void simt_code(void* gmAddr, __ubuf__ int* ubAddr, int scalarValue){ .... } VF_CALL<simt_code>( Dim3(1024,1,1), gmAddr=0x1234, ubAddr=0x12, scalarValue=10);

4. SIMT 寄存器模型

4.1 寄存器分配

每个线程拥有独立的寄存器视图:

┌─────────────────────────────────────────┐ │ 128 KB Register File │ │ │ │ Thread 0: R0 R1 R2 ... R(N-1) │ │ Thread 1: R0 R1 R2 ... R(N-1) │ │ ... │ │ Thread T: R0 R1 R2 ... R(N-1) │ │ │ │ N = reg_per_thread (from Sm[23:16]) │ │ T = thread_x × thread_y × thread_z │ │ Constraint: N × T ≤ Total regs │ └─────────────────────────────────────────┘

4.2 S 寄存器

范围属性说明
S0-S63Read-Only所有线程共享,由 Parameter Buffer 传入
S64-S95Read-Write辅助标量寄存器,SIMT 模式下硬件管理

S0 是常量零,S1 是 16’h0。S60-S63 作为循环计数器自动清零。


5. 内存访问

5.1 内存层次

区域指令带宽用途
Global Memory (GM/OUT)VLD/VST经 DCache外部 DDR/HBM
Shared Memory (UB)VLDS/VSTS128B/cycle线程块内共享
Register (VREG)寄存器操作最快线程私有

5.2 共享内存 (Shared Memory)

共享内存由 UB(Unified Buffer)分区提供:

  • 所有同一 Thread Block 的线程共享同一块 UB 区域
  • 通过VLDS/VSTS指令访问
  • 32B 对齐,Bank 交织设计
  • 需MEMBAR栅栏保证写入可见性

5.3 DCache

  • 大小可编程:32KB - 128KB
  • Cache Line:128B
  • 2-way 组相联
  • 写回策略
  • 跨 Warp 共享

6. 同步机制

6.1 Thread Block Barrier

┌─────────┐ ┌─────────┐ ┌─────────┐ │ Warp 0 │ │ Warp 1 │ │ Warp N │ │ arriving│ │ arriving│ │ arriving│ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └──────────────┼──────────────┘ ▼ ┌─────────────────────┐ │ Thread Block │ │ Barrier │ │ (all warps arrive) │ └─────────┬───────────┘ ▼ All warps resume
  • 所有 Warp 到达 barrier 后才能继续执行
  • 保证 barrier 之前的内存操作对所有线程可见
  • 类似 CUDA 的__syncthreads()

6.2 MEMBAR (Memory Fence)

MEMBAR.{scope}
  • 保证 fence 之前的内存访问在 fence 之后的内存访问之前完成
  • Scope:thread/block/core 级别
  • 用于确保共享内存写入对其他 Warp 可见

6.3 Divergence Stack

  • 每 Warp 126 个 entry
  • 处理同一 Warp 内线程分支
  • 类似 CUDA 的 SIMT 执行模型:分支时 mask 掉不活跃线程, divergence stack 记录返回点
Warp (32 threads): if (thread_id < 16) { // Path A: threads 0-15 active, 16-31 masked ... } else { // Path B: threads 16-31 active, 0-15 masked ... } // Reconvergence: all 32 threads active again

7. 编程模式 — 与 CUDA 对照

7.1 概念映射

CUDADaVinci 950 SIMT
threadIdx.x/y/z
blockDim.x/y/z
__global__ void kernel(...)软件封装出的模式
__shared__ float s[256]UB 分区,通过 VLDS/VSTS 访问
__syncthreads()Thread Block Barrier
__threadfence()MEMBAR

7.2 执行流程对比

// Host 端kernel<<<grid,block,shared_mem>>>(args);// Device 端__global__voidkernel(float*in,float*out){inttid=threadIdx.x+blockIdx.x*blockDim.x;out[tid]=in[tid]*2.0f;}

DaVinci 950 SIMT 内部实现:

; SIMD 阶段:准备参数 SMOV S2, 0x00000080 ; thread_x = 128, thread_y = 1 SMOV S4, 0x00080001 ; thread_z = 1, reg_per_thread = 8 ; S6 = input buffer address ; S8 = output buffer address FORK S2, S4, 16, 1 ; === SIMT 阶段开始 === ; 每线程获取自己的 tid ; thread_id 可通过 SPR 获取 ; 加载输入 VLD V0, [S6], A0, #normal ; 从 Global Memory 加载 ; 计算 VMUL V1, V0, S_alpha ; 乘以 2.0(标量广播) ; 存储结果 VST V1, [S8], A0, #norm_b32 ; 写回 Global Memory ; 结束 END ; === SIMD 恢复 (PC + St - 4) === ; 继续 SIMD 执行 SEND

8. SIMT 指令子集

8.1 算术指令

SIMT 模式下大部分 SIMD 算术指令可用,但每个线程操作独立的数据元素:

类别指令类型
加减VADD, VSUBu8/s8/u16/s16/u32/s32/f16/f32/bf16
乘法VMUL, VMULAu16/s16/u32/s32/f16/f32/bf16
乘加VFMA, VFMS, VFNMA, VFNMSf16/f32/bf16
比较VCMP (EQ/NE/LT/GT/GE/LE)all int + f16/f32/bf16
最大最小VMAX, VMIN全类型
标量-向量VADDS, VMULS, VMAXS, VMINS全类型
激活函数VRELU, VLRELU, VPRELUf16/f32
数学函数VEXP, VLN, VSQRTf16/f32
类型转换VCVTFF, VCVTFI, VCVTII多种格式

8.2 数据搬移

指令源 → 目的说明
VLDGM → VREG全局内存加载(经 DCache)
VSTVREG → GM全局内存存储
VLDSUB → VREG共享内存加载(S 寄存器偏移)
VSTSVREG → UB共享内存存储
VLDIGM → VREG立即偏移加载
VSTIVREG → GM立即偏移存储
VGATHER2GM → VREG间接索引加载
VSCATTERVREG → GM间接索引存储

8.3 控制流

机制说明
分支Warp 级 SIMT 分支,divergence stack 管理
BarrierThread Block 同步屏障
MEMBAR内存栅栏,保证可见性
ENDSIMT 线程结束

9. 性能优化指南

9.1 Warp 调度优化

策略说明
Warp 级并行保持 ≥4 个活跃 Warp,隐藏延迟
减少 Divergence尽量让同一 Warp 的线程走相同路径
连续访存相邻线程访问连续地址,合并为单次事务
寄存器平衡更多线程 vs 更多寄存器/线程的取舍

9.2 共享内存优化

策略说明
Bank 感知避免 Warp 内多线程访问同一 Bank
Padding在数组维度间插入 padding 避免 Bank 冲突
Double BufferPing-pong 读写隐藏延迟
Barrier 最小化减少 barrier 次数,增加每个 phase 的计算量

9.3 DCache 优化

策略说明
空间局部性连续地址访问充分利用 128B cache line
时间局部性重用已缓存数据,减少 GM 访问
预取在计算当前数据时加载下一批数据

9.4 计算强度优化

Arithmetic Intensity = FLOPs / Bytes_Transferred 推荐: 计算访存比 ≥ 1:1 FP16 优先: 吞吐量是 FP32 的 2 倍 FP8/HiF8: 推理场景可达 4 倍吞吐 FMA 链: 一次融合乘加 = 2 FLOP,减少中间舍入

10. 约束清单

#约束说明
1最大 2048 线程/Core
2每线程寄存器数必须是 2 的幂
3总寄存器不能超限
4Warp 内 SIMT 执行32 线程 lock-step,分支导致 mask
5Divergence stack 126 entries深度嵌套分支可能溢出
6Barrier 必须成对所有 Warp 必须到达同一 barrier
7DCache 128B 对齐Cache line 对齐获得最佳性能
8无精确异常OOO 执行,异常时标记当前周期范围
9GM 访问经 DCache使用 MEMBAR 保证一致性

11. SIMD vs SIMT 选择指南

场景推荐模式原因
规则数据并行(矩阵乘、卷积)SIMDVLOOPv2 + VREG 高效批量处理
规则归约SIMDVCGMAX → VCMAX 两阶段归约
不规则并行(稀疏、图)SIMT线程独立索引,灵活分支
条件密集计算SIMT分支 + mask 自然处理
需要共享内存协作SIMTThread block barrier 原生支持
简单元素级操作SIMD单条向量指令覆盖全部数据
小计算量 kernelSIMDSIMT 启动开销不值得

相关新闻

  • AI驱动测试:技术路径、工具链与落地实践全解析
  • 解决毕业论文起步难问题:gradpaper 的全流程辅助模式太实用了
  • 从零搭建Metasploitable2靶机:深入理解漏洞原理与安全加固实践

最新新闻

  • ChatGPT Plus 支付失败后,为什么不建议连续重试?
  • [特殊字符]别把PLM当摆设!汽配/芯片厂选对系统,研发周期砍半!-全星研发项目管理APQP软件系统PLM系统 #汽车零部件 #芯片电子 #新能源研发 #数字化转型
  • 降AIGC工具红黑榜:亲测3款热门工具,揭露降AI真实效果与隐藏坑点,文末附攻略
  • 终极指南:如何使用Fan Control彻底解决Windows电脑风扇噪音问题
  • 实战:调用聚合API平台获取实时电影票房数据
  • SolidWorks 2026下载安装教程(附安装包)2026最新版三维CAD设计软件

日新闻

  • ENVI5.3.1实战:基于Landsat 8影像的区域无缝镶嵌与精准裁剪
  • 3步完成HS2-HF Patch安装:新手快速打造完美HoneySelect2体验
  • 微信好友检测终极指南:3分钟发现谁已悄悄删除你

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号