1 Uvod Razvoj arhitektur procesorjev ameriškega izdelovalca Intel sega v daljno leto 1969, ko je bil narejen prvi mikroprocesor 4004. Več o tem lahko preberemo v [1], kjer smo pisali o družini P6 procesorjev Intel, ki se je razvijala do leta 2004. V zadnjih nekaj letih je Intel naredil izjemen skok v tehnologiji, saj je od osmih milijonov tranzistorjev, kolikor jih je vseboval P3, naredil integrirane komponente že z več kot milijardo tranzistorjev. V [2] si poglejmo nekaj značilnih konfiguracij, ki jih ponuja Intel, in kako so se od P3 povečevale zmogljivosti mikroprocesorjev. Že ob bežnem pregledu različic procesorjev, opazimo velik tehnološki skok v razvoju le-teh v nekaj več kot petih letih. Procesorji družine P6 in 8086 res nimajo veliko skupnega, čeprav programi za 8086 še vedno tečejo na najnovejšem izdelku Intelove načrtovalske hiše. Osnova razvoja so bili uveljavljeni procesorji Intel Pentium 4, Xeon, Xeon MP, Pentium 3 in Pentium 3 Xeon z vgrajenim predpomnilnikom (PP). 2 Načini delovanja Procesorji Intel 64 ali IA-32 imajo pet načinov delovanja. • Začetni način (real address mode) se postavi ob vklopu in omogoča skladnost s programsko opremo Intel 8086, od tod pa je mogoč preklop v druge načine: zaščiteni ali sistemsko upravljanje s pomnilnikom. • Zaščiteni način (protected mode) je najprimernejše stanje delovanja procesorja za nove aplikacije. Hkrati omogoča delovanje začetnega načina (real address mode) in procesiranje programske opreme za 8086 v zaščitenem, večopravilnem okolju. Ta možnost se imenuje tudi virtualni 8086 način (virtual 8086 mode), čeprav tu le-ta ni več poseben način delovanja. • Sistemsko upravljanje SMM (System Management Mode) se začne z zunanjo prekinitvijo. Ta način je bil uveden s '386 in '486 mikroprocesorji, v IA-32 pa je postal v pentiumih stalnica. • Kompatibilnostni način (Compatibility mode) omogoča večini 16-bitnih in 32-bitnih aplikacij, da tečejo tudi v 64-bitnem operacijskem sistemu, ne da bi jih bilo treba prej prevesti. Ta način je zelo podoben zaščitenemu 32-bitnemu načinu, aplikacije lahko naslavljajo le prvih 4 G bajtov Prejet 6. december, 2006 Odobren 14. marec, 2007 Guštin 202 linearnega pomnilniškega prostora. Komatibilnostni način uporablja 16- in 32-bitne operande in omogoča – tako kot zaščiteni – naslavljanje več kot 4 GB (uporabljajoč razširitev fizičnega pomnilnika, PAE). • 64-bitni način omogoča 64-bitnemu operacijskemu sistemu da uporablja 64-bitne aplikacije, ki dostopajo do 64-bitnega linearnega prostora. Ta način ima več splošnih registrov (16), ki so vsi 64-bitni in 8 dodatnih registrov za razširjene multimedijske ukaze. V tem načinu spoznamo tudi novo predpono za dolžino operanda nad 32 bitov, REX (register extension). Privzeta dolžina naslova je 64 bitov, medtem ko je operanda 32. Dolžino operanda s predpono REX spremenimo iz 32 v 64 bitov. Podobno smo delali v zaščitenem načinu, ko smo izbirali med 16 in 32 bitnimi operandi! Zaradi nove dolžine operandov je bilo dodanih (k obstoječemu naboru) kar nekaj novih ukazov, ki delajo s 64- bitnim naslovom in 64-bitnim operandom. Domnevamo, da so nam lastnosti procesorjev Pentium 3 in 4 poznane, zato tukaj posredujemo le nekatere novosti, predvsem tiste za 64-bitni način delovanja. Intelovi 64-bitni procesorji lahko izvajajo tako 32- bitne programe (kompatibilnostni način) kot 64-bitne (64-bitni način). Zato opišimo naprej 32-bitno okolje. 2.1 32-bitno programsko in hardversko okolje Naslovni prostor: Vsak program, ki teče na procesorjih IA-32 naslavlja do 4G bajtov (ali 2**32 bajtov) linearnega prostora in 64 G bajtov (2**36 bajtov) fizičnega prostora (kako to naredi v [2]). • Osnovni programski registri: Procesor ima – kot vemo – - osem delovnih 32-bitnih registrov (akumula- torjev), EAX, EBX, ECX, EDX, EDI, ESI, EBP ter ESP in - šest 16-bitnih segmentnih registrov, CS, DS, ES, SS, FS in GS, - register stanja EFLAG, ter - programski števec EIP, oba sta 32-bitna. Vsi 32-bitni registri imajo pred imenom E(xtended). To hardversko okolje jim omogoča izvajati programe za celoštevilčno aritmetiko nad bajti, besedami in dvojnimi besedami. Prav tako ima tudi nekaj ukazov za delo z nizi in za nadzor programskega toka (skoki). • Registri za delo s plavajočo vejico (x87 FPU registers): - osem splošnih 80-bitnih delovnih registrov: - kontrolni register, register stanja FPU in tag register (vsi so 16-bitni), ukazni in operandni kazalec (oba sta 48-bitna) in 11-bitni register operacijske kode so namenjeni izvajanju ukazov za računanje v plavajoči vejici (PV) v enojni in dvojni natančnosti. Hkrati lahko ista enota izvaja tudi operacije nad celimi števili, besedami, dvojnimi in štirikratnimi besedami ter števili v BCD kodi. Registrski niz je tu samostojen in si ga ta enota ne deli z MMX, kot pri prvih različicah procesorja Pentium. • registri MMX: - osem 64-bitnih registrov za multimedijske (MMX) ukaze, MMX0 do MMX7 omogoča izvajanje enega ukaza nad več podatki (Single Instruction Multiple Data, SIMD), ki so organizirani v 8 bajtov, 4 besede, 2 dvojni besedi ali 1 četverno besedo. • registri XMM: - osem 128-bitnih registrov za multimedijske (MMX) ukaze, XMM0 do XMM7, in register MXCSR, omogočajo izvajanje SIMD ukazov nad 128 biti, ki so organizirani v 16 bajtov, 8 besed, 4 dvojne besede ali 2 četverne besede, ali 4 vrednosti v enojni natančnosti 32-bitni plavajoči vejici (PV) ali 2 vrednosti v 64-bitni dvojni natančnosti v PV. • Sklad: sklad je organiziran – tako kot doslej – v pomnilniku. Poleg teh delavnih registrov imajo procesorji IA–32 še množico registrov za sistemske finkcije: kontrolne registre (CR0-CR4), registre za upravljanje pomnilnika (GDTR, LDTR, IDTR), registre za razhroščevaneje (DR0 – DR7) itd. 2.2 64-bitno programsko in hardversko okolje. • Naslovni prostor: Vsak program, ki teče na procesorjih IA-32, v 64-bitnem načinu lahko naslavlja 2**64 bajtov linearnega prostora in 256 G bajtni (2**40 bajtov) fizični prostor. • Osnovni programski registri: procesor ima 8 dodatnih registrov, torej: - šestnajst delovnih 64-bitnih registrov (akumulatorjev, označenih spredaj z R, RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP in R8, R9, …, R15) ter - šest 16-bitnih segmentnih registrov, CS, DS, ES, FS, GS, SS, - register stanja RFLAG (zgornji 32-bitov ni uporabljenih), ter - programski števec RIP, oba registra sta 64-bitna. • Registri (x87 FPU registers) za delo s plavajočo vejico in Intelovi 64-bitni procesorji 203 • Registri MMX so isti kot pri 32-bitnem načinu! • Registri XMM, imajo osem registrov več kot prej, torej: - šestnajst 128-bitnih registrov za multimedijske (MMX) ukaze. Ker je procesor superskalarni in supercevovodni stroj, ima več procesnih enot, zato ni mogoče prenašati vsebine registrov med posameznimi enotami v okviru CPE, pač pa le prek (pred)pomnilnika! 3 Organizacja glavnega pomnilnika Mikroprocesor naslavlja fizični pomnilnik in ta je organiziran po bajtnih. Vsakemu bajtu se dodeli fizični naslov, ki gre tja do 64 G bajtov (ali 2**36 bajtov). V 32-bitni organizaciji procesorja poznamo tri načine dostopa do pomnilnika: - Linearni (ali flat) model omogoča zaporedno ali linearno naslavljanje 4G linearnega prostora. - Segmentiranje omogoča naslavljanje 16.383 segmentov, kjer je lahko vsak velik 4G bajtov ali 2**32 bajtov. V obeh modelih lahko dodamo tudi stranjenje, kar pomeni, da postane naslov virtualni naslov! O tem, kako deluje virtualno naslavljanje s stranmi, ki so lahko 4k, 2M ali 4M, smo že pisali v [2]. - Naslavljanje v začetnem (real-mode) načinu smo poznali že prej (pri 8086) in omogoča naslavljanje v okviru 20-bitnega naslova. V 64-bitnem delovanju je (linearni) naslovni prostor večji od 64 G bajtov, saj gre naslov načelno tja do 2**64! Za sedaj se tako veliki fizični pomnilniki ne uporabljajo. Kako se linearni naslov izračunava? Ker je linearni tudi efektivni naslov in je 64-biten, se upoštevata bazni in indeksni register kot 64-bitna ter se njuni skupni vrednosti doda odmik tako, da se temu razširi predznak z 32 na 64 bitov. Bazni del, na katerega kaže segmentni register, naj bi bil vedno »0«! Ko preidemo z 32-bitnega v 64-bitno delovanje, se zgornji del registra izpolni z ničlami. 4 Podatkovni tipi in ukazi Mikroprocesorji IA-32 podpirajo naslednje podatkovne tipe, in sicer: bajt, beseda, dvojna beseda (32-bitov), četvena beseda (64-bitov), in dvojna četverna beseda (128 bitov). Ker je pomnilnik organiziran bajtno, so daljši podatkovni tipi naloženi v pomnilnik po načelu malega konca: manj pomembni bajt na nižjem naslovu! V omenjenih podatkovnih tipih so organizirane naslednje skalarne numerične vrednosti: - predznačeni ali nepredznačeni celoštevilčni bajt, beseda, dvojna beseda in četverna beseda, - 32- in 64-bitna vrednost v plavajoči vejici, (80 bitna vrednost se uporablja le v okviru FPU). Vektorski tipi kot kombinacija zgornjih 64-bitih oziroma 128-bitih struktur so: - 8 * bajt, 4* beseda ali 2* dvojna beseda, predznačena ali nepredznačena vrednost, - 16* bajt, 8* beseda ali 4* dvojna beseda ali 2* četvorna beseda, predznačena ali nepredznačena vrednost, - 4* 32-bitna ali 2*64-bitna plavajoča vejica. Slika 1: Mikroarhitektura procesorjev IA-32 Figure 1. Microarchitecture IA-32 processors. 204 Guštin 4.1 Nabor ukazov obsega devet večjih skupin, in sicer: - Splošni ukazi so bolj ali manj poznani že iz prejšnjih konfiguracij procesorjev, od '386 naprej. Razvrstimo jih lahko v naslednje sklope: prenosi /move/ in pogojni prenosi (32), aritmetično-logične operacije in pomiki (31), bitne in bajtne operacije (23), skoki in pogojni skoki (31), operacije nad nizi (18), V/I ukazi (8), kontrolni ukazi (23). - Ukazi x87 za PV so: prenosi (17), aritmetični ukazi (26), primerjave (14), transcedentne funkcije (8), vpis konstant (7), kontrolni ukazi za x87 (20), ukazi prepletanja delovanja MMX in x87 (2). Slednji so prisotni le zaradi kompatibilnosti s starejšimi arhitekturami P3. - Ukazi MMX ali ukazi za multimedijo so: prenosi (2), konverzije (9), aritmetično-logični ukazi in pomiki (29), primerjave (6) in kontrolni ukaz (1). - Ukazi SIMD (SSE) so: prenosi (8), aritmetično- logični ukazi (21), primerjave (5), premetavanje (3), 64-bitni celoštevilčni ukazi (12), kontrolni ukazi (7). - Ukazi SSE2: prenosi (6), aritmetično-logični ukazi (18), primerjave (4), premetavanje /shuffle/ (3), konverzije (12), 2*64-bit plavajoča vejica (2), 128-bitni celoštevilčni ukazi (14), kontrolni ukazi (7). - Ukazi SSE3: sinhronizacija in vpis 4*32-bitne plavajoče vejice (5), kombinirani aritmetično logični ukazi (14). - Sistemskih ukazov je (30). - Ukazov v 64-bitnem načinu je (10). - Ukazi za virtualni stroj (10). 5 Večprocesorsko povezovanje Arhitektura družine IA-32 prevideva vrsto mehanizmov, ki več procesorjem omogočajo hkratno priključitev na skupni pomnilnik. Že procesor PentiumPro je bil iz družine le-teh, pozneje je bil k vezju dodan še predpomnilnik nivoja 2 (L2). Mikroarhitektura (Sl. 1.) je organizirana kot superskalarna in supercevovodna (z več tekočimi trakovi), ki je sposobna sprejemati tri ukaze hkrati. Procesor za to potrebuje 12-stopenjski tekoči trak, ki mu omogoča izvajati ukaze v poljubnem vrstnem redu (out-of-order); ločena predpomnilnika nivoja 1 velikosti 8kB za ukaze in podatke (L1); predpomnilnik nivoja 2 (L2), ki je eden, velikosti 256k, 512k, ali 1M bajtov, shranjenih v statičnem RAM in povezanih s 64-bitnimi vodili s CPE. a) Intelova mikroarhitektura NetBurst prav tako podpira večprocesorsko povezovanje. Vsebuje: hitre aritmetično-logične enote (ALE), tehnologijo hipertekočega traku, dinamično izvajanje ukazov (tja do 126), branje iz pomnilnika (tja do 48) in pisanje vanj (do 24), izračunavanje skokov vnaprej, dva nivoja predpomnilnikov, L1 za ukaze in podatke ter L2 skupnega, organiziranega kot 8-stezno set-asociativni PP s 64-bajtno vrstico. Sistem ima še zmogljiva vodila, ki delajo s hitrostjo 8,5 GB/s. b) Intelova arhitektura /jeder/ Core je prav gotovo tista, ki je danes deležna največ pozornosti, saj je primerno nadomestilo za večprocesorske sisteme. Katere so njene poglavitne značilnosti? - Hkratno dinamično izvanje več ukazov omogoča vsakemu jedru (mikroprocesorju), da izvaja ločeno dostavo, izvrševanje in shranjevanje rezultata do štirih ukazov hkrati. - To mu omogočajo 14-stopenjski tekoči trak, tri aritmetično-logične enote, štirje neodvisni dekoderji operacijskih kod (ukazov – povejmo, da mikroprocesor nima enako velikih ukazov, zato potrebije posebno preddekodirno logiko), ki izluščijo do pet (različno-dolgih) ukazov, izvajanje do petih mikrooperacij na urni takt, predikcijo naslova pri skokih, sledilnik kazalcu sklada. - Napredni PP omogoča hitro napredovanje iz L2 v L1, (ki je v jedru), prek 256-bitnih internih vodil. L2 PP je organiziran kot 16-stezni (torej s stopnjo asociativnosti 16, 16-way) set- asociativni PP velikosti 4MB. - Napredni dostop do glavnega pomnilnika omogočajo hardverska preddostava tako iz L1 kot iz L2 PP. - Dodaten nabor ukazov za multimedijo, ki dela s 16 registri (prej 8) in nad 128-bitno strukturo. Slika 2: Intel 64 in IA-32 procesorji Figure 2. Intel 64 and IA-32 procesors. Intelovi 64-bitni procesorji 205 Arhitektrure Intel Core 2 extreme, Intel Core 2 Duo in Intel Xeon 5100 temeljijo na dveh procesorjih, ki ju vidimo na sliki 2. Zgoraj opazimo enoti za dostavo in pred-dekodiranje ukazov, ki le-te pošljejo v vrsto za kodiranje in izvajanje. Slednje poteka v petih procesnih enotah. V enem urnem ciklu se lahko izvede do šest mikrooperacij in končajo se štirje ukazi. Arhitektura podpira tri aritmetično-logične enote, izvede po en SIMD (128-bitni) ukaz, ali do osem operacij (pakiranih vrednosti) v PV. c) Tehnologija nizanja ali niti (Hyper-Threading) je bila razvita z namenom, da se poveča zmogljivost procesorjev IA-32, predvsem ko izvajajo operacijski sistem v več nizih in aplikacije v večopravilnem sistemu. Tehnologija omogoča enemu procesorju izvajanje enega ali več neodvisnih programskih tokov (nizov), z delitvijo izvajalskih enot v eni integrirani komponenti (shared execution resoureces). Arhitektura IA-32 procesorjev, ki podpirajo tehnologijo več nizov, sestavlja en ali več logičnih procesorjev, kjer ima vsak svoje notranje arihitekturno stanje (AS). Vsak ima svoje delovne in kontrolne registre, pa tudi svoje prekinitve (Advanced Programming Interrupt Controler, APIC). Procesne enote pa si logični procesorji delijo med seboj. Vsi logični procesorji skupaj sestavljajo fizični procesor. Tovrstnega procesiranja ne smemo mešati z večprocesorskim sistemom, kjer je vsak (fizični) procesor neodvisen. Razliko med sistemoma kaže slika 3. d) Večjedrna tehnologija (Multi-Core Technology) je še eden od načinov procesiranja več nizov družine procesorjev Intel IA-32. Kaj omogoča? Predvsem povezovanje dveh ali več procesnih jeder na enem integriranem vezju. Procesor Intel Pentium Extreme je bil prvi iz vrst večjedrnih procesorjev družine IA-32, ki so podpirali nize. Imel je dva logična procesorja za vsako jedro, le-teh je tudi bilo dvoje: torej je podpiral štiri logične procesorje, oziroma dva fizična v eni integrirani komponenti. Procesor Intel Core 2, Xeon procesorja 3000 in 5100 serije in Intel Core Duo procesorji omogočajo večjedrna in večnizna procesiranja. Kot vidimo na sliki 4, vsebujejo dve jedri, s skupnim »pametnim« predpomnilnikom L2, ki daje podatke obema jedroma, tako da je zasedba zunanjih sistemskih vodil čim manjša. Procesor Intel Xeon serije 5300, štirijedrni procesor Intel Core 2 Extreme in procesorji Intel Core 2 Quad prav tako podpirajo večjedrno tehnologijo. Štirijedrni procesor Intel Xeon 5300 ima dvoje neodvisnih vodil, medtem ko ima Intel Core 2 samo ena zunanja vodila (Sl. 4). Slika 4. Intel 64 družina s štirim jedri. Figure 4. Intel 64 four-core family 6 Sklep Osnovna arhitektura procesorjev Intel 64 je želela predvsem povečati naslovni linearni prostor na 64 bitov, medtem ko podpira 40-bitni naslovni fizični pomnilnik. Zvezo s starejšimi arhitekturami mu omogočata dva nova načina delovanja: kompatibilnostni način in 64- bitni način z mešanjem 32- in 64-bitnih struktur. Slika 3: Primerjava IA-32 več-nizne arhitekture in večprocesorskega sistema Figure3. Comparison of IA-32 multithread arctitecture with multiprocessing system. 206 Guštin Pri 64-bitnem načinu lahko aplikacija dosega - 64-bitni linerani (flat) pomnilni prostor, - 8 dodatnih (skupaj torej 16) 64-bitnih delavnih registrov, - 8 dodatnih (skupaj torej 16) multimedijskih 128-bitnih registrov, - 64-bitni registri, 16-bitni ostanejo še naprej segmentni registri, - bajtno naslavljanje, - hitri prekinitveni vektroji, - nov relativni način naslavljanja. Vedeti moramo, da nam vsa ta procesna moč ne bo koristila veliko, če bodo naši programi ostajali »zaporedni« in ne bodo upoštevali večprocesorskega vzporednega programiranja. Prepričani smo, da bodo s pridom prvi izkoristili nabor 482 ukazov in vsa štiri jedra programerji kakih dobrih »igric« ali »profesiolnalnih« aplikacij. Nekaj smo za izkoriščanje vzporednosti naredili že v Laboratoriju za arhitekturo računalnikov na Fakulteti za računalništvo in informatiko UL, kjer smo razvili programski jezik MMC [3]. Jeziku C/C++ smo dodali nova sintaktična pravila, ki nam omogočajo uporabiti ukaze za multimedijo. Jezik MMC nam torej omogoča izkoriščati vzporednost samih procesnih enot v enem logičnem procesorju. Če pa hočemo izkoristiti večnitnost ali več vzporedno vezanih procesorjev, se bomo morali potruditi in aplikacijo npr. v jeziku C/C++ predelati in uporabiti knjižnico MPI (Message Passing Interface) za večprocesorsko povezovanje in vzporedno procesiranje [4]. Za nas so arhitekture IA-32 zanimive predvsem zato, ker jih bomo srečevali pri osebnih računalnikih, delovnih postajah in strežniki. Prav gotovo lahko rečemo, da so procesorji Intel 64 »napredne« rešitve procesorjev arhitekture CISC (Complex Instruction Set Computer), računalnikov z obsežnim naborom ukazov v boju z arhitekturami RISC (Reduced Instruction Set Computer). 7 Literatura [1] V Guštin, Ali poznamo mikroprocesor Pentium III, ELVEA 67(5), pp. 268-274, 2000; [2] Intel 64 and IA-32 Architectures Software Developer's Mannual, Vol. 1; Basic Architecture, http://www.intel.com/design/processor/manuals/25366 5.pdf, Nov., 2006; [3] P. Bulić, V Guštin, An Extended ANSI C for Multimedia Processing, Lecture Notes in Computer Science LNCS 2763, pp. 429-443, Springer-Verlag, 2003; [4] M. Snir, et al., MPI: The Complete Reference, The MIT Press, 1998. Veselko Guštin je v letih 1971, 1974 in 1987 diplomiral, magistriral ter doktoriral na Fakulteti za elektrotehniko in računalništvo Univerze v Ljubljani. Trenutno je izredni profesor na Fakulteti za računaništvo in informatiko Univerze v Ljubljani. Njegovo raziskovalno delo je usmerjeno v programabilno logiko, vzporedno procesiranje in arhitekturo računalnikov. Dr. Guštin je član IEEE Computer Society, Euromicro in Zveze elektrotehnikov Slovenije.