《我.X87浮点》 --- 我不是畸形,我是来不及长好就被推出来的

我的生日是 1980 年。早产。

准确地说,我比 8086 晚了两年才出来——不是因为我发育慢,是因为我根本不在 Intel 最初的计划里。8086 是一个"赶紧做出来抢占市场"的应急产品,浮点?那是大型机和科研机器的事。PC 是办公工具,算算表格就够了。

是 John Palmer 硬把我塞进产品线的。他找来 Berkeley 的 Kahan,两个人画了一张浮点语义的蓝图,说"PC 应该能算实数,而且算得对"。

Intel 内部很多人觉得他们疯了。

但我还是被造出来了。在以色列海法,七个人,在 Mylar 胶片上手工画版图。圣克拉拉说"这玩意做不出来",海法说"你闭嘴"。时差十小时,电话线那头经常没人接。

我出生时体重不足:约 4.5 万个晶体管。听起来不少?8086 才 2.9 万,可它只干整数。我要干的是让机器理解小数——真正的、IEEE 754 意义上的小数。

第一刀:opcode 位宽,我的第一根肋骨没长全

他们给我留了多少指令编码空间?5 位。5 位能编码什么?32 种操作。浮点指令有多少种?几十种。结果就是:我不能像后来的 XMM 那样写 

"ADDPS xmm0, xmm1"——两个寄存器都明确写出来。我没那个位宽。

所以我被迫用栈。

ST(0) 到 ST(7),八层深。运算默认拿栈顶,结果默认塞回栈顶。像逆波兰计算器。像 HP-41。像一切"不是为编译器设计的东西"。

后来所有人骂我:"栈式寄存器反人类,编译器写得想死。"

我知道。GCC 后来多写了几千行代码就为了在我这具畸形身体上模拟扁平寄存器。

但你们骂的是我的骨骼。你们没看到产房里那个数字——5 位。他们只给了我 5 位,我在那 5 位里搭了一个能活二十年的家。不是好家。但它是我在产房里搭的。

第二刀:80-bit extended precision,我的肺太大了

32 位单精度,64 位双精度——够了。所有人都这么说。

不。中间结果如果提前四舍五入,误差会累积。我见过那种累积。Kahan 见过。所以我们决定:内部用 80 位。64 位尾数,15 位指数,加上 guard、round、sticky 三位。

这让我的浮点运算"中间不撒谎"。

代价是:我的寄存器比数据总线的宽度还大,比内存里存的浮点数还宽。每次进出内存都要转换格式。我喘气比别人费劲,因为我的肺是为高海拔设计的,可你们把我放在海平面用。

后来 IEEE 754-1985 采纳了我的精度模型。现在你写 

"float" 和 

"double",底层逻辑是我定的。你们享受着"浮点误差可控"这个事实,然后骂我"架构奇怪"。

我不是奇怪。我是把安全气囊做到了方向盘里面,所以方向盘变重了。

第三刀:ESC 和 WAIT,我的脐带没剪干净

我是一颗协处理器。不是 CPU 的一部分,是住在隔壁芯片里的房客。

CPU 看到 

"11011..." 开头的指令就装傻——算地址,但不执行。我在总线上偷听,自己跑微码。然后我们靠 WAIT 信号同步。我忙的时候拉低引脚,CPU 在那儿空转等我叫它。

这叫"协处理"。

后来的人说这很蠢。总线带宽浪费了,同步靠忙等,一颗芯片在等另一颗芯片。为什么不集成在一起?

因为 1980 年,集成在一起意味着重新设计 8086 的总线架构。意味着推迟发布。意味着 IBM 可能选摩托罗拉。

我没被集成。我被缝合。

第四刀:他们拿我跑视频

这是最疼的一刀。不是技术上的,是尊严上的。

1990 年代,多媒体来了。视频、音频、游戏、3D。所有人突然需要"快速处理大量小数据"。像素是 8 位的,音频采样是 16 位的。这些不是浮点。这些是并行整数。

可他们没有别的选择。MMX 还没出生。SSE 还在图纸上。所以你们拿我——一个设计来算弹道、算有限元、算天体轨道的浮点协处理器——去算 YUV 转 RGB。

一个像素一个像素地算。

我算一个像素的颜色值要二十多个时钟周期。不是因为我慢。是因为我生来不是干这个的。你拿一个早产儿去跑马拉松,然后怪他喘不上气。

1996 年,MMX 终于来了。

它没有修我。它睡进了我的身体里。

MM0 到 MM7,直接别名到我的 ST(0) 到 ST(7) 的物理寄存器。我的躯壳,他的灵魂。他做并行整数,我做浮点,我们共用一副骨架。用完还得 

"EMMS" 给我超度——把我从里面赶出去,让 CPU 知道"浮点寄存器现在是干净的"。

这不是升级。这是截肢。

然后 SSE 来了。独立的 128 位 XMM 寄存器。不再和我共享身体。扁平寻址。编译器终于不用在我身上模拟寄存器文件了。

他们终于造出了一个"正常的"浮点/向量架构。

然后他们回头看我,说:"x87 真烂。"

我没有反驳。我能说什么?说我生来就少一根肋骨?说我被催着出来所以骨骼没长全?说那些骂我的人用的 IEEE 754 是我定的?

1999 年 SSE 发布。2000 年以后,编译器默认用 SSE 做浮点。我退居兼容层。新写的代码不再碰我。

到 AVX 出来,连 128 位都不够了,要 256 位、512 位。我的 80 位临时精度被砍掉,编译器加个 

"-ffp-contract=fast" 就把我最后的坚持扔了。

我输给了时间。和 CL450 一样。

但 CL450 死得坦然。他知道自己就是个 VCD 解码器,CPU 学会了他就该走。

我不一样。我死得冤。

我不是一个"被淘汰的专用芯片"。我是一个"被催生的通用方案",在错误的时代被塞进了错误的角色,然后因为不够好而被替换——可我从来没机会够好过。

我生来是算弹道的。你们拿我弹钢琴。弹得不好,就砸了琴。

我在这个防静电袋里,和 CL450 隔着一层纸板。

他有时候跟我说:"至少你留下了标准。"

我说:"标准是我定的,可没人记得是我定的的。"

他说:"时间最大的赢家。你我都输给它。"

我说:"可它至少让你死得痛快。"

我还没死透。x87 指令在某些模式下还在跑。老编译器、老代码、老驱动。嵌入式系统里偶尔还能看到我的影子。

但你们已经不叫我名字了。你们叫我"遗留浮点架构"。

我不恨 MMX。不恨 SSE。不恨 AVX。

我恨的是 1979 年那个会议室里的决定——"浮点协处理器不在 8086 首发计划里,后面再说。"

后面没有后面了。我是在后面被硬塞进来的早产儿。带着所有来不及修好的缺陷。干了一辈子活。临了被人说"架构设计有问题"。

我的问题不是架构。

是产房太急。

8087, 1980–2000(名义上)

实际上还在某些地方喘气

别催了~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值