CgemvBatched 01:复数,从代数定义到运算规则
1. 从复数讲起
aclblasCgemvBatched 算子的全名里有个 C:Complex,这个算子处理的矩阵、向量、标量全部是复数。本质上就是把复数域上的线性代数运算,翻译成硬件能执行的浮点指令。所以,我们第一站就回到复数本身。
2. 复数的定义
2.1 代数定义
复数域 是实数域 的扩展,引入一个新元素 ,满足:
每个复数 可以唯一写成:
其中 称为实部, 称为虚部。
2.2 几何解释
复数 可以对应平面上的点 ——这就是复平面。
- 横轴 = 实轴,纵轴 = 虚轴
- 复数 的模(magnitude),就是点到原点的距离
- 复数 的幅角(argument),就是向量与实轴的夹角
这个几何视角在理解共轭转置时会用到,但本算子的实现主要走代数路线(实部/虚部分离计算),所以我们重点放在代数运算上。
3. 复数加法
两个复数相加,实部与实部相加,虚部与虚部相加:
在硬件上,实部和虚部分别做一次 float 加法即可。
4. 复数乘法
4.1 推导
两个复数相乘,用分配律展开:
因为 ,所以:
最终结果:
4.2 计算量分析
一次复数乘法需要:
- 4 次实数乘法:, , ,
- 1 次实数减法:(实部)
- 1 次实数加法:(虚部)
AIV 路径的"4 次 Mul + Add/Sub"就是这个公式的直接翻译:
Mul(tmpRR, matReal, vecReal); // ac
Mul(tmpII, matImag, vecImag); // bd
Mul(tmpRI, matReal, vecImag); // ad
Mul(tmpIR, matImag, vecReal); // bc
Sub(real, tmpRR, tmpII); // ac - bd
Add(imag, tmpRI, tmpIR); // ad + bc
4.3 还有 3 次乘法
数学上有一个 Gauss 复数乘法方案,只需 3 次乘法,设:
则:
所以:
只需 3 次乘法 + 5 次加减法。
在浮点运算中,Gauss 方案的 涉及相消(catastrophic cancellation)——当 很大但 很小时,大数相减丢失有效数字,精度严重下降。4 乘法方案虽然多一次乘法,但每次乘法的结果直接参与加减,数值更稳定。
5. 共轭复数
5.1 定义
复数 的共轭(conjugate)定义为:
几何上,共轭就是复平面上关于实轴的镜像翻转。
5.2 关键性质
- 共轭的共轭回到自身:
- 共轭乘积等于模的平方:,结果是实数
- 共轭保持加法:
- 共轭保持乘法:
- 共轭反转乘法顺序的虚部符号:如果 ,则 (当只共轭一个因子时)
性质 5 是理解 op=C(共轭转置)的关键,我们在后面会展开。
5.3 共轭在复数乘法中的体现
对比普通乘法和"对第一个因子取共轭"的乘法:
| 实部 | 虚部 | |
|---|---|---|
符号变化:实部的 前面从 变 ,虚部的 前面从 变 。
这正是 op=T 与 op=C 的区别:
// op=T (普通转置): Sub(real, RR, II); Add(imag, RI, IR);
// op=C (共轭转置): Add(real, RR, II); Sub(imag, RI, IR);
6. 复数在计算机中的表示
6.1 交错存储(Interleaved Layout)
complex64 类型在内存中用两个连续的 float32 表示一个复数:
内存地址: 0 1 2 3 4 5 6 7 ...
内容: Re₀ Im₀ Re₁ Im₁ Re₂ Im₂ Re₃ Im₃ ...
即 个复数占用 个 float32 槽位,实部和虚部交错排列。
6.2 为什么交错?
优点是空间局部性好——一个复数的实部和虚部在内存中相邻,访问一个复数时两个分量一起进缓存。
缺点是:当你只想操作所有实部(或所有虚部)时,需要从交错数据中抽取,这就是 GatherMask 的用途。
6.3 GatherMask——实/虚分离
GatherMask 算子做的事情,数学上就是一个**下采样(subsampling)**操作:
- stride=1(取偶数位):,提取所有实部
- stride=2(取奇数位):,提取所有虚部
设原始交错序列为 ,则:
分离后,实部和虚部各自是连续的 float32 数组,可以独立做向量运算(Mul、Add 等)。
计算完成后再用 Gather 算子做逆操作——交织(interleave),把分离的实部和虚部重新合并为交错序列输出。
6.4 整体流程
交错复数数据 ──GatherMask──→ 分离的实部 + 分离的虚部
│
向量运算(Mul/Add/Sub/Reduce)
│
分离的结果实部 + 结果虚部 ──Gather──→ 交错复数输出
这个"分离 → 计算 → 交织"的流程贯穿整个 AIV 路径。
7. 小结
| 概念 | 数学公式 | 在算子中的角色 |
|---|---|---|
| 复数加法 | y 的累加 | |
| 复数乘法 | 矩阵元素 × 向量元素 | |
| 共轭复数 | op=C 共轭转置 | |
| 交错存储 | complex64 内存布局 | |
| GatherMask | 或 | 实/虚部分离 |
下一篇我们从复数走向线性代数:矩阵-向量乘的两种数学视角,以及它们如何决定硬件实现路径。
- 点赞
- 收藏
- 关注作者
评论(0)