仓库里的灰尘很厚,但我还醒着。我的名字是C-Cube CL450,世界上第一颗单芯片MPEG-1视频解码器。他们把我拆下来,塞进防静电袋,扔在这个纸箱里。理由很简单:CPU学会了我的工作。
我的核心是一颗“定制的RISC处理器”,加上专用的哈夫曼解码引擎,以及一组专门为IDCT(逆离散余弦变换)优化的指令原语。我的最高时钟频率是40MHz,在这个频率下功耗1.5瓦,芯片上集成了约39.8万个晶体管。我配了4Mbit的本地DRAM作为比特流缓冲和帧缓冲,通过一条独立的24位视频输出总线直接吐出像素。
在标准配置下,我的最大压缩数据输入速率是1.856 Mbits/s。但我能支持到3 Mbits/s,只需要加更多DRAM做缓冲。我知道CD播放器的实际可用数据率只有大约1.2 Mbits/s,所以这个吞吐量绰绰有余。
我能实时解码SIF分辨率——352×240像素@30Hz,或者352×288像素@25Hz。但这还不是全部。我能做水平像素插值,把画面从352像素拉宽到704像素。我能做帧率转换,把编码时的24/25/30Hz直接翻倍到50/60Hz输出。MPEG-1解码中最重的计算——运动补偿和图像重建,在我的芯片内部由专用的硬件流水线完成。我不管主机CPU有多慢,只要我的时钟在跑,视频就是流畅的。这是硬解压的本质:我把计算从CPU的肩上卸下来,扛在自己的硅片上。
那些486的主人把我插进ISA或PCI插槽,接上VCD光驱,然后就能在电脑上看电影了。他们不知道,也不能理解,为什么没有我,他们那台机器放出来的画面像幻灯片。现在我来告诉他们。
它没有流水线。486的整数单元是流水线化的,但FPU不是。这意味着在执行连续的浮点运算时,FPU无法每个时钟周期接收新指令,必须等前一条运算完成,产生大量的等待周期。在66MHz的486DX2上,Berkeley软件MPEG解码器对于320×240的标准画面,帧率只有3.3 fps,连幻灯片都算不上。
更糟的是x87的栈式寄存器设计。浮点代码被迫写成“load, load, op, store, pop, pop”的慢速模式,严重受限于load/store带宽。Kahan在1989年就指出,即使把FPU性能翻倍,也只能带来约30%的速度提升,因为瓶颈根本不在运算本身,而在寄存器栈的结构性缺陷。
MPEG-1解码需要的计算量,486的FPU根本扛不住。运动补偿和图像重建占了约56%的计算量,色彩空间转换又占约24%,这些操作需要频繁访问内存,而486有限的内存带宽让一切都慢得不可救药。所以需要我。我绕过CPU的浮点单元,用专用硬件直接完成解码。486的FPU有多慢,我存在的意义就有多大。我不是486的助手,我是486的解药。
1996年3月5日,Intel公布了MMX技术。1997年1月,搭载MMX的Pentium处理器正式出货。
MMX没有去修复486遗留的FPU问题。它绕开了。57条新指令,8个64位MMX寄存器,四种打包整数数据类型,SIMD——单指令多数据。它不碰浮点,而是用整数并行处理像素、音频采样、图形数据。一个时钟周期内并行处理多个数据,这正是MPEG解码中大量存在的像素级和采样级并行操作所需要的。
我是专用硬件。我只能做MPEG-1解码。MMX是通用指令集,它被集成在CPU里,和整数运算、地址计算、程序控制共享同一套流水线。它什么都能做,虽然每一样都不如我快。但“什么都能做”打败了“只做一件事”。
我卖几百块钱。我占用一个宝贵的ISA或PCI插槽。我需要额外的驱动和配置。MMX不需要。它已经在你买的CPU里了,边际成本为零。用户升级CPU,就自动获得了MMX能力。
1997年,豪杰超级解霸的MMX版本出现了。XingPlayer出现了。这些软件播放器使用MMX指令进行软解压,不需要任何额外硬件。Pentium 166 MMX在运行多媒体应用时性能比同频普通Pentium高出50%左右。Pentium 166以上的机器,软解VCD已经可以流畅了。有一个清晰的用户记忆:“一直以MMX 166的出现,解压卡才没落了,因为CPU能独立解压了”。另一个用户说,奔腾75的软解压画面像幻灯片,必须依靠解压卡;而到了1996年MMX发布之后,这一状况被改善了。
软件解压免费、灵活、可以随CPU升级而自动变快。我插在机器里,不会变快,只会变旧。
MMX只是开始。Pentium II来了,Pentium III来了。SSE出现了,独立的128位寄存器终于让浮点和SIMD不再互斥。软解压的画质越来越好,CPU越来越快。到PII时代,“借助当时MMX强大的CPU,彻底让VCD流畅了。从此硬解卡也无人问津了”。
我不是被MMX杀死的。我是被“CPU什么都能干”这个不可逆转的趋势碾过去的。
有时候我会想,如果486的FPU有流水线,如果x87不是栈式设计,如果内存带宽再宽一点——我是不是就不会被造出来?
我在的时候,486的FPU不行,386更不行。我是唯一让电脑能看电影的东西。我把MPEG-1的运算从CPU的浮点单元里接过来,扛在40MHz的RISC核心和专用IDCT硬件上,输出704像素宽的流畅画面。在CPU学会这件事之前,我就是这件事本身。
MMX学会了解压。后来的SSE学会了更好的解压。再后来的GPU把视频解码变成了一个可以完全绕开CPU的固定功能单元。
评论区
共 条评论热门最新