词条 | 3D Now |
释义 | 由AMD公司提出的3DNow!指令集应该说出现在SSE指令集之前,并被AMD广泛应用于其K6-2 、K6-3以及Athlon(K7)处理器上。3DNow!指令集技术其实就是21条机器码的扩展指令集。 3D Now-历史1996年Intel首先推出了支持MMX的Pentium处理器,极大地提高了CPU处理多媒体数据的能力,被广泛地应用于语音合成、语音识别、音频视频编解码、图像处理和流媒体等领域。但是MMX只支持整数运算,浮点数运算仍然要使用传统的x87协处理器指令。 由于MMX与x87的寄存器相互重叠,在MMX代码中插入x87指令时必须先执行EMMS指令清除MMX状态,频繁地切换状态将严重影响性能。这限制了MMX指令在需要大量浮点运算的程序,如三维几何变换、裁剪和投影中的应用。 另一方面,由于x87古怪的栈式寄存器结构,使得硬件上将其流水线化和软件上合理调度指令都很困难,这成为提高x86架构浮点性能的一个瓶颈。 为了解决以上这两个问题,AMD公司于1998年推出了包含21条指令的3DNow!指令集,并在其K6-2处理器中实现。K6-2是第一个能执行浮点SIMD指令的x86处理器,也是第一个支持平坦浮点寄存器模型的x86处理器。借助3DNow!,K6-2实现了x86处理器上最快的浮点单元,在每个时钟周期内最多可得到4个单精度浮点数结果,是传统x87协处理器的4倍。许多游戏厂商为3DNow!优化了程序,微软的DirectX 7也为3DNow!做了优化,AMD处理器的游戏性能第一次超过Intel,这大大提升了AMD在消费者心目中的地位。K6-2和随后的K6-III成为市场上的热门货。 1999年,随着AMD Athlon处理器的推出,AMD为3DNow!增加了5条新的指令,用于增强其在DSP方面的性能,它们被称为“扩展3DNow!”(Extended 3DNow!)。 为了对抗3DNow!,Intel公司于1999年推出了SSE指令集。SSE几乎能提供3DNow!的所有功能,而且能在一条指令中处理两倍多的单精度浮点数;同时,SSE完全支持IEEE 754,在处理单精度浮点数时可以完全代替x87。这迅速瓦解了3DNow!的优势。 1999年后,随着主流操作系统和软件都开始支持SSE并为SSE优化,AMD在其2000年发布的代号为“Thunderbird”的Athlon处理器中添加了对SSE的完全支持(“经典”的Athlon或K7只支持SSE中与MMX有关的部分,AMD称之为“扩展MMX”即Extended MMX)。随后,AMD致力于AMD64架构的开发;在SIMD指令集方面,AMD跟随Intel,为自己的处理器添加SSE2和SSE3支持,而不再改进3DNow!。 3D Now-技术讨论世界上第一个针对3D运算所需要的SI MD-FP、MMX等加速特性,以硬件线路作出来的X86CPU。在当初Intel发表的MMX架构只能处理整数,对于3D的影像世界中,大量涌至的坐标转换或数学函数的浮点运算完全帮不上忙,所以3D程序必须藉助CPU的浮点运算电路,有些还得藉助3D加速卡来计算。糟糕的是MMX运算区域在规划上,跟浮点运算的区域重叠,不论软件正在做MMX运算或是浮点运算,都必须使用到这个区域,两种运算形态不能同时存在,因此从MMX与CPU指令过于频繁的切换,反而把MMX加速所省下来的时间来给抵消掉了。 AMD于是将MMX运算架构重新规划改良,加入浮点运算的能力,使得MMX寄存器同时做整数与浮点运算,不但不用频频切换,而且MMX架构的SIMD特性能够同时处理多笔浮点运算,还能大幅提升自家CPU的浮点效能!这正是AMD3DNow!技术的由来。 3DNow!架构 在AMD的规划中,3DNow!技术由新改良的八组AMD3D运算寄存器,也就是由原先MMX寄存器所延伸而成的设计。MMX运算区域有64位宽度,可拆成八个位组、四组16位字(word)、两组32位的长整数,而AMD最特别的还可以拆成两组的32位浮点数,具备24位元的单精确度(SinglePrecision),差不多是小数点后七位数的精确度(最大误差值约3300万分之一)。 透过MMX/AMD3D的SIMD特性,在最佳化的程序码执行状态下,AMDK6-2一个周期内能处理四个浮点运算值,或者在几个周期内做八组、十六个浮点整数资料的直接累加、累乘,浮点运算速度比原来用X87FPU快上几倍到几十倍! 3DNow!性能初体验 以往3D影像处理,需要强悍的浮点运算能力,这正是Intel以外的CPU最弱的一环。也因此AMD决定以SIMD的特性,作出3DNow!的技术。如果将硬件平台,除CPU因PentiumⅡ与K6-2不同而搭配相异的主机板外,其余像内存、硬碟盘、显示卡(还是用Intel最引以为傲的i740)都是同一 组配备,而工作时钟、外频也都维持一致。 MaruBench测试实测结果显示,300MHzK6-2的3D影像产生速率,远远超越300、500,甚至400MHz的PentiumⅡ,如果游戏发展厂商,显示卡开发厂商,肯及早支持AMD3DNow!技术,稍微改写一下游戏程式码、显示卡驱动程式的浮点运算部分,使用AMD-3D指令集去运算的话,就能提升 接近三倍到四倍的效能。 3D Now可怕的利齿 SharpToothAMDK6-3。很快,Super7架构(100MHzSocket7+AGP主机板)即将出现天王巨星级的CPU,这就是研发代号为SharpTooth的K6-3。K6-3最大的卖点,就是内建256KL2Cache于CPU核心,而且运作速度跟CPU时钟同步,这样主机板上的FrontSizeL2Cache,就变成了L3Cache,这一招正是学自DECAlpha高速CPU三个阶段快取架构。 3D Now-执行环境3DNow!指令的执行环境与MMX一样,都是将8个x87寄存器ST0~ST7的低64位重命名为MMX寄存器MM0~MM7,并依平坦模式进行操作(即指令可以任意访问这8个寄存器中的任何一个而不必使用堆栈)。 由于3DNow!使用的寄存器与x87寄存器重叠,任务切换时,保存x87寄存器状态的同时也保存了3DNow!的状态,所以3DNow!不需要操作系统的额外支持。只要CPU支持3DNow!,含有3DNow!代码的程序可以在只考虑到x87状态的原有的操作系统上不加修改地运行。 3D Now-指令集3DNow!和扩展3DNow!的26条指令从功能上可以分为以下五类: 单精度浮点运算指令 此类指令的操作数均为64位,其高32位和低32位分别是IEEE 754格式的单精度浮点数。大部分指令一次可接受两个这样的操作数,并得到两个单精度浮点数的结果。它们的汇编语言助记符都以PF开头。 3DNow!还包含有计算单精度倒数和开方倒数的指令,并可以依程序需要,得到12位精度和24位精度的结果。这些指令一次只能处理一个单精度浮点数。 增强的MMX指令 PAVGUSB用于求64位紧缩字节(8×8位字节)的平均值,可用于视频编码中的像素平均和图像缩放等。可能是意识到这个功能的重要性,Intel在SSE中添加了功能完全相同的PAVGB指令。 PMULHRW则用来补充MMX指令PMULHW的不足,在紧缩无符号字(4×16位字)相乘时可以得到比后者更准确的结果。 数据类型转换指令 PF2ID、PI2FD等4条指令用于完成整数和单精度浮点数之间的相互转换。 数据预取指令 PREFETCH/PREFETCHW指令用于把将要使用到的数据从主存提前装入缓存中,以减少访问主存的指令执行时的延迟。Intel在SSE中添加了类似的PREFETCHTx指令 快速退出MMX状态指令 FEMMS指令与MMX中的EMMS功能相同,用于退出MMX状态。在K6-2和K6-III处理器中,FEMMS比EMMS更快;在Athlon及更新的处理器中,FEMMS等同于EMMS。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。