歷史
1996年Intel首先推出了支持MMX的Pentium處理器,極大地提高了CPU處理多媒體數據的能力,被廣泛地套用於
語音合成、
語音識別、音頻視頻編解碼、圖像處理和
流媒體等領域。但是MMX只支持整數運算,浮點數運算仍然要使用傳統的x87
協處理器指令。
由於MMX與x87的
暫存器相互重疊,在MMX代碼中插入x86指令時必須先執行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!。
執行環境
3DNow!指令的執行環境與MMX一樣,都是將8個x87暫存器ST0~ST7的低64位重命名為MMX暫存器MM0~MM7,並依平坦模式進行操作(即指令可以任意訪問這8個暫存器中的任何一個而不必使用
堆疊)。
由於3DNow!使用的
暫存器與x87暫存器重疊,任務切換時,保存x87暫存器狀態的同時也保存了3DNow!的狀態,所以3DNow!不需要作業系統的額外支持。只要CPU支持3DNow!,含有3DNow!代碼的程式可以在只考慮到x87狀態的原有的作業系統上不加修改地運行。
指令集
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。
官方訊息
作為AMD處理器歷史上最古老的
多媒體指令集,3DNow!正在和我們揮手告別,未來的特定AMD處理器將不再提供支持。
AMD通過官方部落格宣布,這些新
處理器中將不會再設定“3DNow! Instructions”的功能標誌位,也就是CPUID擴展功能字的第31位不再為1。開發人員今後必須在使用之前首先檢查當前處理器是否還支持3DNow!,避免導致程式運行失敗,如需要相關指令可套用更新的SSE系列
指令集。
不過例外的是,3DNow!版本的PREFETCH、PREFETCHW指令現在已經自成一體,AMD也計畫今後繼續提供支持。它們在CPUID規範中的功能標誌位是3DNowPrefetch。
但是AMD並沒有公布具體哪些處理器將會放棄支持3DNow!,估計會涉及即將推出的Fusion APU加速處理器和明年的“
推土機”架構產品。
3DNow!指令集簡史:
1996年,Intel Pentium處理器率先加入了MMX指令集,極大地提高了多媒體處理能力,但僅支持整數運算,
浮點運算仍然要使用傳統的x87協處理器指令。隨後在1998年,AMD推出了包含21條新指令的3DNow!指令集
(據說是3D No Waiting!的縮寫),並用於其K6-2處理器,使之成為第一個能夠執行浮點SIMD指令的x86處理器,實現了x86架構下最快的浮點單元,四倍於x87
協處理器。
3DNow!指令集贏得了業界的廣泛支持,包括
微軟DX7都對其進行了最佳化,AMD處理器的遊戲性能得以第一次超越Intel,K6-2和隨後的K6-III成為市場上的熱門產品。
1999年,AMD Athlon處理器發布,3DNow!指令集也增加了5條新指令,成為擴展3DNow!,但是同年Intel又推出了SSE指令集,在提供3DNow!幾乎所有功能的同時大大提高了單精度浮點處理速度,還完全支持IEEE754標準,3DNow!優勢不再。
之後主流作業系統和軟體都開始支持SSE指令集並為其最佳化,AMD 2000年的新款Athlon處理器(代號雷鳥)中也加入了SSE。之後的時間裡,AMD開始致力於AMD64架構的開發,SIMD
指令集方面則跟隨Intel,連續添加了SSE2、SSE3,不再改進3DNow!。