90年代英特尔奔腾MMX编程回顾:SIMD技术早期探索,为现代CPU发展奠基

发布时间:2026/8/17 16:57:31
90年代英特尔奔腾MMX编程回顾:SIMD技术早期探索,为现代CPU发展奠基 90年代英特尔奔腾MMX编程SIMD技术的早期探索与应用如果你在90年代末编写过PC程序或许记得内置英特尔奔腾MMX技术的贴纸。MMX不仅是当时热门的营销术语更是英特尔将单指令多数据SIMD指令引入主流桌面CPU的重大尝试。完成软件渲染模块学习的学生常询问并探索SIMD相关主题。如今我们有AVX - 512、NEON、SVE及拥有数千个核心的GPU等现代CPU及其扩展技术它们是多年探索、学习和市场推动的结果也承载着大量历史和向后兼容性问题。而在90年代末许多程序员通过手写汇编代码从奔腾MMX处理器中挤出额外帧数。回到1997年看MMX编程1997年MMX多媒体扩展随奔腾MMX处理器推出旨在提升多媒体体验涵盖图形、数字信号处理、音频和调制解调器软件等领域。它是内置在奔腾芯片中的57条额外指令用于提升性能。CPU需切换到MMX模式在此模式下x86的8个80位浮点寄存器的前64位会转变为MMX寄存器。MMX的理念很简单CPU不再一次处理一个整数而是同时处理封装在单个64位寄存器中的多个整数。对于多媒体软件而言这能显著提升处理速度。例如不使用MMX需逐个进行8次字节加法运算而使用MMX只需一条指令就能完成。这就是并行处理也是SIMD的核心思想。SIMD并行处理技术单指令多数据SIMD是一种并行处理技术指计算机拥有多个处理单元能同时对多个数据点执行相同操作。SIMD可以是计算机硬件设计的一部分并可通过指令集架构ISA直接访问。就MMX而言英特尔对其x86指令集进行了扩展加入了新的SIMD指令。MMX并非首个SIMD技术MMX不是首个SIMD技术但在推动SIMD在x86 PC上成为主流方面发挥了重要作用。SIMD的出现比英特尔的MMX早了几十年其使用一条指令处理多个数据元素的理念可追溯到比奔腾处理器更早的时期。60年代的ILLIAC IV超级计算机项目是著名的早期例子它是第一台大规模并行计算机最初设计为拥有256个64位浮点运算单元FPU和4个中央处理器CPU每秒能够处理10亿次运算。ILLIAC IV使用大量处理单元在单个指令流的控制下运行是现代SIMD/向量架构的重要先驱。60年代到80年代期间CDC、Cray等公司也推出过阵列处理计算机。不过向量处理和SIMD并不完全相同它们的主要区别在于多个数据元素如何呈现给处理器以及硬件如何执行这些操作。SIMD操作从根本上与寄存器的宽度相关。1976年推出的Cray - 1是典型的向量处理器它拥有8个64元素的向量寄存器每个寄存器可存储64位的值。与SIMD类似Cray - 1也不需要64条单独的加法指令但它与SIMD存在架构上的差异。SIMD操作的是固定宽度的寄存器而Cray - 1中的向量寄存器更像是一个序列容器。MMX的意义与局限SIMD并非由英特尔发明MMX的真正意义在于将相对易于使用的SIMD指令集引入主流x86 PC是SIMD从专业/高性能计算领域迈向普通桌面软件开发的重要转折点之一。英特尔让MMX复用了浮点栈寄存器MMX寄存器是x87浮点寄存器的别名每个MMX寄存器宽度为64位但底层浮点寄存器长度为80位MMX仅访问其低64位。这一设计节省了芯片面积但也带来限制SIMD操作和浮点操作互斥MMX多媒体操作和浮点操作无法同时进行。因此在混合使用MMX和x87浮点代码之前必须先进行清理。MMX的应用与特性单个MMX寄存器有不同的数据布局根据所使用的指令同一个寄存器可以呈现出多种布局。以将8个像素相加为例普通代码需多次循环而使用MMX只需几条指令一条指令就替代了8次单独的加法运算。MMX还能执行饱和算术运算避免普通整数运算的回绕问题在处理图形时非常有用。此外MMX提供了比较指令、移位打包值功能和打包乘法运算可应用于图形和其他多媒体任务如创建掩码、亮度调整、音频音量缩放等。实际示例与EMMS指令以提高图像亮度的例程为例不使用MMX的代码需逐个处理像素而使用MMX可以一次处理8个像素这正是图形库喜爱的优化方式。由于MMX借用了原始x86架构中的浮点寄存器使用完MMX后必须使用emms指令清除MMX状态使x87浮点指令能够正常工作否则程序后续可能会出现奇怪的浮点错误。游戏中的MMX应用奇怪的是使用MMX的游戏并没有想象中那么多。除了MMX本身存在局限性外MMX推出时GPU和3D硬件加速卡正逐渐进入PC市场专门的3D硬件开始接管原本可能从CPU端优化中受益的工作负载。不过在DOS末期和Windows 95早期CPU常常是无加速游戏的性能瓶颈。MMX在软件纹理映射、精灵合成、阿尔法混合、图像缩放、MP3解码、调制解调器软件、MPEG视频播放、音频混合等例程中得到了应用。Novalogic公司《科曼奇3》的主要程序员凯尔·弗里曼提到该游戏在音频和图形处理方面大量使用了MMX指令。在软件渲染器中需要或受益于MMX增强功能的游戏包括《橡皮擦大逆转》《POD》和《极限攻击》。曾有传闻称《古墓丽影》有一个为游戏的光照和纹理添加MMX增强功能的补丁但未找到可靠来源证实。尽管《雷神之锤》和《雷神之锤2》常被作为受益于MMX技术的游戏示例但原版《雷神之锤》于1996年发布早于1997年英特尔推出的奔腾MMX其高性能主要通过寄存器分配、循环优化、查找表和手写x86代码等技术实现而非依赖MMX。采用了MMX的应用程序会提供可选的MMX代码路径在CPU支持新指令时启用开发者通常也会维护一个非MMX版本。检测MMX支持与AMD的3DNow!技术软件不能默认CPU支持MMX常见做法是使用CPUID指令检测。EDX寄存器的第23位表示是否支持MMX若该位被置位程序可安全执行MMX指令否则应回退到标量非MMX实现。EDX寄存器中的其他位还能告知不同的支持技术。几年后《雷神之锤2》增加了对3DNow!技术的支持。3DNow!由AMD设计概念上与MMX类似在基础x86指令集中添加了SIMD指令支持使用向量寄存器进行浮点SIMD操作。它同样使用64位的MMX寄存器但增加了针对浮点SIMD的指令。首款搭载3DNow!技术的处理器是1998年的AMD K6 - 2。2001年Id Software在GPL许可下发布了《雷神之锤2》3.19版本的源代码3DNow!相关代码并非原始3.19版本源代码的一部分而是由AMD/Id Software单独发布了经过3DNow!优化的《雷神之锤2》v3.20版本且这些版本以预编译二进制文件的形式分发无源代码。3DNow!技术的失败与SSE的出现3DNow!从未像MMX那样受欢迎MMX应用范围更广因为它领先一步。英特尔在1997年1月推出MMX而AMD的3DNow!直到1998年才出现。且英特尔在x86市场占据巨大份额选择MMX意味着可能支持更多的PC游戏玩家3DNow!是AMD特有的扩展技术。2001年英特尔在1999年随奔腾III推出的SSE流式SIMD扩展对3DNow!和MMX来说是重大转折点。SSE引入了标量和打包浮点指令消除了MMX不允许浮点代码和SIMD同时存在的旧限制。SSE对3DNow!威胁更大因其基本功能相同但SSE拥有更强大且最终成为行业标准的架构。不过MMX在整数SIMD方面仍然表现出色SSE并未立即使MMX过时。MMX的淘汰与总结大多数复古技术爱好者认为英特尔在2000年推出的SSE2让旧的MMX寄存器变得不再必要。SSE2将MMX擅长的整数SIMD功能引入更新的XMM寄存器架构提供了128位的XMM寄存器并为x86架构添加了丰富的整数SIMD操作。与旧的MMX寄存器相比使用SSE2一次可以处理更多像素。MMX并非能让整个CPU提速的神奇涡轮增压按钮它只是为CPU提供了新工具不会自动提升原有工具的性能。新的奔腾MMX芯片有一些改进如更大的缓存但这与MMX有无并无直接关系。按照今天的标准MMX可能显得微不足道但它引入的一些理念至今仍在使用如打包数据、向量化算术运算、饱和操作、数据并行编程、显式SIMD优化等。后来的SSE、AVX等技术将寄存器扩展现代CPU可通过向量扩展技术每条指令处理数百字节的数据都可追溯到最初的MMX指令。对于90年代末的许多程序员来说MMX是他们首次接触从向量而非单个值的角度思考算法改变了对性能关键代码的思考方式。MMX是一次成功的技术过渡但并非特别长寿的指令集它是PC编程发展历程中的重要里程碑。以上就是对旧奔腾CPU中MMX技术的简要回顾。如果你对本文有建议可在Twitter上与作者交流也别忘了访问课程页面获取复古编程讲座内容。