硅光计算芯片驱动与接口工程 - 第2节

2. 矩阵乘法基础

## 矩阵乘法:从数学定义到硅光芯片的加速利器

第2章 矩阵乘法基础:数学定义、计算复杂度、在神经网络中的作用

记得我刚入行做算法加速时,导师甩给我一句话:
“矩阵乘法是深度学习的骨架,你把它吃透了,后面全通。”
我当时半信半疑,直到后来自己写过一个简单的全连接层——一个矩阵乘,硬件加速卡从CPU换到GPU再到光计算芯片,才真正体会到这句话的分量。

这一章我们就把矩阵乘法这几个维度彻底掰开:
数学上它到底在算什么?
算一次要多少时间?
为什么神经网络里到处都是它?
搞明白了这些,后面你写光子芯片的驱动接口才不会发懵。

本章核心脉络:矩阵乘法定义 → 计算复杂度分析 → 神经网络三剑客(全连接/卷积/注意力) → 硅光芯片为什么最适合加速矩阵乘

2.1 数学定义:三句话就能讲清楚

两个矩阵 A(m×n)和 B(n×p)相乘,得到 C(m×p)。

每个元素 C[i][j] 是:

C[i][j] = A[i][0]·B[0][j] + A[i][1]·B[1][j] + ... + A[i][n-1]·B[n-1][j]

即 C = A × B

说白了,就是行乘列再求和。
我有个习惯:在纸上画一个二维网格,把A的行和B的列对齐,逐格相乘再累加——每次做矩阵乘法优化时我都用这个图来核对索引边界。

避坑提醒:
我曾经在代码里把A(m×n)和B(n×p)里第二个维度的n写反了,导致结果完全不对。
调试了一下午才发现——内维必须相等,这是矩阵乘法最最基础的前提。

2.2 计算复杂度:O(n³) 的“魔鬼”

三层循环,每一层都在做乘法加法:
for i in range(m):
  for j in range(p):
    for k in range(n):
      C[i][j] += A[i][k] * B[k][j]

总操作数 = 2 × m × n × p(一次乘+一次加算一次操作)。
如果m=n=p=N,复杂度就是 O(N³)。

矩阵规模 N 乘法次数 加法的次数 总操作数
128 2,097,152 2,097,152 4,194,304
512 134,217,728 134,217,728 268,435,456
1024 1,073,741,824 1,073,741,824 ~2.1e9

你想想看,一个1024×1024的矩阵乘就要做20亿次乘加运算。
为什么神经网络越来越依赖硬件加速?
因为CPU做这个实在太慢,GPU和光计算芯片就是专门打这种“重复乘法加”的硬仗。

别盲目追求优化算法:
Strassen、Coppersmith–Winograd等快速算法常数巨大,小矩阵反而更慢。
我在做嵌入式推理引擎时就踩过这个坑——矩阵在256以下,老老实实三重循环比什么花里胡哨的快得多。

2.3 神经网络里的三巨头矩阵乘

现在的神经网络模型,本质上就是一堆矩阵乘法。我给你列三个最常见的位置:

2.3.1 全连接层(Dense / Linear)

输入向量 x(1×d_in)乘以权重矩阵 W(d_in×d_out),再加偏置:

y = x · W + b    # 一次矩阵乘 + 一次向量加

这就是Transformer、MLP、分类头的核心。每个过一层MLP就要做一次这样的矩阵乘,而有96层……

2.3.2 卷积层(Convolution)

卷积在底层实现时也转化为矩阵乘:im2col + GEMM。
把输入图像展开成矩阵,把卷积核也展开,然后做一次大规模的矩阵乘。
我当年用OpenBLAS做alexnet的推理加速,就是靠这个技巧把速度提升了3倍。

2.3.3 注意力机制(Attention)

Q、K、V三个矩阵分别乘以权重,然后 Q·K^T 得到注意力分数。
而实际上,一个多头自注意力中有4次矩阵乘(Q/K/V投影 + 输出投影)。
所以为什么大模型在推理时对矩阵乘法带宽这么饥渴——每一层都在成百上千的上做矩阵乘。

神经网络中矩阵乘法的三处核心应用 全连接 (Dense) y = x·W + b 卷积 (Conv) im2col + GEMM 注意力 (Attention) Q·K·V → Q·K^T 硅光计算芯片 光子矩阵乘法加速 并行度高 × 低功耗 💡 这三个模块占整个模型推理时间的80%~95%。 硅光芯片从物理上拟合矩阵乘的并行性,天然适合做这类运算。
我的实践经验:
在做光子芯片的驱动SDK时,我们把全连接和卷积合并成同一个矩阵乘法指令,只通过形状参数来区分。
这样硬件设计更简洁,驱动层也少了一半代码。
你后面配置接口时也会看到类似的统一API设计。

2.4 为什么硅光芯片对矩阵乘法特别友好?

传统电子芯片用冯·诺依曼架构,数据要在内存和执行单元之间来回搬运,
而矩阵乘法最大的瓶颈就是访存带宽,而不是计算单元的峰值算力。

硅光芯片的不同之处:

  • 并行光学衍射——光信号在波导里天然可以同时进行多路乘加,不需要多级流水和缓存。
  • 低功耗——矩阵中每个元素的乘加操作在光子干涉器里几乎是“被动完成”的,能耗远低于电子加法器。
  • 波长复用——不同波长可以在同一根波导里携带不同数据,相当于在空间维度和波长维度同时做矩阵乘法。
不要神话光子计算:
硅光芯片在大规模(≥1024)矩阵乘法上有优势,但小矩阵或需要频繁改权重的场景,电子芯片依然更好。
我在做混合推理架构时,把大矩阵交给光子加速,小矩阵留在GPU上——这是当前最实用的方案。

这一章我们把矩阵乘法的“底牌”翻了一遍。
从数学定义到复杂度,再到神经网络里的三个核心应用,其实都是为了后面写驱动接口时你能清楚:
我手里的矩阵,到底在芯片里是怎么跑的。

下一站预告(不用往下翻):
矩阵乘法你已经懂了,接下来我们要在硅光计算芯片的硬件抽象层里,把这三个本质相同的运算统一成一个接口。
第3章我们会讲光子矩阵乘法指令集与API设计。