矩阵乘法基础:从数学定义到硬件瓶颈
大家好,我是你们的老朋友。今天咱们聊聊矩阵乘法——这个在深度学习里无处不在,却又经常被忽视的“幕后英雄”。
说实话,我刚开始做AI芯片那会儿,觉得矩阵乘法不就是个数学运算嘛,有什么好研究的?直到有一次,我在优化一个卷积神经网络时,发现90%的时间都花在了矩阵乘法上。那一刻我才意识到:搞懂矩阵乘法,就是搞懂了深度学习加速的核心。
矩阵乘法的数学定义
先来点基础的。矩阵乘法,说白了就是两个矩阵“打架”的过程。
假设我们有矩阵 A(m×n)和矩阵 B(n×p),它们的乘积 C = A × B 是一个 m×p 的矩阵。C 中第 i 行第 j 列的元素是这样算的:
C[i][j] = Σ(k=1 to n) A[i][k] × B[k][j]
嗯,就是 A 的第 i 行和 B 的第 j 列做点积。每个元素都要做 n 次乘法和 n-1 次加法。所以整个矩阵乘法需要 m×n×p 次乘法和 m×(n-1)×p 次加法。
关键点:矩阵乘法的计算复杂度是 O(m×n×p)。当三个维度都很大时,计算量会爆炸式增长。
举个例子,两个 1024×1024 的矩阵相乘,需要大约 10 亿次乘法和 10 亿次加法。你想想看,一个神经网络里有多少层?每层有多少个这样的矩阵乘法?
矩阵乘法在深度学习中的核心地位
我在项目中遇到过不少新人,他们总觉得深度学习就是“搭积木”——堆一堆卷积层、全连接层就完事了。但真正深入进去你会发现,几乎所有运算最终都归结为矩阵乘法。
来看看几个典型的场景:
- 全连接层: y = Wx + b,这就是一个矩阵-向量乘法
- 卷积层: 通过 im2col 或 Winograd 算法,可以转化为矩阵乘法
- 注意力机制: Q、K、V 的计算全是矩阵乘法
- 反向传播: 梯度计算同样离不开矩阵乘法
我曾经做过一个统计:在典型的 Transformer 模型中,矩阵乘法占了总计算量的 95% 以上。剩下的 5% 是激活函数、归一化这些“小角色”。
我的经验:优化深度学习模型,优先优化矩阵乘法。别在那些花里胡哨的算子上下功夫,先把矩阵乘法搞定了,性能就上去了。
传统CPU执行矩阵乘法的瓶颈
CPU 设计之初是为了处理“通用计算”——分支预测、乱序执行、大缓存……这些特性对矩阵乘法来说,其实没啥用。
为什么?因为矩阵乘法有三大特点:
- 计算密集: 计算量远大于数据量
- 数据复用: 同一个数据会被多次使用
- 规律访问: 内存访问模式非常规整
CPU 的强项是处理“不规则”的任务。你想想看,CPU 花了大把的晶体管去做分支预测、缓存一致性,这些在矩阵乘法里根本用不上。
具体来说,CPU 的瓶颈有这几个:
| 瓶颈 | 原因 | 影响 |
|---|---|---|
| 计算单元少 | CPU 只有几个 ALU/FPU | 并行度低,无法充分利用数据复用 |
| 缓存有限 | L1/L2 缓存容量小 | 数据搬来搬去,带宽成瓶颈 |
| 控制开销大 | 分支预测、乱序执行浪费晶体管 | 能效比低,每瓦性能差 |
| SIMD 宽度有限 | AVX-512 也就 512 位 | 一次处理的数据量不够大 |
避坑指南:我曾经天真地以为用 CPU 的 AVX 指令集就能搞定矩阵乘法。结果发现,写出来的代码性能还不如手写循环。为什么?因为内存访问模式没优化好,缓存一直在“抖动”。
传统GPU执行矩阵乘法的瓶颈
GPU 比 CPU 强多了,但也不是万能的。我刚开始做 GPU 编程时,踩过不少坑。
GPU 的核心优势是:大量计算单元 + 高带宽内存。一个 GPU 有几千个 CUDA 核心,显存带宽能到 1TB/s 以上。听起来很美好,对吧?
但实际用起来,问题也不少:
- 内存墙: 计算单元太快,内存带宽跟不上。数据还没搬完,计算单元就在“空转”
- 线程调度开销: 几千个线程同时跑,调度器忙不过来
- 共享内存有限: 每个 SM 只有几十 KB 的共享内存,大矩阵根本放不下
- Bank Conflict: 共享内存访问冲突,性能直接腰斩
我记得有一次,我在 GPU 上实现一个 4096×4096 的矩阵乘法。用最 naive 的方法,性能只有理论峰值的 5%。后来用了 tiling 技术,把矩阵分块放到共享内存里,性能提升到了 30%。再后来用了寄存器缓存、向量化加载……折腾了两个月,终于到了 80%。
嗯,这里要注意:GPU 的瓶颈往往不在计算,而在数据搬运。你想想看,一次矩阵乘法,数据要从显存搬到 L2 缓存,再到 L1 缓存,再到寄存器,最后才算完。每一步都是瓶颈。
核心观点:无论是 CPU 还是 GPU,矩阵乘法的瓶颈都在“数据搬运”上。计算本身很快,但数据搬来搬去太慢了。这就是为什么我们需要专门的 AI 芯片——它们的设计目标就是“让数据离计算更近”。
本章小结
矩阵乘法是深度学习的基石。CPU 和 GPU 虽然能跑,但都有各自的瓶颈。CPU 的问题是计算单元太少,GPU 的问题是数据搬运太慢。下一章,我们会聊聊 AI 芯片是怎么解决这些问题的。
最后送大家一句话:搞懂矩阵乘法,你就搞懂了一半的 AI 芯片设计。剩下的,就是怎么把数据搬得更快、算得更准。
个人建议:如果你刚开始接触 AI 芯片,先别急着看那些复杂的架构图。把矩阵乘法吃透了,后面学起来会轻松很多。我当年就是吃了这个亏,上来就看 TPU 架构,结果一头雾水。