GPGPU? NPU?

起因是在知乎 @yahah 评论区 [1] 问一嘴 “GPGPU NPU 定义的边界是什么?” 有说是编程模型的、有说是应用场景的、有说是历史原因的…… 看完评论区,唯一可确定结论是 GPGPU / NPU 之间并不存在明晰的定义边界。

这个结论颇有意思,大家在用 NPU 这个术语讨论的时候想要强调的出发点并不一致。出现这个原因来自从 GPU 或 GPGPU 本身定义便不够清晰,或者说 GPU 这个术语承接了图形计算和AI计算两种主要应用,内涵在不断扩大。

首先 NPU 是一个相对概念,就好比 GPU 之比 CPU,NPU 一定也是相比 GPU 而提的。从 CPU 到 GPU,他们二者应用也存在重叠,但并行计算在 GPU 上执行效率远远比 CPU 高,第一性来自两条定律, Amdahl's Law 核数量-单核性能-程序表现的关系,以及 Polloack's Rule 核数量-单核性能之间非线性关系。而当时并行计算最主要的应用便是图形处理,而事实上 GPU 中也包含了许多定制图形处理单元。此时提及 CPU-GPU 既包含硬件上控制流-计算并行度之间的 trade-off,也包含通用计算-图形计算应用领域的划分,二者语义在当时语境是统一的。

但随着 CUDA 暴露 GPU 编程接口,以及 AI 定制 GPU 逐渐砍掉图形单元添加 MAC 标志的 Tensor Core,图形计算的定义显然不适合,为了区分传统 GPU 又提出了 GPGPU 术语。同时一个 de facto 的事实是异 GPU 的计算卡有着明显不同的应用表现特性和生态特性,但砍掉图形内涵后剩下的高并行内涵又不足以区分 GPGPU 和 NPU ,因此需要为 GPGPU 赋于新的内涵。

现在看来,大致有三种出发点:

一种从应用角度出发,延续了 DSA 概念。 在并行计算里面继续划分子集,GPGPU 面对所有并行计算都有良好性能表现,而 NPU 仅仅针对 AI 应用,NPU 是在 GPGPU 基础上控制流、访存路径更加定制化,静态架构参数配比更加贴近 AI 应用。这一个出发点很难解释出 GPGPU/NPU 各方面的巨大差异。静态参数 GPGPU 肯定是往 AI 应用靠的,而控制流面积开销本身在并行计算中占小头,而添加 hierarchy 中直接访存路径仅仅是优化能耗,在性能上很难拉出差异。最终结论必然是 GPGPU 和 NPU 边界不断模糊;

一种是从软硬件角度开发,强调编程模型的重要性。 什么是编程模型?良好的编程性具备两个特点,一是实现相同的功能代码量少,二是代码执行清晰,减轻程序员根据代码推测底层运行表现的负担,或者说实现一个目标功能迭代的总代码量少。前者可以靠人力维护软件库生态实现,后者则需要一个良好的编程模型。比如反例相同的 C 代码 loop 靠编译器 auto-vectoring 自动控制 mapping 到 SIMD 单元或者 scalar 单元,程序员难以掌握代码执行,又或者 AI 软件栈输入一个 ONNX 全靠编译器编译部署。这样实践结论是很难单纯靠编译器发挥榨干硬件性能,往往需要在软件栈上缝缝补补引入各种 #pragma 原语显式提醒编译器。

这一个角度对 CPU-GPU 路线理解更加系统,强调 SIMT 编程模型对于 GPU 历史的地位,可以进一步补充早期 Intel 也在做 GPU,在远超 NVIDIA 的资源和 x86 生态优势下为何会落败的原因[2] [3]。不过编程模型是多层编译器+硬件共同抽象出来,并不和硬件强绑定,比如 AMD 介绍其 GPU 后端使用 SIMD,华为也有分享同一个 ISA 适用不同编程模型[4]

Homogeneous ISA

具体来说 SIMT 是什么编程模型呢?个人理解为两部分,一是对于并行计算表征,统一用唯一粒度 scalar/thread,由软件栈维护保证成 wrap ;二是对于多层 memory hierarchy,仍然保持 CPU 的 cache 设置 + 额外 RF 乱序执行 wrap scheduler 流水编排保证性能,多层访存对程序员隐藏。假设暴露给的程序员粒度种类数量是 \(G\),存储层次是 \(H\),那么编程复杂度是 \(O(G\times H)\)。可以说最理想的 SIMT 是 \(G=1\)\(H=1\) 的一种编程模型。Tensor core 引入了 tile-wise 的矩阵粒度,而 RF-shared memory-memory 三层访存指令则破坏了存储粒度。现在来看,编程模型上目前各方也逐渐趋同于支持重构多种范式的形态,这符合 8-2 定律的直觉,一个程序可能 20% 的部分却影响 80% 的关键性能,这部分需要充分暴露底层给程序员调优,80% 的部分只需要实现即可,用更为轻量的方式迭代,达成开发成本-性能的 trade-off。从这个角度来看 GPGPU 和 NPU 边界也是不断模糊[5]

此外注意 SIMT 并不等同 CUDA,CUDA 只是 SIMT 的一种实践,本身还加入许多耦合 NVIDIA 硬件的概念[6]。至于 SIMT 是否就是 AI 时代编程模型的最优解了呢?可以继续关注 triton / thunder kitten / cutile 等编程范式的发展。

一种是从历史出发,强调 NPU 定义的排 GPU 性。 GPGPU / NPU 的巨大整体差异是来自于历史依赖追赶问题,还是本质形态的差异?就干脆把 AI 应用里传统 NVIDIA / AMD 的产品叫做 GPU,以及延续可以兼容他们软件栈的新产品也叫做 GPU,自己另起生态不兼容的叫做 NPU。随着 AI 应用不断延申被更多投资人、用户等非专业人士所接触,这个定义最容易传播为大众所接受。

回答 GPGPU 和 NPU 定义问题实际也在刨析理解 GPU 成立的第一性到底是什么,是工程商业生态构建,是学术理论架构,还是二者并重?


  1. https://www.zhihu.com/question/1925252282942988983/answer/1926007999333393200?share_code=K4uf8TeG93KX&utm_psn=1926276022975825392 ↩︎

  2. https://pharr.org/matt/blog/2018/04/30/ispc-all ↩︎

  3. https://zhuanlan.zhihu.com/p/387269513 ↩︎

  4. https://www.chaspark.com/#/stw/media/720435943085228032?anchorV=727016028571004928&multi=zh ↩︎

  5. https://zhuanlan.zhihu.com/p/1929111271510353499 ↩︎

  6. https://zhuanlan.zhihu.com/p/1932462258400794329 ↩︎

posted @ 2025-07-09 15:19  DevilXXL  阅读(97)  评论(0)    收藏  举报