请输入您要查询的百科知识:

 

词条 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/1/11 13:09:40