Gyvenimas po 32

Kalbama, kad kitais metais mūsų 32 bitų “geležies” gatvėje bus šventė: pagaliau turėtų pasirodyti 64 bitų “AMD” ir “Intel” procesoriai. Apie juos mažai žinoma. Greičiausiai jų kainos bus neįkandamos paprastiems pirkėjams, tačiau nuolat gauname laiškus su prašymais papasakoti apie būsimus procesorių flagmanus. Šis straipsnis – tai bandymas pradėti šią temą tiek sau, tiek žurnalui.

Prieš pradedant gilintis į procesorių architektūros smulkmenas, vertėtų išsiaiškinti, kas tai yra 64 bitų procesoriai ir kuo jie skiriasi nuo senos geros 16 ar 32 bitų architektūros IA-32. Bitų skaičius dažniausiai nusako procesoriaus komandos ilgį, t.y. procesoriaus komandos gali naudoti tokios apimties duomenis. Taip 16 bitų procesoriai per kartą gali apdirbti 2, 32 bitų – 4, o būsimi 64 bitų procesoriai – 8 baitus duomenų.

Gyvenimas po 32

64=2X32? Paplitusi klaidinga nuomonė, kad procesorių naudojamų komandų bitų kiekis tiesiogiai proporcingas spartai. Klaidinga manyti, kad 64 bitų procesorius prie kitų vienodų sąlygų (dažnių ir komandų atlikimo laiko) dirbs dukart sparčiau 32 bitų pirmtako. Reali 64 bitų skaičiavimų nauda išryškėja šiose situacijose.

Visų pirma, visi 32 bitų x86 architektūros procesoriai turi 32 bitų adresų magistralę, t.y. negali išnaudoti daugiau nei 4 GB darbinės atminties (DA). Kol kas tokį apribojimą sunku pavadinti reikšmingu, nes didžioji dalis pagrindinių plokščių vis dar negali turėti daugiau nei 1 GB atminties. Tačiau 4 GB atminties jau neatrodo astronomiškai didelis kiekis ir serveriai jau greitai gali pareikalauti net daugiau. 64 bitų adresavimas leidžia dirbti su daugiau nei 18 mlrd. GB atminties. Reikia tikėtis, kad panašus DA kiekis patenkins bent minimalius “Windows 2005” su “Internet Explorer 8.5” poreikius.

Antra, kai kurioms su dideliais duomenų kiekiais dirbančioms programoms gali nepakakti 32 bitų kintamiesiems laikti. Tipiški tokio taikymo pavyzdžiai – duomenų bazių valdymo sistemos arba kriptografija (informacijos kodavimas ir iškodavimas). Dabartiniams procesoriams tenka skaidyti kintamuosius apdorojant juos 32 bitų dalimis. 64 bitų procesoriai galės susidoroti su šiais skaičiavimais kur kas sparčiau.

Tad, daugumai dabartinių programų (taip pat ir žaidimų) duomenims saugoti ir adresuoti visiškai pakanka 32 bitų sistemų, todėl 64 bitų sistemų privalumai greičiausiai nebus išnaudoti. “Intel” ir “AMD” žinoma tai supranta ir nesitiki greito 32 bitų procesorių išnykimo. Tačiau į 64 bitų procesorių ateitį ir jų architektūrą korporacijos žiūri gana skirtingai.

“AMD” inžinieriai, kuriantys pirmą 64 bitų procesorių (jo kodinis pavadinimas “Sledgehammer”), pasirinko paprasčiausią kelią “ištempdami” klasikinę IA-32 architektūrą iki 64 bitų. Taip gautą komandų sistemą pavadino x86-64.

“Sledgehammer” bus apmokytas 64 bitų atminčiai adresuoti, aprūpintas 16 64 bitų bendros paskirties registrais ir “žinoma” apginkluos specialiomis instrukcijomis kovai su 64 bitų duomenimis. Apie dvi pastąrasias galimybes verta papasakoti plačiau.

Registrai – tai į procesorių atminties įtaisyti ieškikliai. Jų dydis sutampa su procesoriaus bitų kiekiu, ir, priešingai nei spartinančioji atmintis, jie yra neatsiejama kiekvieno procesoriaus dalis. Registrų pasiekimas atliekamas kur kas sparčiau nei spartinančiosios ar, tuo labiau, darbinės atminties. Dauguma komandų dirba būtent su spartinančiosios atminties turiniu vengdamos kreipimosi į išorinę atmintį. Dalis registrų saugo informaciją apie procesoriaus būseną (darbo režimus) arba nurodo specifines atminties zonas (duomenų ar kodų segmentai, dabartinė komanda). Taikomosioms programoms visi šiuolaikiniai x86 architektūros procesoriai suteikia tik 8 32 bitų registrus (vadinamuosius bendros paskirties registrus arba BPR). Toks mažas BPR kiekis verčia programas nuolat saugoti kintamuosius darbinėje atmintyje pakraunant juos į BPR tik skaičiavimo metu. Taip procesoriui tenka dažnai stovėti be darbo laukiant informacijos iš lėtos DA. Kaip jau minėta anksčiau, “Sledgehammer” apdovanotas dvigubai didesniu BPR skaičiumi. Pažymėsiu tik, kad ir 16 BPR – šiais laikais nedidelis kiekis. Dauguma RISC procesorių turi bent 32 panašius registrus, o “Itanium” (tiesioginis “Sledgehammer” konkurentas) jų turės net 128.

“Sledgehammer” palaikys SSE (“Intel” sukurtas SIMD instrukcijų rinkinys slankaus kablelio operacijoms). Įdomu kita. Dideliame vadove programuotojui x86-64 architektūroje nesuradau nė menkiausios užuominos apie “3DNow!”. Jeigu “AMD” atsisakys naudoti “3DNow!” savo 64 bitų procesoriuose, šių instrukcijų ateitis taps labai miglota.

Naujos instrukcijos darbui 64 bitų režime gautos labai paprastai: klasikinės IA-32 komandos papildytos elementais, leidžiančiais dirbti su 64 bitų adresavimu ir naujais registrais. Pagrindinis tokio metodo privalumas – paprastumas. Kūrėjams lengviau sukurti naują procesoriaus architektūrą senosios pagrindu, o ne viską kurti nuo nulio. Procesoriui lengviau apdoroti naujas 64 bitų instrukcijas, kadangi nuo seniai pažįstamų 32 bitų instrukcijų jos skiriasi nedaug. Dėl šios priežasties naujųjų komandų įsisavinimas nesukels problemų programuotojams. Tačiau tuo pačius “Sledgehammer” paveldi iš IA-32 rimtų trūkumų. Kas suprastume jų esmę, teks grįžti istorijon.

Architektūros istorija Su x86 suderinamų procesorių architektūros (IA-16 komandų sistema) pagrindai buvo sukurti dar 70-aisiais. Tada procesoriai buvo lėti, atmintis – be galo brangi, o kompiliatoriai – niekam tikę. Procesorių kūrėjai tada stengėsi priartinti procesorių instrukcijas prie programavimo kalbų kaip C ar “Pascal” komandų, kad palengvintų gyvenimą programuotojams ir paskatintų juos kurti programinę įrangą būtent jų gaminamiems procesoriams. Būdingu to meto procesoriu bruožu tapo sudėtingos instrukcijos, jungiančios ir paprastas greitai atliekamas operacijas, ir sudėtingos komandos su naujais adresavimo režimais. Panašios direktyvos padeda sumažinto komandų skaičių programos kode ir sutaupo atminties. Su laiku x86 procesorių architektūra vis sudėtingėjo: naujuose procesoriuose atsirado papildomų instrukcijų ir darbo režimų. Kita šių galimybių pusė – sunkumai, atsirandantys iškoduojant ir paraleliai apdorojant instrukcijas.

Esmė ta, kad šiuolaikiniai procesoriai labai sudėtingi, t.y. aprūpinti keliais konvejeriais ir vienu metu gebantys apdoroti kelias komandas. Tačiau ne visas instrukcijų sekas galima sėkmingai apdoroti paraleliai. Pavyzdžiui, komandą, pateikiamą tokia tvarka: a=b+c d=a+x, negalima apdoroti paraleliai, kadangi, norint įvykdyti antrąją, reikia žinoti pirmosios operacijos rezultatą (a reikšmę). Panašios instrukcijos vadinamos priklausomomis. Priešingai, kitą komandų seką (tokios instrukcijos vadinamos nepriklausomomis) galima apdoroti taip: a=b+c ir d=b+x.

Taip, sudėtingi procesoriai turi atpažinti instrukcijų priklausomybę ir sėkmingai jas įvykdyti. Be to, šiuolaikiniai procesoriai moka dinamiškai optimizuoti kodą ir vykdyti komandas kita tvarka, nei jos buvo pateiktos programoje. Deja, sudėtingas instrukcijų formatas ir “x” x86 procesorių adresavimo režimai labai apsunkina priklausomybės nustatymą ir kodo optimizavimą. Išvada: didelė dalis “Pentium III” ir “Athlon” procesorių tranzistorių dalis užimta kodo analizavimu ir optimizavimu, o ne tiesioginiu jo vykdymu.

“Intel” pasirinko kitą kelią “Intel” ir “Hewlett-Packard” inžinieriai (korporacijos kartu atliko tyrimus), kurdami 64 bitų procesorių, nutarė atsisakyti IA-32 tobulinimo ir sukūrė iš principo naują IA-64 architektūrą. Jos komandų sistema sudaryta taip, kad pridėtų maksimaliai naudingą duomenų paskirstymą paraleliniais konvejeriais ir sumažinti prastovas, atsirandančias kreipiantis į DA. Trumpai išvardinsiu pagrindines naujas šios architektūros galimybes.

Visas kodo optimizavimo ir komandų priklausomybių nustatymo darbas nuimtas nuo procesoriaus ir atiduotas kompiliatoriams. Būtent jie nustato, kurias komandas galima vykdyti paraleliai ir palieka atitinkamas užuominas kode. Procesoriui belieka vykdyti kompiliatoriaus nurodymus negaištant laiko savarankiškam kodui optimizuoti. Tuo labiau, kad procesoriui tampa nereikalinga analizės logika ir išparalėlinimo instrukcijos, o sutaupyti tranzistoriai leidžia padidinti konvejerių skaičių arba spartinančiosios atminties kiekį. Kita vertus, su IA-64 suderinamų procesorių darbingumas labai priklauso nuo kompiliatorių kokybės.

Taip pat IA-64 procesoriuose labai įdomus sąlyginių veiksmų (šių veiksmų analogas kai kuriose programavimo kalbose – konstrukcija IF … THEN) apdorojimas. Gavęs tokią instrukcija, procesorius iki sąlygų nustatymo momento nežino, ar bus pereita prie naujo adreso. Atitinkamai, jam nesvarbu, kokią komandą reikia paimti iš atminties ir apdoroti. Procesoriui tenka laukti, kol nustatomas komandų ryšys, taip netenkant brangių taktų. Kad būtų išvengta prastovų, visi šiuolaikiniai procesoriai stengiasi atspėti komandas, kol dar nenustatomos perėjimo sąlygos. Vadovaudamasis spėjimu, procesorius gali tęsti naujų komandų gavimą ir vykdymą. Jeigu prielaida pasirodys teisinga – bus sutaupyti taktai. Jei ne – teks mokėti jais. IA-64 numatytas visiškai kitas mechanizmas, leidžiantis procesoriui ne užsiimti spėjimais, o tuo pat metu apdoroti abi konstrukcijos šakas. Kai tik perėjimo sąlygos bus nustatytos, neteisingos komandos rezultatai bus pašalinti.

Daug dėmesio IA-64 kūrėjai skyrė prastovoms, susijusioms su kreipimusi į DA. Sprendimas paprastas: reikia pradėti krauti duomenis iš atminties iki to laiko, kol jų ištikrųjų prireikia (toks duomenų gavimas vadinamas spekuliaciniu). Šiam tikslui kompiliatorius turi sudėlioti išankstinio kintamųjų krovimo nurodymus ne prieš šiuos duomenis naudojančią operaciją, o iš anksto (prieš kelias instrukcijas). IA-64 procesoriuje numatytos specialios priemonės patikrinti, ar duomenys nebuvo atnaujinti po pirmalaikio jų pakrovimo.

Didelis registrų kiekis (IA-64 procesoriuje jų po 128 sveikiesiems skaičiams ir slankaus kablelio skaičiams) pastebimai sumažina kreipimųsi į atmintį kiekį. Programos gali nuolatos saugoti didžiąją dalį kintamųjų registruose, o ne krauti juos iš DA.

Keli žodžiai apie suderinamumą. IA-64 architektūra turi ir senosios IA-32 sistemos komandas, todėl būsimi IA-64 “Intel” procesoriai galės naudoti dabartines programas. Tačiau skirtumai tarp IA-32 ir IA-64 tokie žymūs, kad suderinti abiejų architektūrų efektyvų veikimą viename procesoriuje beveik neįmanoma. Auka, žinoma, tampa IA-32. Pirminiais vertinimais, 800 MHz “Itanium” procesoriaus (tai pirmasis IA-64 architektūros procesorius) darbo sparta su 32 bitų programomis bus mažesnė nei analogiško taktinio dažnio “Pentium III” procesoriaus. Be to, “Itanium” procesorių prekyba prasidės pirmoje kitų metų pusėje, o kainuos jie apie 5000 JAV dolerių. Tad, 32 bitų programos naudoti su šiais procesoriais galima, tačiau tai nenaudinga.

Žinoma, tiek kainuojantiems procesoriams, kokia bebūtų jų spartų, “paprastų” AK rinka uždaryta. “Itanium” bei kelios po jo sekančios IA-64 procesorių kartos dirbs tik galingiausiuose serveriuose ir tarnybinėse stotyse. Mums, žaidimų mėgėjams, artimiausiais metais “Intel” ir toliau gamins 32 bitų “Pentium II” ir “Pentium IV” procesorius.

“Itanium” ar “Sledgehammer”? Taigi “Intel” ir “AMD” pasirinko visiškai skirtingus IA-32 architektūros plėtojimo kelius. “Intel” būdas, iš esmės, revoliucinis, o “AMD” greičiau evoliucinis. Galima valandų valandas ginčytis, kieno strategija vertingesnė ir kieno procesoriai geresni. Norėtųsi atkreipti dėmesį į kitą aplinkybę: 64 bitų “AMD” ir “Intel” procesoriai praktiškai nesuderinami tarpusavyje. Tai reiškia, kad 32 bitų kodą naudoti šiuose procesoriuose galima, tačiau ar verta tada leisti pinigus 64 bitų procesoriams? Greičiausiai rinka nesugebės priimti dviejų nesuderinamų architektūrų. Dauguma programuotojų paprasčiausiai nerizikuos leisti 64 bitų programas, kol x86 procesoriuose nebus vieningos 654 bitų komandų sistemos. Taip pat reikia pabrėžti, kad 64 bitų programos gali dirbti tik 64 bitų operacinės sistemos aplinkoje. Šiuo metu IA-64 procesoriams pritaikomos šios OS: 64 bitų “Microsoft Windows” versija, HP kuriama “HP-UX”, “Sun” kuriama “Solaris”, SCO kuriama “UnixWare” ir “Silicon Graphics” kuriama “IRIX”. “AMD” kol kas negali džiaugtis tokiu dideliu OS, palaikančių x86-64 architektūrą, sąrašu. Žinoma tik, kad “Sledgehammer” procesoriams pritaikoma “Linux”.

“AMD” koziris – palyginti nedidelė būsimų procesorių kaina. Pirminiais duomenimis, “Sledgehammer” branduolys bus tik šiek tiek brangesnis nei dabartiniai “Athlon” procesoriai, o orientuotas šis procesorius ne tik į serverių, bet ir galingesnių asmeninių kompiuterių rinkas. Todėl galima tikėtis, kad jų kaina bent jau nebus šokiruojanti.

Tuo tarpu “Intel” pasirinktas kelias šiuo metu atrodo perspektyvesnis. Mano manymu, “AMD” nesugebės įtikinti verslo programų ir žaidimų kūrėjus palaikyti ”Sledgehammer” realiai produktais tol, kol šiam procesoriui nebus pritaikyta “Windows” operacinės sistemos versija. Reikia pastebėti, kas “Microsoft” vis mažino su x86 konkuruojančių platformų palaikymą (iš “Windows NT 4.0” buvusio MIPS, “Alpha” ir “PowerPC” palaikymo “Windows 2000” neliko nieko), todėl galima abejoti, ar ji ryšis pritaikyti “Windows 2000” “Sledgehammer” procesoriams. Kita vertus, serverių rinkoje šis procesorius sunkiai konkuruos su “Itanium”. Bent jau dabar “Intel” pavyko sudominti kur kas daugiau garsių serverių gamintojų ir OS kūrėjų šiems.