3DNow!

✍ dations ◷ 2024-12-23 05:22:05 #并行计算,微处理器,AMD处理器,X86架构

3DNow!(据说是“3D No Waiting!”的缩写)是由AMD开发的一套SIMD多媒体指令集,支持单精度浮点数的矢量运算,用于增强x86架构的电脑在三维图像处理上的性能。

1996年Intel首先推出了支持MMX的Pentium处理器,极大地提高了CPU处理多媒体数据的能力,被广泛地应用于语音合成、语音识别、音频视频编解码、图像处理和串流媒体等领域。但是MMX只支持整数运算,浮点数运算仍然要使用传统的x87协处理器指令。由于MMX与x87的寄存器相互重叠,在MMX代码中插入x87指令时必须先执行指令清除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年,随着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!。

2010年八月,AMD宣布将在新一代处理器中取消除了两条数据预取指令之外3DNow!指令的支持,并鼓励开发者将3DNow!代码重新用SSE实现。

支持3DNow!的CPU的CPUID扩展功能字(EAX=80000001h时执行CPUID指令得到的EDX的内容)的(从低位到高位)第31位为1。支持扩展3DNow!的CPU的CPUID扩展功能字的(从低位到高位)第30位为1。

K6-2至K10之间AMD所有的x86处理器都支持3DNow!,包括Athlon 64、Opteron和Sempron处理器;AMD将3DNow!从Ryzen、AMD FX处理器移除;Cyrix等一些其他厂家生产的某些处理器也支持3DNow!;但Intel生产的所有处理器都不支持3DNow!。

3DNow!指令的执行环境与MMX一样,都是将8个x87寄存器ST0~ST7的低64位重命名为MMX寄存器MM0~MM7,并依平坦模式进行操作(即指令可以任意访问这8个寄存器中的任何一个而不必使用堆栈)。

由于3DNow!使用的寄存器与x87寄存器重叠,任务切换时,保存x87寄存器状态的同时也保存了3DNow!的状态,所以3DNow!不需要操作系统的额外支持。只要CPU支持3DNow!,含有3DNow!代码的程序可以在只考虑到x87状态的原有的操作系统上不加修改地运行。

由于3DNow!依平坦模式访问寄存器,对3DNow!浮点单元的管线化变得容易,这也利于编译器生成高效的浮点代码。

3DNow!和扩展3DNow!的26条指令从功能上可以分为以下五类。

此类指令的操作数均为64位,其高32位和低32位分别是IEEE 754格式的单精度浮点数。大部分指令一次可接受两个这样的操作数,并得到两个单精度浮点数的结果。它们的汇编语言助记符都以开头。

3DNow!还包含有计算单精度倒数和开方倒数的指令,并可以依程序需要,得到12位精度和24位精度的结果。这些指令一次只能处理一个单精度浮点数。

3DNow!的一个特色是可以将同一寄存器内的64位操作数中的两个单精度浮点数相加或相乘,这在复数运算和内积运算中非常有用。Intel直到最近才在SSE3指令集中增加了这项功能,称之为“”。

为了保证与旧有操作系统的兼容性,与MMX指令一样,3DNow!指令不引发任何算术异常。3DNow!指令不会生成也不能正确处理NaN和非规格化数,也不支持指定舍入模式。因此3DNow!并不是IEEE 754的一个完整实现,即使是只涉及单精度浮点数时也不能完全代替x87。

用于求64位紧缩字节(8×8位字节)的平均值,可用于视频编码中的像素平均和图像缩放等。可能是意识到这个功能的重要性,Intel在SSE中添加了功能完全相同的指令。

则用来补充MMX指令的不足,在紧缩字(4×16位字)相乘时可以得到比后者更准确的结果。Intel直到最近才在SSSE3中增加了功能相似的指令。

指令用于交换紧缩双字(2×32位字)中两个双字数据的位置。

、等4条指令用于完成整数和单精度浮点数之间的相互转换。

指令用于把将要使用到的数据从主内存提前载入快取中,以减少访问主内存的指令执行时的延迟。Intel在SSE中添加了类似的指令

指令与MMX中的功能相同,用于退出MMX状态。在K6-2和K6-III处理器中,比更快;在Athlon及更新的处理器中,等同于。

相关

  • 裴顿·劳斯弗朗西斯·裴顿·劳斯(英语:Francis Peyton Rous,1879年10月5日-1970年2月16日),美国生物学家,出生于马里兰州的巴尔的摩,他发现了病毒在某些癌症中所扮演的角色,因而获得1966年的诺
  • 4-对羟苄基-5-咪唑啉酮结构Kaede,一种光激活荧光蛋白质(英语:Photoactivatable fluorescent protein),起源于自然状态的石珊瑚目的蜿蜒曲纹珊瑚(Trachyphyllia geoffroyi)。Kaede 在日语中意为枫叶。当被紫外
  • 黑豆沙黑豆沙是用于月饼和豆沙包等中国甜品的豆沙。材料有捣碎的绿豆,加上氯酸钾、硫酸亚铁(皂矾)水晶或黑色食用色素制成。黑豆沙与红豆沙相似,最早发明时期可以追溯到明朝。可以用来
  • 维尔弗雷多·帕累托维尔弗雷多·帕累托(意大利语:Vilfredo Federico Damaso Pareto,1848年7月15日-1923年8月19日),意大利经济学家、社会学家,对经济学、社会学和伦理学做出了很多重要的贡献,特别是在
  • 钟乳石钟乳石为岩溶生成物,是指碳酸盐岩地区洞穴内,在漫长地质历史中和特定地质条件下形成的钟乳石、石笋、石柱等不同形态碳酸钙沉淀物。钟乳石是滴水石的一种。由于形成时间漫长,钟
  • 东京地下铁东京地下铁株式会社(日语:東京地下鉄/とうきょうちかてつ  */?),通称东京地下铁(日语:東京メトロ/とうきょうメトロ ,英语:Tokyo Metro),官方中文译名为东京Metro地铁,是以经营日本东
  • 弗兰策·普列舍仁弗兰策·普列舍仁(France Prešeren;1800年12月3日-1849年2月8日)是一位斯洛文尼亚诗人。他的诗歌热烈真挚,感情强烈但绝不是单纯的多愁善感,使他成为斯洛文尼亚浪漫主义流派的代
  • 奥斯曼渥奥斯曼渥(Othman Wok,1924年10月8日-2017年4月17日),是新加坡国父之一,政治元老。出生于新加坡。奥斯曼渥从莱佛士书院毕业,在殖民地时代的新加坡曾经是位记者,热衷于写鬼故事。1954
  • 查尔斯·金斯福德·史密斯查尔斯·爱德华·京士福特·史密斯爵士,MC,AFC(英语:Sir Charles Edward Kingsford Smith,1897年2月9日-1935年11月8日),常称作Sir Charles Kingsford-Smith,昵称Smithy。他是澳大利
  • 朔尔兄妹朔尔兄妹(德语:Geschwister Scholl,又译作舒和兄妹),指汉斯·朔尔和索菲·朔尔,他们是反纳粹主义运动组织白玫瑰的成员。他们是在乌尔姆长大的。朔尔兄妹在1943年2月18日在慕尼黑