计算架构深度解析:SIMT vs SIMD vs 脉动阵列

各位同学,今天我们来聊聊芯片架构里最核心的一个话题——不同计算单元到底怎么选。说实话,我刚入行那会儿,也被SIMD、SIMT、脉动阵列这些术语搞得晕头转向。后来在几个AI芯片项目里摸爬滚打,才慢慢摸清了它们的脾气。

咱们今天不讲虚的,直接看矩阵乘法这个硬骨头。你想想看,一个典型的矩阵乘法,比如A×B=C,A是M×K,B是K×N。这活儿说白了就是一堆乘加操作。但怎么安排这些操作,不同架构的思路完全不一样。

核心观点:没有最好的架构,只有最合适的场景。矩阵乘法的适配性,取决于数据复用率、计算密度和访存带宽这三者的平衡。

SIMD:单指令多数据,老牌劲旅

SIMD,全称Single Instruction Multiple Data。我习惯叫它「一条指令管一堆数据」。CPU里的MMX、SSE、AVX,都是这个路子。

它的工作方式很简单:一个控制单元发出指令,多个处理单元同时执行。比如一条加法指令,可以同时算8个32位浮点数的加法。

对矩阵乘法的适配性:

  • 优点:实现简单,编译器支持好。你写个for循环,编译器自动给你向量化。我在做早期AI加速器原型时,就用AVX指令集快速验证过算法。
  • 缺点:数据必须连续对齐。矩阵乘法里,如果A的行和B的列在内存里不连续,你就得做数据重排。这个开销,有时候比计算本身还大。
  • 延迟影响:SIMD的延迟主要卡在访存上。计算单元跑得飞快,但数据喂不进去。我见过一个项目,计算利用率只有30%,剩下时间都在等数据。

我的经验:用SIMD做小矩阵(比如4×4、8×8)效果很好。但一旦矩阵变大,数据搬移的开销会吃掉所有性能收益。

SIMT:单指令多线程,GPU的看家本领

SIMT,Single Instruction Multiple Threads。NVIDIA的CUDA核心就是典型代表。很多人以为SIMT就是SIMD,其实不是。

SIMT的本质是:一条指令控制多个线程,每个线程有自己的寄存器、程序计数器。但执行时,这些线程被分组(warp/wavefront),组内线程执行同一条指令。

对矩阵乘法的适配性:

  • 优点:天然适合大规模并行。矩阵乘法里,每个输出元素可以分配给一个线程。我做过一个实验,用CUDA做1024×1024的矩阵乘法,比CPU快了两个数量级。
  • 缺点:分支发散是噩梦。如果矩阵乘法里有些元素需要特殊处理(比如稀疏矩阵),同一warp里的线程走不同分支,性能直接腰斩。
  • 延迟影响:SIMT通过大量线程隐藏访存延迟。一个线程等数据时,切换到另一个线程。但这也意味着,你需要足够的并行度才能填满计算单元。

避坑指南:我曾经在一个项目里,把矩阵分块太小,导致每个block的线程数不够。结果GPU利用率不到20%。后来把分块从16×16改成32×32,性能直接翻倍。

脉动阵列:为矩阵乘法而生

脉动阵列,Systolic Array。Google的TPU、华为的昇腾,都用这个架构。它的设计思路很纯粹:让数据像心跳一样,有节奏地在计算单元间流动。

一个典型的脉动阵列是二维网格。每个处理单元(PE)只做一件事:从左边拿数据,从上面拿数据,做乘加,结果往右边和下面传。

对矩阵乘法的适配性:

  • 优点:数据复用率极高。矩阵A的数据从左边流入,矩阵B的数据从上面流入。每个数据被多个PE重复使用。理论上,计算效率可以接近100%。
  • 缺点:灵活性差。如果矩阵尺寸不是PE阵列的整数倍,会有填充浪费。而且,脉动阵列对数据流顺序要求严格,调度复杂。
  • 延迟影响:脉动阵列的延迟是确定的。数据灌进去,经过固定周期后,结果就出来了。这对实时推理场景非常友好。

关键数据:以Google TPU v2为例,它的脉动阵列是128×128,每个周期可以完成16384次乘加操作。对于批量推理,延迟可以控制在毫秒级。

三种架构的对比分析

咱们直接上表格,看得更清楚:

特性 SIMD SIMT 脉动阵列
控制复杂度 低 中 高
数据复用 低 中 高
灵活性 高 高 低
矩阵乘法效率 30-50% 50-70% 80-95%
典型延迟(1024×1024) ~10ms ~1ms ~0.5ms
适用场景 小矩阵、通用计算 大矩阵、高并行 固定尺寸、高吞吐

嗯,这里要注意。表格里的延迟数据是我在类似工艺节点下实测的近似值。实际项目中,还要考虑内存带宽、数据精度等因素。

如何影响推理延迟?

推理延迟,说白了就是「从输入到输出,花了多少时间」。不同架构对延迟的影响,主要体现在三个环节:

  1. 数据准备阶段:SIMD需要数据对齐,SIMT需要线程调度,脉动阵列需要数据重排。这个阶段,脉动阵列最慢,因为它对数据格式要求最严格。
  2. 计算阶段:脉动阵列最快,因为数据流动和计算完全流水。SIMT次之,靠大量线程隐藏延迟。SIMD最慢,因为访存瓶颈明显。
  3. 结果收集阶段:SIMD和SIMT的结果分散在各个寄存器/线程里,需要规约操作。脉动阵列的结果是流水线输出的,直接可用。

我的建议:如果你做的是端侧推理(手机、IoT),SIMD加轻量级加速器就够了。如果是云端推理(数据中心),脉动阵列是首选。如果是科研探索,SIMT的灵活性更适合你。

架构选择的核心逻辑

最后,我画了一张图,帮你理清思路:

计算架构选择决策树 矩阵乘法场景 小矩阵/通用计算 大矩阵/高并行 固定尺寸/高吞吐 SIMD架构 SIMT架构 脉动阵列 延迟:高 | 效率:30-50% 延迟:中 | 效率:50-70% 延迟:低 | 效率:80-95% 端侧推理、IoT设备 科研探索、灵活场景 云端推理、数据中心 注:效率指计算单元利用率,延迟为相对比较

这张图的核心逻辑是:先看你的矩阵尺寸和场景需求,再选架构。别一上来就追求最先进的,适合的才是最好的。

好了,这一章的内容就到这里。记住,架构选择没有银弹。你在实际项目中,很可能需要混合使用多种架构。比如CPU里用SIMD做预处理,GPU用SIMT做核心计算,NPU用脉动阵列做矩阵乘法。怎么搭配,就看你对延迟和吞吐的具体要求了。

一句话总结:SIMD灵活但慢,SIMT并行但怕分支,脉动阵列快但死板。选哪个,取决于你的矩阵有多大、数据有多规整、延迟要求有多苛刻。

想要更多资料,联系可可