CgemvBatched 01:复数,从代数定义到运算规则

举报
黄生 发表于 2026/10/30 09:22:31 2026/10/30
【摘要】 1. 从复数讲起aclblasCgemvBatched 算子的全名里有个 C:Complex,这个算子处理的矩阵、向量、标量全部是复数。本质上就是把复数域上的线性代数运算,翻译成硬件能执行的浮点指令。所以,我们第一站就回到复数本身。 2. 复数的定义 2.1 代数定义复数域 C\mathbb{C}C 是实数域 R\mathbb{R}R 的扩展,引入一个新元素 iii,满足:i2=−1i^2...

1. 从复数讲起

aclblasCgemvBatched 算子的全名里有个 C:Complex,这个算子处理的矩阵、向量、标量全部是复数。本质上就是把复数域上的线性代数运算,翻译成硬件能执行的浮点指令。所以,我们第一站就回到复数本身。


2. 复数的定义

2.1 代数定义

复数域 C\mathbb{C} 是实数域 R\mathbb{R} 的扩展,引入一个新元素 ii,满足:

i2=−1i^2 = -1

每个复数 zz 可以唯一写成:

z=a+b i,a,b∈Rz = a + b\,i, \quad a, b \in \mathbb{R}

其中 a=Re(z)a = \text{Re}(z) 称为实部,b=Im(z)b = \text{Im}(z) 称为虚部。

2.2 几何解释

复数 a+bia + bi 可以对应平面上的点 (a,b)(a, b)——这就是复平面。

  • 横轴 = 实轴,纵轴 = 虚轴
  • 复数 z=a+biz = a + bi 的模(magnitude)∣z∣=a2+b2|z| = \sqrt{a^2 + b^2},就是点到原点的距离
  • 复数 zz 的幅角(argument)θ=arctan⁡(b/a)\theta = \arctan(b/a),就是向量与实轴的夹角

这个几何视角在理解共轭转置时会用到,但本算子的实现主要走代数路线(实部/虚部分离计算),所以我们重点放在代数运算上。


3. 复数加法

两个复数相加,实部与实部相加,虚部与虚部相加:

(a+bi)+(c+di)=(a+c)+(b+d) i(a + bi) + (c + di) = (a + c) + (b + d)\,i

在硬件上,实部和虚部分别做一次 float 加法即可。


4. 复数乘法

4.1 推导

两个复数相乘,用分配律展开:

(a+bi)(c+di)=ac+ad i+bc i+bd i2(a + bi)(c + di) = ac + ad\,i + bc\,i + bd\,i^2

因为 i2=−1i^2 = -1,所以:

=ac+ad i+bc i−bd=(ac−bd)+(ad+bc) i= ac + ad\,i + bc\,i - bd = (ac - bd) + (ad + bc)\,i

最终结果:

(a+bi)(c+di)=(ac−bd)⏟实部+(ad+bc)⏟虚部 i\boxed{(a + bi)(c + di) = \underbrace{(ac - bd)}_{\text{实部}} + \underbrace{(ad + bc)}_{\text{虚部}}\,i}

4.2 计算量分析

一次复数乘法需要:

  • 4 次实数乘法:acac, bdbd, adad, bcbc
  • 1 次实数减法:ac−bdac - bd(实部)
  • 1 次实数加法:ad+bcad + bc(虚部)

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 次乘法,设:

t1=a⋅c,t2=b⋅d,t3=(a+b)(c+d)t_1 = a \cdot c, \quad t_2 = b \cdot d, \quad t_3 = (a + b)(c + d)

则:

t3=ac+ad+bc+bd=t1+(ad+bc)+t2t_3 = ac + ad + bc + bd = t_1 + (ad + bc) + t_2

所以:

实部=t1−t2,虚部=t3−t1−t2\text{实部} = t_1 - t_2, \quad \text{虚部} = t_3 - t_1 - t_2

只需 3 次乘法 + 5 次加减法。

在浮点运算中,Gauss 方案的 t3−t1−t2t_3 - t_1 - t_2 涉及相消(catastrophic cancellation)——当 t1,t2t_1, t_2 很大但 ad+bcad+bc 很小时,大数相减丢失有效数字,精度严重下降。4 乘法方案虽然多一次乘法,但每次乘法的结果直接参与加减,数值更稳定。


5. 共轭复数

5.1 定义

复数 z=a+biz = a + bi 的共轭(conjugate)定义为:

zˉ=a−bi\bar{z} = a - bi

几何上,共轭就是复平面上关于实轴的镜像翻转。

5.2 关键性质

  1. 共轭的共轭回到自身:zˉ‾=z\overline{\bar{z}} = z
  2. 共轭乘积等于模的平方:z⋅zˉ=(a+bi)(a−bi)=a2+b2=∣z∣2z \cdot \bar{z} = (a+bi)(a-bi) = a^2 + b^2 = |z|^2,结果是实数
  3. 共轭保持加法:z1+z2‾=zˉ1+zˉ2\overline{z_1 + z_2} = \bar{z}_1 + \bar{z}_2
  4. 共轭保持乘法:z1⋅z2‾=zˉ1⋅zˉ2\overline{z_1 \cdot z_2} = \bar{z}_1 \cdot \bar{z}_2
  5. 共轭反转乘法顺序的虚部符号:如果 z1z2=p+qiz_1 z_2 = p + qi,则 zˉ1⋅z2=p−qi\bar{z}_1 \cdot z_2 = p - qi(当只共轭一个因子时)

性质 5 是理解 op=C(共轭转置)的关键,我们在后面会展开。

5.3 共轭在复数乘法中的体现

对比普通乘法和"对第一个因子取共轭"的乘法:

实部 虚部
z1⋅z2z_1 \cdot z_2 ac−bdac - bd ad+bcad + bc
zˉ1⋅z2\bar{z}_1 \cdot z_2 ac+bdac + bd ad−bcad - bc

符号变化:实部的 bdbd 前面从 −- 变 ++,虚部的 bcbc 前面从 ++ 变 −-。

这正是 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₃ ...

即 NN 个复数占用 2N2N 个 float32 槽位,实部和虚部交错排列。

6.2 为什么交错?

优点是空间局部性好——一个复数的实部和虚部在内存中相邻,访问一个复数时两个分量一起进缓存。

缺点是:当你只想操作所有实部(或所有虚部)时,需要从交错数据中抽取,这就是 GatherMask 的用途。

6.3 GatherMask——实/虚分离

GatherMask 算子做的事情,数学上就是一个**下采样(subsampling)**操作:

  • stride=1(取偶数位):y[k]=x[2k]y[k] = x[2k],提取所有实部
  • stride=2(取奇数位):y[k]=x[2k+1]y[k] = x[2k+1],提取所有虚部

设原始交错序列为 s=[r0,i0,r1,i1,r2,i2,…]s = [r_0, i_0, r_1, i_1, r_2, i_2, \ldots],则:

Real tensor=[r0,r1,r2,…],Imag tensor=[i0,i1,i2,…]\text{Real tensor} = [r_0, r_1, r_2, \ldots], \quad \text{Imag tensor} = [i_0, i_1, i_2, \ldots]

分离后,实部和虚部各自是连续的 float32 数组,可以独立做向量运算(Mul、Add 等)。

计算完成后再用 Gather 算子做逆操作——交织(interleave),把分离的实部和虚部重新合并为交错序列输出。

6.4 整体流程

交错复数数据 ──GatherMask──→ 分离的实部 + 分离的虚部
                                    │
                              向量运算(Mul/Add/Sub/Reduce)
                                    │
分离的结果实部 + 结果虚部 ──Gather──→ 交错复数输出

这个"分离 → 计算 → 交织"的流程贯穿整个 AIV 路径。


7. 小结

概念 数学公式 在算子中的角色
复数加法 (a+bi)+(c+di)=(a+c)+(b+d)i(a+bi)+(c+di)=(a+c)+(b+d)i y 的累加
复数乘法 (a+bi)(c+di)=(ac−bd)+(ad+bc)i(a+bi)(c+di)=(ac-bd)+(ad+bc)i 矩阵元素 × 向量元素
共轭复数 a+bi‾=a−bi\overline{a+bi}=a-bi op=C 共轭转置
交错存储 [r0,i0,r1,i1,…][r_0,i_0,r_1,i_1,\ldots] complex64 内存布局
GatherMask y[k]=x[2k]y[k]=x[2k] 或 y[k]=x[2k+1]y[k]=x[2k+1] 实/虚部分离

下一篇我们从复数走向线性代数:矩阵-向量乘的两种数学视角,以及它们如何决定硬件实现路径。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。