AMD Athlon 64系列終極報(bào)告(上):
說(shuō)到K8處理器,大家不免會(huì)想到AMD大肆宣傳的X86-64指令集的概念。而要較為明晰地理解X86-64指令集,就必須從64位處理器的本質(zhì)談起。
● 理解64位指令
我們都知道,處理器所處理的普通指令一般由操作碼(OP Code)和操作數(shù)(Operand)組成。其中操作數(shù)可以是等待處理的數(shù)據(jù),也可以是待處理數(shù)據(jù)的內(nèi)存地址。而操作碼則描述將要對(duì)操作數(shù)進(jìn)行何種處理。
需要強(qiáng)調(diào)的是,通常所說(shuō)的64位指令,并不是指指令的全長(zhǎng)或操作碼的長(zhǎng)度為64位,而是指操作數(shù)所能達(dá)到的最大位數(shù)為64位。通過(guò)下面的圖示,我們可以很好地理解64位指令和64位處理器的本質(zhì)。
64位指令工作原理示意圖
由于操作數(shù)一般需要存放在通用寄存器中,因此64位處理器通用寄存器的尺寸也必須是64位。這樣我們就很容易理解K8處理器里通用寄存器結(jié)構(gòu)的上半部分(指RAX-RSP部分,下半部分我們后邊再提)。如下圖所示:
K8通用寄存器的擴(kuò)展,點(diǎn)擊查看詳圖
從上面的圖示可以看出,相對(duì)于傳統(tǒng)的X86處理器而言,K8在進(jìn)行64位擴(kuò)展的時(shí)侯,把8個(gè)通用寄存器增加到了64位,同時(shí)增加了指令指針寄存器的位數(shù)為64位。
至于尋址方面,由于地址數(shù)據(jù)只不過(guò)是整數(shù)操作數(shù)中的一種,因此同樣使用GPR。這樣,64位處理器所能處理的地址數(shù)據(jù)長(zhǎng)度自然就增加到了64位,從而大大增加了處理器的尋址空間。
當(dāng)然,為了簡(jiǎn)化起見(jiàn),以上我們所說(shuō)的操作數(shù),只不過(guò)是現(xiàn)代CPU所處理的操作數(shù)中的整數(shù)數(shù)據(jù)(地址數(shù)據(jù))。它們由處理器中的ALU(算術(shù)邏輯單元)和AGU(地址生成單元)進(jìn)行處理,一般使用通用寄存器(GPR)來(lái)保存。實(shí)際上,我們還需要處理通常保存在浮點(diǎn)寄存器、MMX以及XMM寄存器里的浮點(diǎn)以及其它多種數(shù)據(jù)。
不過(guò),在我們進(jìn)一步談這些除了整數(shù)和地址數(shù)據(jù)外其它數(shù)據(jù)類型在64位處理器中的處理狀況前,我們必須首先了解一些有關(guān)寄存器和數(shù)據(jù)類型的基本知識(shí)。
● 寄存器和數(shù)據(jù)類型
我們知道:整數(shù)、地址、指令指針和浮點(diǎn)數(shù)據(jù)是按照數(shù)據(jù)形式來(lái)劃分的,CPU所要處理的3種主要數(shù)據(jù)類型。此外我們還可以根據(jù)數(shù)據(jù)需要CPU進(jìn)行處理的類型,來(lái)將它們分為標(biāo)量數(shù)據(jù)和矢量數(shù)據(jù)兩大類。
通常我們把需要CPU進(jìn)行不同處理的單個(gè)數(shù)據(jù)稱為標(biāo)量數(shù)據(jù)(Scala Data)。標(biāo)量數(shù)據(jù)既可以是整數(shù)數(shù)據(jù),也可以是浮點(diǎn)數(shù)據(jù)。其中整數(shù)標(biāo)量數(shù)據(jù)的存放區(qū)一般為通用寄存器(GPR),浮點(diǎn)標(biāo)量數(shù)據(jù)的存放區(qū)一般為浮點(diǎn)寄存器(FPR)。
與標(biāo)量數(shù)據(jù)相對(duì)的是矢量數(shù)據(jù)(Vector Data)。所謂矢量數(shù)據(jù)就是指一列需要由處理器作相同處理的數(shù)據(jù)集合。比如處理器在做MP3編碼的過(guò)程中,需要對(duì)內(nèi)存中的音頻文件里的各字節(jié)數(shù)據(jù)作相同的MP3編碼操作。那么通常使用MMX或SSE這類單指令多數(shù)據(jù)流(SIMD)指令,將數(shù)個(gè)字節(jié)打包為一組矢量數(shù)據(jù),存放在MMX或SSE寄存器中,再送往相應(yīng)的功能單元進(jìn)行統(tǒng)一操作。
和標(biāo)量數(shù)據(jù)一樣,這些矢量數(shù)據(jù)既可以是整數(shù)數(shù)據(jù),也可以是浮點(diǎn)數(shù)據(jù)。矢量數(shù)據(jù)以封包的形式批量存放在MMX(對(duì)于使用MMX、3DNow!進(jìn)行操作的數(shù)據(jù)而言)和XMM(對(duì)于使用SSE、SSE2進(jìn)行操作的數(shù)據(jù)而言)寄存器中。
通過(guò)下面的圖,我們可以更好地了解標(biāo)量數(shù)據(jù)和矢量數(shù)據(jù)的區(qū)別:
標(biāo)量與矢量數(shù)據(jù)
以下,我們整理了標(biāo)量數(shù)據(jù)和矢量數(shù)據(jù)在X86-32位處理器以及AMD的X86-64處理器中所用寄存器的具體區(qū)別如下表:
實(shí)際上,MMX和XMM通過(guò)寄存器映射的方法,也可以參與標(biāo)量浮點(diǎn)數(shù)據(jù)的存儲(chǔ)。同時(shí)數(shù)據(jù)類型也遠(yuǎn)不止整數(shù)、浮點(diǎn)這兩類基本數(shù)據(jù)類型,還包括有指令指針數(shù)據(jù)、BCD數(shù)據(jù),位數(shù)據(jù)等。要把這些情況一一說(shuō)清,顯然不是一兩篇文章能解決得了問(wèn)題的。
幸好,這些省略的部分與我們的結(jié)論并沒(méi)有影響,因此我們敘述時(shí)使用了簡(jiǎn)化的措施。需要更詳細(xì)完整的資料,您可以參考Intel的IA32以及AMD的X86-64架構(gòu)編程指導(dǎo)書。
從上表我們可以看見(jiàn),K8的64位擴(kuò)展部分似乎僅對(duì)于整數(shù)、地址數(shù)據(jù)有效。對(duì)浮點(diǎn)和向量數(shù)據(jù)則仍然保持原樣。
經(jīng)過(guò)上面的分析,我們似乎可以得出這樣的結(jié)論,那就是:我們能從K8向64位的擴(kuò)展所獲得的好處,只不過(guò)是可以在同樣一條指令中,處理更大數(shù)值的整數(shù)數(shù)值以及管理空間更大的內(nèi)存區(qū)域而已。而在32位的情況下,由于通用寄存器只能容納最大32位的數(shù)據(jù),因此顯然要花費(fèi)更多條指令對(duì)尺寸超過(guò)32位的數(shù)據(jù)進(jìn)行處理。
這種改進(jìn)對(duì)服務(wù)器、科學(xué)計(jì)算這樣的領(lǐng)域雖然具有一定的意義,但顯然并不是普通家用環(huán)境急需的改進(jìn)。試問(wèn)在近期普通應(yīng)用中,有多少情況下會(huì)用到超過(guò)232這樣大的整數(shù)數(shù)值和超過(guò)4GB的內(nèi)存空間呢?
然而,如果你因此低估了K8和X86-64指令集的實(shí)力,那就大錯(cuò)特錯(cuò)了。
關(guān)注我們
