概要
簡史1996年,IntelPentium處理器率先加入了MMX指令集,極大地提高了多媒體處理能力,但僅支持整數運算,浮點運算仍然要使用傳統的x87協處理器指令。隨後在1998年,AMD推出了包含21條新指令的3DNow!指令集(據說是3DNoWaiting!的縮寫),並用於其K6-2處理器,使之成為第一個能夠執行浮點SIMD指令的x86處理器,實現了x86架構下最快的浮點單元,四倍於x87協處理器。
3DNow!指令集贏得了業界的廣泛支持,包括微軟DX7都對其進行了最佳化,AMD處理器的遊戲性能得以第一次超越Intel,K6-2和隨後的K6-III成為市場上的熱門產品。
1999年,AMDAthlon處理器發布,3DNow!指令集也增加了5條新指令,成為擴展3DNow!,但是同年Intel又推出了SSE指令集,在提供3DNow!幾乎所有功能的同時大大提高了單精度浮點處理速度,還完全支持IEEE754標準,3DNow!優勢不再。
之後主流作業系統和軟體都開始支持SSE指令集並為其最佳化,AMD2000年的新款Athlon處理器(代號雷鳥)中也加入了SSE。之後的時間裡,AMD開始致力於AMD64架構的開發,SIMD指令集方面則跟隨Intel,連續添加了SSE2、SSE3,不再改進3DNow!。
指令集
3DNow!和擴展3DNow!的26條指令從功能上可以分為以下五類:單精度浮點運算指令
此類指令的運算元均為64位,其高32位和低32位分別是IEEE754格式的單精度浮點數。大部分指令一次可接受兩個這樣的運算元,並得到兩個單精度浮點數的結果。它們的彙編語言助記符都以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通過官方部落格宣布,這些新處理器中將不會再設定“3DNow!Instructions”的功能標誌位,也就是CPUID擴展功能字的第31位不再為1。開發人員今後必須在使用之前首先檢查當前處理器是否還支持3DNow!,避免導致程式運行失敗,如需要相關指令可套用更新的SSE系列指令集。不過例外的是,3DNow!版本的PREFETCH、PREFETCHW指令現在已經自成一體,AMD也計畫今後繼續提供支持。它們在CPUID規範中的功能標誌位是3DNowPrefetch。
但是AMD並沒有公布具體哪些處理器將會放棄支持3DNow!,估計會涉及即將推出的FusionAPU加速處理器和明年的“推土機”架構產品。