AI 芯片架构启示录:从英伟达 CUDA 与 SIMT 生态反观 DSA 架构的流水编排、分支预测与交互设计
发布时间:2026/10/2 8:07:01来源:尧图网络
文档教程人工智能【免费下载链接】AISystemAISystem 主要是指AI系统包括AI芯片、AI编译器、AI推理和训练框架等AI全栈底层技术项目地址https://gitcode.com/GitHub_Trending/ai/AISystem点击查看免费下载从软件与硬件协同的视角重新审视英伟达生态CUDA 的易用性、SIMT 的执行模型与 DSADomain-specific Architecture特定领域架构的激进指令设计之间存在深刻的张力CUDA 用 SIMT 硬件掩盖了流水编排、并行指令隐藏等核心难题而 DSA 芯片TPU、NPU 等则在编程模型与硬件执行模型上仍处于早期阶段。本文基于 AISystem 项目 07Thought 系列 中 05DSA.md 的核心脉络从流水编排、SIMT 前端、分支预测机制、host/device 交互方式四个维度展开剖析并结合仓库内 cuda1.cu、cuda2.cu、cuda3.cu 等示例代码帮助读者理解为什么 CUDA 能成为 SIMT 最成功的实践DSA 架构又该从英伟达生态中借鉴哪些关键设计从而构建开放、易用、有竞争力的 AI 芯片软硬件体系。英伟达生态的思考点CUDA 与 SIMT、DSA 的三角关系从软件和硬件架构的角度出发CUDA 和 SIMT 之间存在紧密的绑定关系而目前 AI 芯片采用的 DSA 架构在编程模型和硬件执行模型上还处于较为早期的状态。英伟达强大的生态同样离不开 CUDA 在编程方面的易用性CUDA 正是通过 SIMT 硬件架构掩盖了流水编排、并行指令隐藏以及自身易用性这三个核心难题。面对新的 AI 芯片在流水隐藏方面实现一个架构层面上的隐藏流水编排机制、提出一个形式上与 SPMD 没有关系的编程模式、并且易用性堪比 CUDA 的软件在理论上是可能的。但反过来如果核心问题没有解决即使提出形式上与 CUDA 类似的编程模型也仍然会存在易用性问题——开发者很难获得一个足够好的初始性能。换句话说易用性不是长得像 CUDA就能获得的而是需要硬件执行模型对流水编排、访存延迟等底层痛点提供隐式支持。在软硬件架构层面对于 DSA 架构而言存在两个关键方向建立一套开放的软硬件架构联合其他 DSA 架构一起对抗 CUDA 生态明确面向不同层级开发者的易用性和软件开发形态让不同水平的开发者都能快速上手并获得可观的性能。SIMT 与 CUDA 的关系生态对硬件架构的约束英伟达为了维护 CUDA 生态对 SIMT 硬件架构做出了调整和取舍因此 CUDA 会在一定程度上约束英伟达的硬件架构例如保留 SM、Warp、Thread 等线程分层概念。CUDA 架构在近几年没有做出重大改变主要是维护编程体系软件对外的抽象和易用性——这种软件生态反向约束硬件演进的现象正是软硬件协同设计hardware-software co-design的典型体现。与之形成对比的是DSA 之所以在硬件架构的指令和设计上比较激进并非因为其软件体系做得好而是因为在刚开始并没有太多地考虑编程体系的问题自然也就没有为了实现软硬件协同而带来的架构约束。CUDA 的成功之处恰恰在于通过 SIMT 架构掩盖了流水编排、并行指令隐藏以及 CUDA 的易用性这三件事。DSA 硬件架构执行方式单核单线程与多核共享 CacheDSA 硬件架构一般是指单核单线程线程内指令可以通过多核共享 Cache 协作。编程模型上缺乏统一的标准因此需要专门搭建编译器和编程体系硬件主要以 AI 加速芯片TPU、NPU 等为主。关于 DSA 的硬件执行方式其裸接口bare interface一般是每个核一个线程每个线程内串行调用 DSA 指令集指令在硬件上通常会分发到不同的指令执行流水线上正确性部分靠软件同步实现部分靠硬件保证。这意味着指令流水的隐藏与编排需要开发者手工完成如手工掩盖、切块 Tiling 等优化缺乏统一编程标准每个 DSA 芯片都需要配套专属编译器与编程体系与 CUDA 的开箱即用的初始性能相比DSA 开发者要写出正确且高性能的 Kernel需要付出更多时间。CUDA 客户能力区分易用性的三个层级按照使用 CUDA 的难易程度可以将 CUDA 的使用用户分为三类初阶、中阶和高阶用户每一层级对应不同的性能收益路径初阶用户掌握 CUDA 并行编程能力了解 NVIDIA SIMT 硬件基础架构可以拿到并行指令、流水掩盖、并行计算三部分性能。这是 CUDA 易用性的根基——入门开发者无需理解微架构细节即可获得远超 CPU 的峰值性能。中阶用户进一步运用 CUDA 提供的切块 Tiling、流水 Pipeline 能力进一步获取更高的性能收益。这类用户开始利用共享内存、块级并行、流水线重叠等手段。高阶用户深入了解 SIMT 微架构细节解决线程 bank 冲突、精细化流水掩盖、精细化指令使用、极致的切块 Tiling 策略从而实现极致性能。这类用户已经进入用尽硬件每一分资源的领域。CUDA 在开发方面具有很好的易用性。以矩阵加法为例以下是使用 CPU 编写的串行版本对应仓库示例 cuda2.cuvoid add_matrix(float* a, float* b, float* c, int N) { int index; for (int j 0; j N; j) { for (int i 0; i N; i) { index i j * N; // row-major c[index] a[index] b[index]; } } } int main() { add_matrix(a, b, c, N); }以下是使用 GPU 编写的矩阵加法运算对应仓库示例 cuda3.cu。与 CPU 编程相比因为使用的是并行计算所以没有 for 循环__global__ void add_matrix(float* a, float* b, float* c, int N) { // Calculate the global indices int i blockIdx.x * blockDim.x threadIdx.x; int j blockIdx.y * blockDim.y threadIdx.y; int index i j * N; // Check if the indices are within bounds if (i N j N) { // Perform matrix addition c[index] a[index] b[index]; } } int main() { dim3 dimBlock(blocksize, blocksize); // Calculate the grid size dim3 dimGrid((N dimBlock.x - 1) / dimBlock.x, (N dimBlock.y - 1) / dimBlock.y); // Launch the Kernel add_matrixdimGrid, dimBlock(a, b, c, N); }两段代码的对比非常直观CPU 版本通过双重 for 循环逐元素计算GPU 版本则把每个 (i, j) 元素映射为独立的线程通过blockIdx、blockDim、threadIdx三级索引定位全局坐标由硬件调度并行执行。结合优秀的硬件架构和软件生态英伟达 GPU 和 CUDA 是 SIMT 最成功的实践。借鉴与思考点一流水编排——SIMD Data Path 的核心难题在指令流水线编排方面最重要的事情是从硬件设计上解决 SIMD data path 流水编排问题。程序执行最大的瓶颈是访存和控制流单线程 CPU 需要大量资源进行分支预测、超前执行、缓存、预取等机制来缓解访存和控制流遇到的瓶颈SIMD 往往依赖 CPU 自身乱序、投机、缓存和预取等能力来缓解英伟达 GPU 则是依靠多线程交错执行提升整体并行计算的性能大量的线程通过不同的 block 和不同的线程读取数据和执行计算指令。上图展示了 CUDA 架构下并行计算的线程索引逻辑N 个线程块Thread Block 0 ~ N-1中每个线程依据全局索引i blockIdx.x * blockDim.x threadIdx.x并行执行C[i] A[i] B[i]通过大量线程交错访存与计算来掩盖流水阻塞。这里有一个关键结论即使在 DSA 上为 SIMD 硬件封装了 SIMT 前端如果遇到执行指令有依赖基础性能也会非常差流水编排仍然需要开发者动手。想写出开箱即用、性能较优的代码同样很难。也就是说SIMT 前端可以改善表达但不能替代硬件层面的流水隐藏能力。借鉴与思考点二SIMT 前端硬件——用 Warp 掩盖指令流水增加了 SIMT 前端硬件可以通过线程组 Warp 隐藏线程指令流水。在 CUDA 编程模型中每一个线程块thread block内部需要有很多并行线程隐式分成了若干个 Warp每个 Warp 包含串行交错的访存和计算。GPU 通过Warp Scheduler动态交错执行如果一组 Warp0 流水阻塞就会切到下一个 Warp1隐式通过 Warp 的并行掩盖指令流水阻塞因此开发者可以得到较好的性能。如上图所示Warp 0~5 被调度到 Load、Multiply、Add 等不同功能单元上通过多 Warp 重叠调度掩盖计算单元的访存、运算等阻塞开销——这正是 SIMT 隐式隐藏流水延迟的核心机制。更完整的机制可参考 04NVSIMT.md 中对细粒度多线程Fine-Grained Multi-ThreadingFGMT与 Warp Scheduler 的讲解。DSA 硬件架构同样可以引入 Warp Scheduler 进行指令流水掩盖让每个 DSA 核执行多个线程相互掩盖流水线阻塞。但需要注意英伟达 GPU 使用 Warp 来掩盖指令流水是基于运行时的具体信息而开发者和编译器只能基于静态信息进行流水编排很难做到足够均衡。这也是 SIMD/DSA 在进行手工或编译器自动流水编排时相对困难的原因——资深开发者也很难把流水编排得足够好。增加 SIMT 前端硬件同样会带来开销但是可以实现流水阻塞掩盖。其核心价值在于通过 SIMT 表达将接口暴露给用户让用户主动写多线程Warp Scheduler 在硬件层面实现多线程相互掩盖流水阻塞SIMD 指令掩盖可以通过 SIMT 表达实现用户写通用单线程同时 Warp 分组组成 SIMD 指令。如上图所示SIMT 前端包含取指Fetch、I-Cache、译码Decode、指令缓存I-Buffer、记分板Score Board、Warp 栈SIMT-Stack等组件后端连接 ALU 与访存单元正是单指令流广播给多个线程的硬件基础可对照 02SIMTSIMD.md 中 SIMT 核心流水线的三个调度循环。但要注意CUDA 并没有解决 DSA 指令掩盖问题目前只是通过给开发者一个 Warp 概念、透传指令 API 来解决表达和使用的问题。因此 CUDA 的上手门槛并不低——需要在前期充分了解英伟达 GPU 的硬件细节。借鉴与思考点三分支预测机制——SPMD 的高容错与 Warp 级分支处理SPMD 编程模型对分支预测和控制流的高容忍度是支撑易用性的重要手段。减少分支和连续访存是软件层面、易用性方面需要关注的优化点。当然在 SIMD 的硬件上同样可以通过Predicate/mask、gather/scatter 指令和 memory coalescing内存合并来实现通过编译器实现分支预测从而让开发者无感。但是在 SIMD 线程数量有限的情况下性能的提升可能会是个难题。英伟达 GPU 可以使线程在 Warp-base SIMD 上执行不同的分支每个线程都可以执行带条件控制流指令Conditional Control Flow Instructions同时不同线程间可以分别执行不同的控制流路径Different Control Flow Paths比如分别执行不同的 Thread W、Thread X 和 Thread Y 控制流执行路径。如上图所示左侧是单线程的控制流分支结构右侧展示了 Warp 内由多个同 PC 的 Scalar 线程组成线程执行路径的映射每个线程都可以沿自己的条件分支路径独立执行。但是 SIMT 的控制流仍然存在很多问题因此不推荐在 CUDA 编程中出现大量的 if/else 语句。通常使用 SIMD 流水线来节省控制逻辑上的面积例如将 Scalar 线程放在 Warps 里面。当 Warp 内部的线程分支到不同的执行路径时就会发生分支执行冲突branch divergence当存在 Path 1 和 Path 2 两个分支路径时可以让不同时间执行不同的路径但是这样会增加时耗。如上图所示分支后部分线程选择 Path 1、部分线程选择 Path 2Warp 内线程执行路径不一致导致同一 Warp 需要分时执行不同路径出现执行冲突与资源浪费。为了解决分支预测的问题硬件与编译器层面发展出了三类动态机制动态 Warp Formation/Merging动态 Warp 合并在分支后动态合并执行相同指令的线程从正在等待的 Warps 中形成新的 Warps分支下每条路径的线程用于创建新的 Warp。例如可以将 Warp X 和 Warp Y 合并为 Warp Z从而更好地执行相同指令。动态分支合并Dynamic Branch Merging当存在 Path 1 和 Path 2 两条路径的时候由于某些时钟周期为空因此在动态合并分支之后执行相同指令的线程以便同时执行不同的代码路径从而避免线程之间的等待和资源浪费。动态 Warp 分组Dynamic Warp Formation更多是在编译器层面解决分支预测的问题根据线程执行情况和数据依赖性动态组织 Warp 中的线程以提高并行计算性能和资源利用率优化 GPU 计算提高程序的执行效率。如上图所示传统 Baseline 执行流将分支后的路径拆分为多组执行单元而动态 Warp Formation 优化执行流将不同 Warp 的同路径线程重新组合为新 Warp如 D 节点的绿色新 Warp通过动态合并分支后零散的线程提升 Warp 执行的利用率。这组机制是 SIMT 架构解决分支开销、提高并行计算能力的核心手段。借鉴与思考点四交互方式——host/device 便利性与易用性红利CUDA 可以提供 hostCPU和 deviceGPU之间便利的交互方式。值得强调的是CUDA 中有很多实现机制与 SIMT、SIMD、DSA 的硬件架构本身并没有太多关系CUDA 中的所有特性也不是 SIMT 架构独有的——因此不存在技术上选择 SIMT、SIMD、DSA 与硬件强行绑定等问题。比如 CUDA Runtime 提供 host 和 device 的 C 交互方式寒武纪 BANG C 语言在这个层面就参考了 CUDA。在软件层面的交互上CUDA 可以很容易地实现向量加法对应仓库示例 cuda1.cu 中的串行版本for (int i 0; i 10000; i) { C[i] A[i] B[i]; }而同样的向量加法CUDA 版本通过显式的内存管理与核函数启动完成 host/device 交互#include stdio.h // 定义向量大小 #define N 5 // CUDA 核函数用于执行向量加法 __global__ void vectorAdd(int *a, int *b, int *c) { int i blockIdx.x * blockDim.x threadIdx.x;; if (i N) { c[i] a[i] b[i]; } } int main() { int a[N], b[N], c[N]; int *d_a, *d_b, *d_c; // 在设备上分配内存 cudaMalloc((void**)d_a, N * sizeof(int)); cudaMalloc((void**)d_b, N * sizeof(int)); cudaMalloc((void**)d_c, N * sizeof(int)); // 初始化向量 a 和 b for (int i 0; i N; i) { a[i] i; b[i] N - i; } // 将向量 a 和 b 复制到设备 cudaMemcpy(d_a, a, N * sizeof(int), cudaMemcpyHostToDevice); cudaMemcpy(d_b, b, N * sizeof(int), cudaMemcpyHostToDevice); // 调用 CUDA 核函数 vectorAdd1, N(d_a, d_b, d_c); // 将结果从设备复制回主机 cudaMemcpy(c, d_c, N * sizeof(int), cudaMemcpyDeviceToHost); // 打印结果 for (int i 0; i N; i) { printf(%d , c[i]); } printf(\n); // 释放设备上的内存 cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); return 0; }从这段代码可以看到 CUDA 交互方式的完整闭环cudaMalloc分配设备内存 →cudaMemcpyHostToDevice传输输入 →grid, block启动核函数 →cudaMemcpyDeviceToHost回传结果 →cudaFree释放资源。这种标准化的内存管理与 Kernel 启动语法构成了 host/device 交互的模板也是后续 DSA 芯片如寒武纪 BANG C在设计上层编程语言时参考的蓝本。CUDA 同时具有编程开发的易用性对初阶用户而言CUDA 的易用性是极致的入门开发者任意写一个简单的算子Kernel就能够获得比 CPU 高 5~10 倍的峰值性能。这背后的原因正是 SIMT 硬件对流水编排的隐式支持。而 DSA 硬件架构由于在流水和指令使用上缺乏完备、隐式的支持指令流水的支持需要开发者通过手工掩盖、切块等其他优化思想补齐这部分性能使用底层指令则会让用户在写出正确的 Kernel 时花费更多的时间。小结与思考DSA 架构的借鉴清单综合前文四个维度的分析从英伟达 CUDA 生态中可以提炼出以下关键思考点作为 DSA 芯片软硬件设计的借鉴清单编程体系是生态的护城河DSA 架构在编程模型和硬件执行模型上还不够成熟需要构建开放的软硬件架构和易用的开发环境来吸引开发者并与 CUDA 生态竞争。英伟达通过 CUDA 对硬件架构形成反向约束这一生态反哺硬件的模式值得 DSA 阵营学习。分层易用性设计CUDA 提供了从初级到高级不同层次的易用性通过简化的编程模型和高效的线程管理机制使得不同水平的开发者都能在 GPU 上实现高性能计算。初阶用户获得 5~10 倍于 CPU 的峰值性能中阶用户通过 Tiling/Pipeline 进一步提升高阶用户通过微架构调优逼近极致性能。SIMT 前端的价值与代价增加了 SIMT 前端硬件通过线程组 Warp 隐藏线程指令流水SIMD 使用户只需要实现单线程但是需要在前期充分了解 GPU 的硬件架构。SIMT 前端能解决表达与使用问题但掩盖不了 DSA 指令依赖导致的流水编排难题。分支处理是并行效率的关键在分支预测方面通过动态 Warp 合并、动态分支合并和动态 Warp 分组使得 GPU 并行计算能力大大提高。同时要认识到分支发散branch divergence的成本编程层面应尽量避免大量 if/else。交互方式与硬件解耦host/device 交互方式如 CUDA Runtime、内存管理 API与 SIMT/SIMD/DSA 硬件并不强行绑定这部分软件层能力可以直接被 DSA 芯片借鉴寒武纪 BANG C 即为一例。对于 AI 芯片设计者而言DSA 架构的激进指令设计是一把双刃剑一方面摆脱了软硬件协同的历史包袱可以更自由地针对 AI 计算优化另一方面流水编排、分支预测、交互易用性这些看不见的工程正是 CUDA 生态数十年积累的核心壁垒。如何在保持 DSA 专业性的同时补齐易用性短板是本系列06AIChip.md、05DSA.md持续探讨的主题也是构建下一代 AI 芯片软硬件生态的关键命题。赞分享文档教程人工智能【免费下载链接】AISystemAISystem 主要是指AI系统包括AI芯片、AI编译器、AI推理和训练框架等AI全栈底层技术项目地址https://gitcode.com/GitHub_Trending/ai/AISystem点击查看免费下载相关推荐Meteor accounts-weibo 包完全指南接入新浪微博 OAuth 登录Meteor accounts weibo 包完全指南接入新浪微博 OAuth 登录 accounts weibo 是 Meteor JavaScript 应文档教程人工智能Apache Spark Structured Streaming 集成 Apache Kafka 0.10 完整指南从读取写入到部署安全Apache Spark Structured Streaming 集成 Apache Kafka 0.10 完整指南从读取写入到部署安全 本指南以 Apa文档教程人工智能Reloader架构设计组件划分与交互流程Reloader架构设计组件划分与交互流程 Reloader作为Kubernetes生态中的配置更新控制器解决了ConfigMap/Secret变更后自动触云原生运维上一篇HsMod插件炉石传说玩家的终极效率优化神器下一篇Cursor试用限制终极解决方案一键重置设备标识技术指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网