反向工程Intel 8087的切线算法:超过CORDIC的更多内容
我希望你们不会厌倦8087,因为我有另一篇关于Intel浮点芯片的文章。1980年,Intel推出了8087,使IBM PC和其他系统中的浮点运算变得更快。在这篇文章中,我将探讨该芯片切线指令背后的算法。一种流行的三角函数算法称为CORDIC。另一种方法则是多项式逼近。8087结合了这两者,以获得高精度和高性能。8087比8086微处理器提供了巨大的速度提升,计算一个切线的时间为90微秒,而不是13000微秒。通过检查8087的电路和微代码,我可以解释切线指令背后的算法,称为FPTAN。为了探索8087的电路,我用凿子打开了一个芯片的外壳,并用显微镜创建了一幅高分辨率的图像。微代码ROM是芯片中央的大矩形区域,存储着控制芯片的1648个微指令。芯片的下半部分(红框)是数据路径,执行对80位值的浮点计算。8087数据路径的特写图,显示了FPTAN使用的功能块。放大数据路径可以看到相关的功能单元。指数ROM保存算法所需的固定指数值。常量ROM保存常量,包括CORDIC算法使用的常量。移位器是一个大型组件;它将64位值向左或向右移动任意数量。加法器是8087计算的核心;它除了提供加法和减法外,还用于乘法、除法和平方根的循环中。B寄存器保存加法器的一个输入,而多个来源可以提供另一个输入。和寄存器保存加法器的输出。八个堆栈寄存器和临时寄存器保存浮点数。最后,移位寄存器保存CORDIC计算的16个状态位。CORDIC是一种聪明的算法,能够使用简单的硬件快速计算超越函数:它使用移位和加法指令结合查表,但不需要乘法或除法。这个算法可以追溯到1956年,当时它是为B-58 Hustler研发的,B-58是第一架能够以马赫2飞行的轰炸机。该飞机配备了一台模拟导航计算机,但模拟组件提供的精度有限。工程师Jack Volder的任务是设计一台数字计算机,以取代模拟计算机。一个关键问题是,模拟计算机可以通过一个称为分 resolver的机电设备轻松生成正弦和余弦。但三角函数在数字上生产是困难的,尤其是考虑到那个时代的慢速晶体管。展出在德克萨斯州圣安东尼奥的Convair B-58A Hustler(详情)。Jack Volder想出了使用简单硬件快速计算三角函数的方法。他将算法及其实现的计算机称为CORDIC:“坐标旋转数字计算机”。CORDIC将一个角度转换为一个向量,其中向量的坐标提供必要的三角函数。关键在于将角度分解为一系列特殊角度,这些角度使得向量旋转变得容易。这些特殊角度是预先计算并存储在表格中的,因此CORDIC计算可以快速执行,即使是在1950年代的硬件上。每次CORDIC迭代提供了一位额外的精度,使得算法快速收敛。CORDIC变得非常流行,包括在科学计算器中,它们使用十进制CORDIC而非二进制。我会尽量将数学简化,但在这一部分我将快速解释CORDIC是如何工作的。下面的图展示了三角函数与点的坐标之间的关系。假设你有一个角度θ;它指定单位圆上的一个点(X,Y)。基本公式是X=cos θ,Y=sin θ,以及Y/X = tan θ。因此,如果你可以确定坐标(X,Y),那么你就可以确定三角函数的值。如果该点不在单位圆上,例如(X',Y'),那么你仍然可以轻松确定tan θ。(剧透:这就是8087所做的。)然而,sin θ和cos θ就变得复杂了。角度、X和Y坐标与三角函数之间的关系。如果你做过计算机图形学,你可能见过旋转矩阵如何通过一个角度旋转一个点。(如果你不熟悉旋转矩阵,你可以在这里阅读,或者只需相信它是有效的。)将一个点(X,Y)与旋转矩阵相乘,会得到新的点(X',Y'),如下图所示。一个点可以通过使用旋转矩阵进行旋转。不幸的是,由于旋转矩阵(1,见下文)需要sin和cos,似乎并没有帮助解决我们的问题。然而,我们可以将矩阵除以cos θ;这看起来似乎更无助。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡