1980 年的一颗浮点协处理器,算一次正切只要 90 微秒。在同期的通用 CPU 上,这段纯软件代码要跑 13,000 微秒。这 144 倍的速度反差全靠算法上的精妙腾挪。
13000 微秒压到 90 微秒
Ken Shirriff 用凿子撬开了 1980 年发布的 Intel 8087 浮点协处理器顶盖。他在显微镜下顺着庞杂的运算数据通路,逐位还原出了 FPTAN(正切)指令背后的三段式算法。144 倍的速度差背后,藏着一套针对早期硅片面积异常苛刻的设计取舍。
芯片下半部分的运算数据通路负责对 80 位浮点值做运算。其中包括存放固定指数值的指数 ROM 和存放算法所需常量的常数 ROM。移位器能将 64 位值任意左右移位,而加法器则是整颗芯片的计算核心。加法器除了负责基础的加减运算,还能以循环方式实现乘、除和开方。这些密集的物理单元是 8087 高效运转的基础。
图:8087 运算数据通路的显微镜特写,可见常数 ROM、移位器和加法器。来源:Ken Shirriff’s blog(righto.com)
从轰炸机导航仪继承算法
这套硬件算法的根基源于 1956 年。当时工程师 Jack Volder 临危受命,开发出了名噪一时的 CORDIC 算法。这是为了给能够以两倍音速巡航的 B-58 轰炸机设计数字导航计算机。早期的模拟导航计算机受限于机械和模拟电路的物理极限,精度已经触碰天花板。但如果用当年速度极慢的晶体管去硬算复杂的数字三角函数,算力成本又根本无法承受。
CORDIC 提供了一条精妙的捷径。它把连续的角度拆成一串预先算好的特殊角,让原本复杂的向量旋转化繁为简。角度 θ 在单位圆上对应一点。取出特殊角后,旋转矩阵里的乘法运算在硬件层面直接退化为最轻量的移位操作。这把原本需要海量乘法堆砌的三角函数计算,直接变成了加法、减法和二进制移位的简单循环。
图:取特殊角后矩阵里的乘法退化为硬件移位。来源:Ken Shirriff’s blog(righto.com)
16 次迭代拿够底噪精度
CORDIC 每迭代一次,大约能为最终结果提供一位的计算精度。如果要在一个 80 位的浮点架构中稳稳拿到完整的 64 位有效精度,最暴力的常规做法是硬算 64 项。但这需要在芯片里固化配置 64 个特殊角的庞大查找表。然而对于 8087 来说,这是一个在物理层面无法实现的设计。
控制整颗芯片的 1,648 条微指令已经把芯片中央一大块矩形 ROM 区域塞得满满当当。硅片上根本没有多余的空间去容纳那么大的常数查找表。空间的绝对物理约束倒逼 8087 放弃 64 次完整迭代,选择只做 16 位 CORDIC 去拿约 2 的负 16 次方量级的粗略角度。
图:芯片中央的微码 ROM 区域,存着 1,648 条微指令。来源:Ken Shirriff’s blog(righto.com)
不按常理出牌的三段式设计
8087 把整个运算链路被拆解成了令人拍案叫绝的三段:伪除法、有理逼近和伪乘法。在第一步的判定位过程里,微码执行的操作类似于经典的长除法。加法器将每个预设的特殊角与剩余的残差角进行比对。只要特殊角更小就直接减掉,并记下一位状态 1,否则记为 0。
这个阶段里硬件只记录状态,不做任何实际的向量旋转,从而大幅降低了运算通路的负担。所有记录下来的状态位被暂存在一个专门的 16 位移位寄存器中。直到最后一步的伪乘法阶段,才按照这些既定状态位去统一施加旋转操作。计算位与应用旋转的分离,让 8087 的运算单元调度达到了最高效的管线状态。
图:CORDIC 算法的迭代与状态记录机制示意图。来源:Ken Shirriff’s blog(righto.com)
一次除法填平截断误差
剩下的残差角度直接交给 Padé 逼近,用 3x/(3-x²) 这个简单的多项式比值来补齐长尾。正切函数在 π/2 处会发散到无穷,用泰勒级数无法处理这种发散。而多项式的比值天然贴合正切函数的非线性曲线特性。这个有理逼近本身虽然简单,但在输入极小的区间内表现精确。其误差直接与 x 的四次方成正比。
前置的 16 次 CORDIC 已经把残差 x 压到了 2 的负 16 次方以下,四次方误差自然就顺势落到了 2 的负 64 次方以下。FPTAN 指令本身就会返回独立的分子和分母。逼近公式里的那次除法在硬件层面不需要真做,直接省去了这部分开销。
图:正切函数(红)、有理逼近(蓝)与三阶泰勒级数(绿)的对比。来源:Ken Shirriff’s blog(righto.com)
64 位精度的三角函数不是靠更多次迭代暴力堆砌出来的。8087 选择先算够再补差,用一次免运算的除法直接跳过了 48 次高昂的迭代开销。硬件设计的本质就是不断在妥协中寻找最优解。8087 把算法里最便宜的部分,换成了硅片上最昂贵的面积。
参考链接:
- Ken Shirriff’s blog
- Hacker News 讨论