一、GPU计算模型概述:从图形渲染到通用计算的演进

各位同学好,我是这门课的主讲。今天咱们聊聊GPU计算模型的来龙去脉。说实话,我刚开始接触GPU时,它还是个纯粹的“画图工具”。谁能想到,十几年后它成了AI时代的算力引擎?

1.1 从图形渲染说起

GPU最初的设计目标很简单——把三角形画到屏幕上。你想想看,一个3D游戏场景里,可能有上百万个三角形。每个三角形都要经过坐标变换、光栅化、着色、纹理映射……这些操作有个共同特点:数据并行

什么意思呢?就是每个像素的计算逻辑几乎一样,只是输入数据不同。这天然适合大规模并行处理。我记得早期做图形驱动开发时,最头疼的就是如何把CPU端的串行逻辑映射到GPU的并行管线上去。

关键转折点:2006年,NVIDIA发布了CUDA架构。这标志着GPU从“专用图形芯片”向“通用并行处理器”的转变。说白了,GPU终于可以跑C语言写的程序了,不再局限于图形API。

1.2 SIMT执行模型:GPU的灵魂

GPU最核心的执行模型叫SIMT——单指令多线程。这个名字容易让人误解,我解释一下。

SIMD(单指令多数据)是CPU的向量化技术。比如Intel的AVX指令,一条指令可以同时处理8个32位浮点数。但问题是,程序员得手动写向量代码,或者指望编译器自动向量化——说实话,后者效果经常不理想。

SIMT就不一样了。GPU把32个线程捆成一个warp(NVIDIA叫法)或wavefront(AMD叫法)。这32个线程执行同一条指令,但处理各自的数据。程序员写的是标量代码,硬件自动帮你并行化。

特性 SIMD(CPU) SIMT(GPU)
编程模型 显式向量化 隐式标量编程
线程粒度 固定宽度(如8路) 可变(32线程/warp)
分支处理 需手动处理 硬件自动掩码
灵活性

这里有个坑,我当年就踩过。SIMT虽然看起来像多线程,但warp内的线程是锁步执行的。如果遇到分支,比如if-else语句,一半线程走if,另一半走else,那实际上两条路径都会执行,只是用掩码屏蔽掉不活跃的线程。这就是所谓的warp divergence(线程束分化)。

避坑指南:我曾经优化一个图像处理kernel,发现性能只有理论峰值的30%。排查了半天,罪魁祸首就是warp内分支太多。32个线程各走各的路,硬件不得不串行执行所有分支路径。解决办法?重新组织数据,让同一warp内的线程处理相似的数据,减少分支。

1.3 GPU作为协处理器

GPU在系统中的角色是协处理器。什么意思呢?它不能独立运行操作系统,也不能直接访问硬盘、网络等外设。所有任务都得CPU来“发号施令”。

典型的执行流程是这样的:

  1. CPU准备数据,拷贝到GPU显存
  2. CPU启动GPU kernel(内核函数)
  3. GPU并行执行,CPU可以干别的事
  4. GPU执行完毕,通知CPU取结果

这个模型有个明显的瓶颈——数据传输。PCIe带宽再快,也比不上显存带宽。我做过一个项目,数据量太大,光拷贝就占了总时间的60%。后来用了异步传输双缓冲技术,才把传输时间隐藏掉。

个人经验:我建议在设计算法时,尽量让计算密集度(计算量/数据量)高一些。比如矩阵乘法,计算量是O(N³),数据量是O(N²),N越大越划算。反之,像向量加法这种操作,计算量O(N),数据量O(N),基本被带宽限制死了。

1.4 GPU vs CPU:各司其职

很多人问我:“GPU能不能取代CPU?”我的回答是:不能,也不应该。

CPU擅长的是延迟优化——快速响应单个任务。它有复杂的乱序执行、分支预测、大容量缓存。GPU擅长的是吞吐优化——同时处理大量任务。它用大量简单核心换取并行度。

你想想看:

  • CPU像一辆法拉利,加速快,但只能坐两个人
  • GPU像一辆大巴车,加速慢,但能拉50个人

选哪个?看场景。如果是操作系统调度、数据库事务这种任务,CPU完胜。如果是图像渲染、深度学习训练、科学计算,GPU才是王道。

1.5 小结

这一章我们讲了:

  • GPU从图形渲染到通用计算的演进历程
  • SIMT执行模型的核心思想,以及它和SIMD的区别
  • GPU作为协处理器的角色定位和编程模型

下一章,我们会深入GPU的硬件架构,看看那些SM、CUDA Core、Tensor Core到底是怎么工作的。嗯,到时候我会分享一些调优的实战经验,保证让你少走弯路。


公众号:蓝海资料掘金营,微信deep3321