Processzorok 64 biten

64 bites processzorok

Már több mint négy éve jelent meg az első 64 bites x86-os processzor, az Athlon 64, mégsem foglalkoztunk különösebben a 64 bites kiterjesztés témájával. Minek az, mire jó, és különben is, mi az? Amikor az AMD előállt az Athlon 64-gyel, még nem vehettük biztosra, hogy mi fog történni, hiszen aki kicsit is jártas volt a témában, tudhatta, hogy az Intel bizony másképpen képzelte el a 64 bitre való migrálást. És ha az Intel valamit elképzel, akkor az az esetek többségében később úgy is lesz. Ezúttal viszont nem jött be a papírforma.

Az Intel 1978-ban legyártotta az első 8086-ost, az első 16 bites x86-os processzort. 16 bites volt, mert a belső regiszterkészlet 16 bit méretű adatok tárolására volt képes, és a végrehajtó egységek már fel tudtak dolgozni 16 bites adatokat (a memóriacímzés 20 bites volt, de ez most mellékes). Egy évvel később az IBM PC-ben a 8088 debütált, mint a 8086 keskenyebb (16 helyett 8 bit széles) adatbusszal ellátott változata, és gyakorlatilag innentől kezdve számítjuk az x86 felemelkedését. Ezután jött a 286-os, amely a „bitesség” kérdésében nem nyújtott újat, de jóval több memóriát volt képes megcímezni. 1985-ben elkészült az Intel 386DX, az első 32 bites x86-os processzor. 32 bites volt, mert regiszterkészlete 32 bit méretű adategységek tárolására lett felkészítve, ráadásul már 32 biten címezte a (maximum 4 GB) memóriát is, így akkortájt igazi fenevadnak számított. A számítástechnika ezekben az időkben nem fejlődött olyan gyorsan, mint mostanság, ezért a 386, később a 486 és a Pentium egyes verziói egy–három év különbséggel debütáltak.

Szépen telt-múlt az idő, míg 1989-ben az Intel mérnökeinek agyából kipattant az ötlet, hogy kreálni kellene egy teljesen új, 64 bites architektúrát. Ennek okát két tényezőben látták: egyrészt ekkor már javában folyt az első x86-os szuperskalár processzor fejlesztése, és úgy gondolták, hogy az x86-os architektúrák a későbbiekben túlságosan komplexszé válnak, ami gátat fog szabni az órajelemelésnek, így a teljesítménynövelésnek. Másrészt Moore törvényéből kiindulva azt gondolták, hogy 10 évvel később olyan tranzisztorszám-büdzsé áll majd rendelkezésükre, amiből könnyedén kigazdálkodhatnak majd egy nagyon erős, utasításszinten párhuzamosított architektúrát. Ezért az Intel 1989-ben elkezdett dolgozni az EPIC-en, amely a mai IA-64 alapjául szolgál az Itanium processzorokban. Erre később még visszatérünk.

Az évek folyamán egyre több architektúrába építették be a 64 bit támogatását, a MIPS 1991-ben, a DEC 1992-ben, a SPARC 1995-ben, a PowerPC 1997-ben, a Power 1998-ban gazdagodott ezzel, de az x86-ról nem szóltak a hírek. Ehelyett az Intel 94-ben tudomásunkra hozta, hogy dolgozik az IA-64-en, melyet az x86 leváltójaként vizionált. Az Intel úgy tervezte, hogy mint az x86 megalkotója, ő lesz annak eltiprója is, és helyette az IA-64-et fogja befuttatni. A probléma ezzel csupán csak az volt, hogy az x86-alapú processzorok az asztali PC-kben egyre csak terjedtek, ezért az x86 eldobásával szükségszerű lett volna az összes már megírt alkalmazás újraírása, újrafordítása. Ez természetesen senkinek nem lett volna ínyére, hiszen csak azért, mert az Intel azt mondja, nem öltek volna újabb milliókat már megírt alkalmazásokba. Ráadásul ekkor már nem csak az Intel gyártott x86-os processzorokat, ott volt az AMD, a Cyrix, később VIA stb.

Ismét ugorva picit az időben, 1999-be jutunk, amikor az Intel nyilvánosságra hozta a IA-64 utasításkészletet (ISA), és már azt hihették, hogy minden rendben megy, amikor az AMD előállt az x86-64 ötletével. Az Intelnek ennek ellenére is eltökélt szándéka volt az x86 leváltása, ezért az Itaniumot úgy tervezte meg, hogy az x86-tal kompatibilis legyen. Igaz, az Itanium sebessége x86-os kódot futtatva egy Pentiuméval egyezett meg, de ez nem okozott gondot számukra, mert csak egy átmeneti időszakban lett volna szükség erre az emulátorra, később az IA-64-gyel az Intel teljesen uralma alá vette volna a PC-piacot, így mint egyedüli és kizárólagos IA-64-tulajdonos, busás pénz ütötte volna a markát, miközben a kisebb processzorgyártók eltűntek volna a süllyesztőben. Az Intel terve meghiúsult, és ennek egyedül az AMD az oka, hiszen az AMD állt elő az x86 64 bites kiterjesztésével, amellyel most közelebbről is megismerkedünk.

Mitől 64 bit a 64 bit?

Amikor arról van szó, hogy egy adott processzor 16, 32 vagy 64 bites, az mindössze annyit jelent, hogy az általános célú (GP, azaz general purpose) regiszterek 16, 32 vagy 64 bit szélesek, azaz ennyi egymás mellett elhelyezkedő 1-est és 0-t képesek eltárolni egy egységként. Ebből következően a processzor végrehajtó egységei (VE) képesek az adott szélességű adatok feldolgozására. Remélhetőleg a bináris számrendszert a Prohardver! olvasóinak már nem kell bemutatni, de ha már itt tartunk, akkor megemlítjük, hogy 32 biten – ha nem alkalmazunk különféle számábrázolási trükköket – 232–1-ig lehet elszámlálni, míg egy 64 bites processzor esetében ez az egész szám maximálisan 264–1-re emelkedik. A regiszterek felelősek az egész számok és a memóriacímek (melyek egyébként ugyancsak egész számok) tárolásáért. Ezek a processzorban található, nagyon kis méretű memóriarekeszek, melyek a processzor órajelén járnak, ebből következően a központi egység gyakorlatilag egyetlen órajel alatt képes belőlük adatot kiolvasni, vagy beléjük adatot írni, tehát a leggyorsabb memóriáról van szó, amivel találkozhatunk egy rendszerben. Amikor 64 bites programról vagy kódról beszélünk, akkor az annyit jelent, hogy az a program 64 bites adatokkal dolgozik. Ugyanez igaz az utasításokra is, a 16, 32 vagy 64 bites utasítások 16, 32 vagy 64 bites adatokon, operandusokon végeznek el különböző műveleteket.


32 bit

Megpróbáltuk egyszerűen ábrázolni, hogy miről szól ez az egész. Amikor elindítunk egy alkalmazást, az a memóriába kerül utasítások és adatok folyamaként. A processzor ezeket az adatokat és utasításokat dolgozza fel. Amikor egy 32 bites processzorról beszélünk, az egész számok kezelése és a memória megcímzése 32 biten történik, tehát az adatok 32 bit szélesek. Az utasítások mérete nem lényeges, mert azok (szinte) ugyanakkorák 64 biten is. Az adatok/utasítások a memóriából a rendszerbuszon keresztül a processzorba kerülnek (tekintsünk el a hiányzó másodszintű gyorsítótártól az egyszerűség kedvéért), a processzoron belül az adatok az adatcache-be, az utasítások az utasításcache-be kerülnek. Az adatcache-ből az adatok tovább vándorolnak a regiszterek felé (melyek egyelőre 32 bit szélesek), majd innen a végrehajtó egységek felé veszik az irányt, amelyek az utasítások által meghatározott módon egy, két vagy akár több adaton, vagyis operanduson elvégzik a műveletet. Az eredmény szépen visszakerül a regiszterekbe, illetve a cache-be, és a folyamat kezdődik elölről.


64 bit

Egy 64 bites processzorban 64 bit széles általános használatú regiszterek vannak, tehát a processzor képessé válik a 64 bites adatok feldolgozására. Az alkalmazás a memóriába kerül, itt már 32 és 64 bit széles adatokat is találhatunk. Az adatok és utasítások eljutnak a processzor gyorsítótárjaiba, innen ismét kétfelé veszik az irányt. Az adatok a regiszterekbe kerülnek, és itt lényeges, hogy a 64 bites adatok tárolására már rendelkezésre állnak 64 bites regiszterek is, melyek később az utasításokkal „párosítva” ismét a végrehajtó egységekben landolnak, ahol vegyesen 32 és 64 bit széles adatok keletkeznek. A képen az is jól látszik, hogy a szélesebb operandusok szállításához, tárolásához gyorsabb, szélesebb és nagyobb memóriára, rendszerbuszra és gyorsítótárakra van szükség.

Az x86-64 kiterjesztés

Ennyit a szép színes rajzocskákról, és a 64 bitről, lássuk a száraz tényeket és adatokat, melyek már konkrétan az x86-64, tehát az AMD 64 bites kiterjesztésének jellemzői. A 64 bites regiszterekben 64 bit széles memóriacímek férnek el, ezért szükség lesz egy dupla széles utasítás- vagy programmutatóra (instruction/program pointer) is, amely az éppen végrehajtandó utasítás helyére mutat a memóriában (RIP). Az x86-64 gyakorlatilag az x86 64 bitre történő terjesztése, ami azt is jelenti, hogy kompatibilis a már meglévő 32 bites architektúrával. Ennek igen komoly jelentősége van, hiszen nem kell kidobni a már meglévő hardvereket és programokat a futtatáshoz, míg az IA-64 széleskörű bevezetésével ezt nehezen kerülhettük volna el. Használatára végül az Intel is rákényszerült, mert nem hagyhatta, hogy az AMD egyedüliként kínáljon 64 bites x86-os asztali, sőt szerverprocesszort, igaz, az Intel úgy tüntette fel a dolgot, mintha saját fejlesztését adná el Extended Memory 64 Technology (EM64T) név alatt.

A kiterjesztés ugyanakkor azt is jelenti, hogy a kiterjesztett (azaz x86-64) mód használatával a már meglévő regiszterek nem csak dupla (32 helyett 64 bit) szélességűekké válnak, de számuk is megduplázódik (8-ról 16-ra), legalábbis ez a helyzet a GPR-ek esetében. A SIMD-regiszterek (XMM) nem szélesedtek tovább (128 bit), de számuk megduplázódott (8 helyett 16), az x87-es számításokhoz használt regiszterek (ST/MM) szélessége (80 bit) és száma (8) viszont egyáltalán nem változott. A virtuális memóriatartomány címmérete 64 bitre, a fizikai 52 bitesre növekszik, viszont az egyes implementációk esetében lehetnek eltérések, például az Athlon 64 processzorok valójában virtuálisan 48, fizikailag pedig 40 bitet használnak.

Miért jó mindez nekem? Vagy a programozónak?

A GP regiszterek szélességének megduplázása egyrészt a megcímezhető memóriatartomány növelése miatt fontos. 32 biten maximálisan 4 GB a megcímezhető memória mérete. Biztosan találkoztak már páran azzal a jelenséggel, amikor egy 4 GB memóriával telipakolt gépen az operációs rendszer csak 3,5–3,8 GB-ot látott. Ez annak tulajdonítható, hogy a címzésben részt vesz a videokártyán található memória mennyisége is, ezért azt a 4 GB-ból (232) le kell csippenteni. Egy 64 bites processzoron, ha 64 bites operációs rendszert használunk, többé ez nem fordulhat elő. Az igaz, hogy egyelőre nincs túl sok 1–2 GB-nál több memóriával szerelt PC/notebook, de valamikor valaki azt mondta, hogy 640 kB memória elég lesz mindenre, tehát ne higyjük azt, hogy ez így marad az idők végezetéig. Ennek a tulajdonságnak jelenleg inkább a szerverek világában van jelentősége (pl. óriási adatbázisok, szimuláció, modellezés stb. esetén). A széles memóriacímeknek van egy hátránya is, hiszen ha dupla széles számokkal dolgozunk, akkor azok több tárterületet foglalnak el a memóriában, a gyorsítótárakban, tehát ha véletlenül egy ilyen tárolókomponens válik szűk keresztmetszetté a rendszerben, akkor ez csökkentheti a teljesítményt, feleslegesen.

A regiszterszélesség-duplázás másik fontos mellékhatása, hogy 64 bites egész számokkal dolgozhatunk. Ha egy átlagos asztali PC-t veszünk alapul, ennek gyakorlatilag nincs semmilyen hatása ránk nézve, hiszen az átlagos, mindennapi használatban lévő programok bőven megelégednek a 32 bites egész számokkal is. Viszont vannak területek, ahol jól jöhet ez a tulajdonság: titkosító algoritmusok, esetlegesen 64 bites színmélységgel dolgozó, képalkotásra készített alkalmazások, CAD/CAM tervezőprogramok esetében vagy különböző tudományos számításokat végző kutatási projektekben, és még lehetne őket sorolni – ezek is inkább a szerverek, munkaállomások világában elterjedtek, mintsem az otthon, Quake 3-ra használt masinákon.


Előzmények

Hirdetés