K8神威終于顯露!純64位應用全球首測
通常我們把需要CPU進行不同處理的單個數據稱為標量數據(Scala Data)。標量數據既可以是整數數據,也可以是浮點數據。其中整數標量數據的存放區一般為通用寄存器(GPR),浮點標量數據的存放區一般為浮點寄存器(FPR)。
與標量數據相對的是矢量數據(Vector Data)。所謂矢量數據就是指一列需要由處理器作相同處理的數據集合。比如處理器在做MP3編碼的過程中,需要對內存中的音頻文件里的各字節數據作相同的MP3編碼操作。那么通常使用MMX或SSE這類單指令多數據流(SIMD)指令,將數個字節打包為一組矢量數據,存放在MMX或SSE寄存器中,再送往相應的功能單元進行統一操作。
和標量數據一樣,這些矢量數據既可以是整數數據,也可以是浮點數據。矢量數據以封包的形式批量存放在MMX(對于使用MMX、3DNow!進行操作的數據而言)和XMM(對于使用SSE、SSE2進行操作的數據而言)寄存器中。
通過下面的圖,我們可以更好地了解標量數據和矢量數據的區別:

標量與矢量數據
以下,我們整理了標量數據和矢量數據在X86-32位處理器以及AMD的X86-64處理器中所用寄存器的具體區別如下表:

實際上,MMX和XMM通過寄存器映射的方法,也可以參與標量浮點數據的存儲。同時數據類型也遠不止整數、浮點這兩類基本數據類型,還包括有指令指針數據、BCD數據,位數據等。要把這些情況一一說清,顯然不是一兩篇文章能解決得了問題的。
幸好,這些省略的部分與我們的結論并沒有影響,因此我們敘述時使用了簡化的措施。需要更詳細完整的資料,您可以參考Intel的IA32以及AMD的X86-64架構編程指導書。
從上表我們可以看見,K8的64位擴展部分似乎僅對于整數、地址數據有效。對浮點和向量數據則仍然保持原樣。
經過上面的分析,我們似乎可以得出這樣的結論,那就是:我們能從K8向64位的擴展所獲得的好處,只不過是可以在同樣一條指令中,處理更大數值的整數數值以及管理空間更大的內存區域而已。而在32位的情況下,由于通用寄存器只能容納最大32位的數據,因此顯然要花費更多條指令對尺寸超過32位的數據進行處理。
這種改進對服務器、科學計算這樣的領域雖然具有一定的意義,但顯然并不是普通家用環境急需的改進。試問在近期普通應用中,有多少情況下會用到超過232這樣大的整數數值和超過4GB的內存空間呢?
然而,如果你因此低估了K8和X86-64指令集的實力,那就大錯特錯了。
關注我們


