Mikroarchitektúra
| Ezt a szócikket át kellene olvasni, ellenőrizni a szöveg helyesírását és nyelvhelyességét, a tulajdonnevek átírását. Esetleges további megjegyzések a vitalapon. |
Az informatikában a mikroarchitektúrával teljesen leírható egy számítógép, központi egység, vagy digitális jelfeldolgozó elektromos áramkör kapcsolási sémája hardver-alapú működése. Tudományos körökben a számítógépszervezet kifejezést használják, míg a számítógépiparban a mikroarchitektúra kifejezést használják gyakrabban. Mikroarchitektúra és utasításkészlet (ISA) együtt alkotják a számítógép-architektúra területét.
[szerkesztés] A kifejezés etimológiája
Az 1950-es évek óta sok számítógép használt mikroprogramot vezérlőlogikájuk megvalósítására, ami dekódolta a programutasításokat és végrehajtotta őket. A mikroprogram kódján belüli bitek irányították a processzort az elektromos jelek szintjén. A mikroarchitektúra kifejezést arra használták, hogy leírja azokat az egységeket, amiket a mikroprogram kódjai irányítottak, szemben az architektúrával ami látható volt és dokumentált a programozóknak. Bár az architektúráknak általában kompatibilisnek kell lenniük a különböző hardvernemzedékekkel, a mögöttes mikroarchitektúrát azonban könnyen meg lehet változtathatni.
[szerkesztés] Utasításkészlet-architektúrával való kapcsolata
A mikroarchitektúra különbözik egy számítógép utasításkészletétől. Az utasításkészlet egy olyan számoló rendszernek az elvont képe, ami látható egy gépi kódot (vagy assembly nyelvet) programozó számára, beleértve az utasításkészletet, memóriacímmódokat, regisztereket, cím- és adatformátumokat. A mikroarchitektúra egy alacsonyabb szint, konkrétabban írja le a rendszert az ISA-nál. Ezen a szinten mutatkozik meg a rendszer alkatrészei is, hogyan kapcsolódnak össze egymással, valamint, hogy hogyan működnek együtt, hogy megvalósítsák az architektúra részletes leírását. Különböző gépeknek lehet ugyanaz az utasításkészletük, ezáltal képesek ugyanazon programok futtatására, pedig különböző a mikroarchitektúrájuk. Ezek a különböző architektúrák (a félvezetőgyártás technológiájában való haladással egyetemben) azok, amik megengedik a processzorok újabb nemzedékeinek, hogy magasabb teljesítményt érjenek el az előző generációkkal összehasonlítva. Elméletben egyetlen mikroarchitektúrát (különösen ha ez mikrokódot tartalmaz) arra tudták használni, hogy megvalósítson 2 különböző utasításkészletet azáltal, hogy programoz 2 különböző vezérlő tárolót. Egy gép mikroarchitektúrája általában egy olyan blokkdiagramnak tüntethető fel, ami leírja a regiszterek összekötéseit, buszokat, és a gép funkcionális blokkjait. Ez a leírás tartalmazza a végrehajtási egységek számát, a végrehajtási egység fajtáját (mint például lebegőpontos, egész szám, elágazás jövendölés, egyetlen utasítás, többszörös adatok (SIMD), a csővezeték természete (ami tartalmazhat olyan állapotokat, mint utasításhívás, -dekódolás, -kijelölés, -végrehajtás, -befejezés, mindezt egy nagyon egyszerű csővezetékben), a gyorsítótár kialakítása (1., 2. szintű), és a perifériák támogatása. A tényleges alapáramkör-alaprajz, hardverszerkezet, összecsomagoló, és más fizikai részleteket, a mikroarchitektúra implementációjának nevezik. Két gépnek lehet ugyanaz a mikroarchitektúrája, és ezáltal ugyanaz a blokkdiagramjuk, de különböző hardverimplementációk tartalmaznak. [4]
[szerkesztés] A mikroachitektúra aspektusai
A csővezetékes adatösvény a leggyakrabban használt tervezési mód a jelenlegi mikroarchitektúrában. Ezt a technikát a legtöbb modern mikroprocesszorban, mikrokontrollerben és DSP-ben használják. A csővezetékes architektúra lehetővé teszi, hogy több utasítás fedje egymást végrehajtás közben, kb. úgy mint egy összeszerelő szalagon. A vezeték több különböző állomást is magába foglal, amelyek alapvetőek a mikroarchitekturális tervezésben. Néhány állomás tartalmaz olyat is, mint az utasításhívás, utasításdekódolás, -végrehajtás és -visszaírás. Néhány architektúra olyan állomást is tartalmaz mint például memóriahozzáférés. A csővezetékek tervezése az egyik központi mikroarchitekturális feladat.
A végrehajtási egységek is alapvetőek a mikroarchitektúrához. A végrehajtási egységek tartalmazzák az aritmetikai logikai egységeket (ALU), lebegőpontos egységeket (FPU), a töltő/tároló egységeket, az elágazás előrejelzéseket és SIMD-t. Ezek az egységek hajtják végre a műveleteket vagy a processzor kalkulációit. A végrehajtási egységek számának megválasztása, lappangása és teljesítménye az egyik központi mikroachitekturális tervezési feladat. A memóriák mérete, lappangása, teljesítménye és összekapcsolhatóságuk a rendszeren belül is a mikroachitekturális döntések egyike.
A rendszerszintű tervezési döntések, mint például hogy legyenek vagy ne legyenek perifériák, értve itt memória kontrollereket például, ugyancsak a microachitekturális tervezési folyamat részének tekinthető. Ideértjük a teljesítményszintű döntéseket és ezeknek a perifériáknak az összekapcsolhatóságát.
Eltérően az architekturális tervezéstől, ahol egy bizonyos teljesítményszint elérése a fő cél, a mikroarchitekturális tervezés nagyobb figyelmet szentel az egyéb megszorításoknak. Minthogy a mikroarchitekturális tervezési döntések közvetlen befolyásolják, hogy mi kerül a rendszerbe, a következő témáknak kell figyelmet szentelni:
- chipterület / költség
- energiafogyasztás
- logikai összetettség
- kapcsolódás egyszerűsége
- gyárthatóság kérdése
- debuggolás egyszerűsége
- tesztelhetőség
[szerkesztés] Mikroarchitekturális fogalmak
Általánosságban minden CPU, egymagos microprocesszor vagy többmagos megvalósítás a következő lépések végrehajtásával futtatja a programokat:
- beolvassa az utasítást és dekódolja
- megtalál minden kapcsolódó adatot ami az utasítás végrehajtásához szükséges
- feldolgozza az utasítást
- kiírja az eredményt
Az egyszerűnek tűnő lépéssorozatot komplikálja az a tény, hogy a memóriahierarchia, amely magában foglalja a gyorsítótárat, a fő memóriát és a nem-változó tárolási egységeket mint például a merevlemezeket (ahol a program utasítások és adatok vannak), mindig is lassabb volt, mint maga a processzor.
A (2) Lépés gyakran egy hosszas (CPU szempontból nézve) késést jelent, amíg az adat megérkezik a computer buszon keresztül. Jelentős mennyiségű kutatást fektettek olyan tervezésekbe, amelyek kikerülik ezeket a késéseket amennyire csak lehetséges. Az évek alatt az egyik központi cél az volt, hogy minél több utasítást hajtsanak végre parallel, így növelve a a program effektív végrehajtásának sebességét. Ezek a törekvések bevezették a komplikált logikai és áramköri struktúrákat. Kezdetben ezeket a technikákat csak drága mainframe-eken vagy szuperkomputereken lehetett kivitelezni, köszönhetően a technikához szükséges ármkör kapcsolási sémák mennyiségének. Ahogy a félvezetőgyártás fejlődött mind több és több ilyen technika vált kivitelezhetővé az egymagos processzorokon.
- Lásd a CPU cikket a műveleti alapok részletesebb leírásához
- Lásd az általános célú CPU-k történelme cikket a CPU fejlesztések történelmének részletesebb leírásához
A következőkben azokat a mikroarchitekturális technikákat vizsgáljuk meg, amelyek közösek a mai modern CPU-kban
[szerkesztés] Utasításkészlet-választás
Annak megválasztása hogy milyen utasításkészleti architektúrát alkalmazunk, jelentősen befolyásolja a magas teljesítményű eszközök kivitelezésének komplexitását. Az évek alatt, a komputer mérnökök igyekeztek leegyszerűsíteni az utasításkészleteket, így lehetővé téve magasabb szintű teljesítmény alkalmazásokat, azáltal hogy a tervezők inkább olyan szempontok fejlesztésére szánhatták az időt és energiát, amelyek a teljesítményt növelik, ahelyett hogy az utasításkészletekben rejlő komplexivitásra pocsékolták volna.
Az utasításkészletek tervezése fejlődött a CISC, RISC, VLIW, EPIC típusokon keresztül. Az adat párhuzamosággal foglalkozó architektúrák tartalmazzák a SIMD és Vectorokat is.
[szerkesztés] Utasítás pipeline (csővezeték)
Az egyik legelső, és legerősebb technika a teljesítmény javításában az utasítás pipeline-ok alkalmazása. A kezdeti processzor tervezéseknél a fent említett összes lépés végrehajtásra került minden egyes utasításnál, mielőtt az a következő utasításra lépett volna. Az áramkörök nagy része kihasználatlanul maradt bármely egyes lépésnél, például az utasításdekódoló áramkör tétlen maradt a végrehajtási fázis közben, és így tovább.
A pipeline-ok növelik a teljesítményt azáltal, hogy lehetővé teszik több utasítás párhuzamos végrehajtását a processzorban. Ugyanazt a fenti alappéldát nézve, a processzor elkezdené egy új utasítás dekódolását (1. lépés), míg az utolsó még az eredményre vár. Ez lehetővé teszi, hogy 4 utasítás legyen „repülés közben” ugyanabban az időben, ezáltal a processzor 4× olyan gyorsnak tűnik. Bár egy utasítás végrehajtása ugyanannyi időt vesz igénybe (még mindig 4 lépésből áll) a CPU egészét tekintve sokkal gyorsabban „fekteti el” az utasításokat és sokkal magasabb órajelen futtattható.
A RISC kisebbé teszi a pipelineokat és megalkotásukat sokkal egyszerűbbé teszi azáltal, hogy egyértelműen különválasztja az utasítás eljárások egyes fázisait, azok ugyannyi időt igényelnek – egy ciklust. A processzor egészét nézve úgy működik mintha egy szerelőszalag lenne, az utasítások bejönnek az egyik oldalról és az eredmények távoznak a másik oldalon. A klasszikus RISC pipeline csökkentett komplexitása miatt, a pipe maga és az utasítás gyorsítótár ráfér ugyanarra a méretű die-ra amely egyébként csak magára a magra férne rá egy CISC tervezés esetében. Ez volt az igazi oka, annak, hogy a RISC gyorsabb volt. A kezdeti tervezések, úgy mint a SPARC és MIPS gyakran 10× gyorsabban futottak mint az Intel és Motorola CISC megoldásai, ugyanolyan órajelen és áron.
A pipeline-ok persze egyáltalában nem korlátozódnak a RISC tervezésekre. 1986-ra a csúcskategóriás VAX (a 8800-as) egy keményen pipeline-os tervezés volt, kissé megelőzve az időben az első kereskedelmi MIPS és SPARC tervezéseket. A legtöbb modern CPU (még a beágyazott CPU-k is) mára pipeline-osak, és a pipeline nélküli mikrokódolt CPU-kat a terület korlátozottabb beágyazott processzoroknak tekintik. Nagy CISC gépek, a VAX 8800-astól a modern Pentium 4-ig és Athlonig, mind készülnek mikrokóddal és pipelineokkal. A pipeline és gyorsítótári technikában történt fejlesztések a két legnagyobb mikroarchitekturális előrelépés, amely lehetővé tette, hogy a processzor teljesítmények lépést tartsanak az áramkör technológiákkal, amelyen alapsznak.
[szerkesztés] Gyorsítótár (cache)
Nem sok idő telt el, hogy a chipgyártásban történő fejlesztések lehetővé tették, hogy még több áramkört helyezzenek el a die-on, és a tervezők elkezdtek utánanézni annak, miképpen lehetne ezt hasznosítani. Az egyik legkézenfekvőbb, hogy mind nagyobb mennyiségű cache memóriát adjanak a die-hoz. A cache egyszerűen egy nagyon gyors memória, olyan memória amely néhány ciklus alatt hozzáférhető a fő memória hozzáféréséhez szükséges sok sok ciklushoz képest. A CPU tartalmaz egy cache kontrollert, amely automatizálja a cache olvasását és írását, ha az adat már a cacheben van, akkor egyszerűen „megjelenik”, ha nem, a processzor „leállításra” kerül, amíg a cache kontroller beolvassa.
RISC tervezéseknél az 1980-as évek közepétől, végétől kezdtek cache-et alkalmazni, gyakran csak 4 kilobájtnyit összesen. Ez a szám folyamatosan növekedett az elmúlt idő alatt, ma egy tipikus CPU kb. 512 KB cache-sel rendelkezik, míg erősebb processorok 1-2 vagy akár 4-8 megabájtnyi cache-sel is rendelkeznek, amelyeket többszintű memóriahierarchiába szerveznek. Átalánosságban nézve több cache nagyobb sebességét jelent.
A cache-ek és pipeline-ok tökéletes kiegészítői egymásnak. Korábban nem volt sok értelme pipeline-ok építésének, amelyek gyorsabban futottak, mint a chipen kívüli hozzáférés lappangó memóriáknak.
A chipbe épített cache memória használatával a pipeline a cache hozzáférés lappangás sebességével futhat, sokkal rövidebb idő alatt. Ez tette lehetővé, hogy a processzorok működési frekvencia sokkal gyorsabb arányban növekedjen mint a chipen kívüli memóriáké.
[szerkesztés] Elágazás jövendölés
A magasabb teljesítmény egyik gátja az utasítás-szintű párhuzamosságon keresztül a pipeline-on belüli leállások és ürítések. Rendszerint, az, hogy egy feltételes elágazást fognak-e venni, nem tudják kezdetben, csak később a pipeline-ban, mivel az eseti elágazások függenek a regiszterekből származó eredményektől. Annyi idő alatt, míg a processzor utasítás-dekódolója észreveszi, hogy találkozott egy feltételes elágazás-utasítással összehasonlítva azzal az idővel, míg a regiszterből a döntő adatokat kiolvashatják, lehet, hogy a pipelinet több ciklus időre is lefoglalják. Átlagban, minden ötödik utasítás elágazásos utasítás, ebből egy viszonylag hosszú felesleges eltöltött ciklusidő fakad. Ha az elágazás választják, az még rosszabb, mert a következő utasítások közül akkor mindegyiket törölni kell, amik bent voltak a pipelineban.
Technikákat mint például az elágazásjövendölést és spekulatív végrehajtást, használnak arra, hogy csökkentsék ezeket az ágazati büntetéseket. Elágazási jóslat az, amikor a hardver „kitalálja”, hogy egy elágazást fognak-e venni. A találgatás várakozás nélkül engedi meg a hardvert előzetes utasítások végrehajtására anélkül, hogy a regisztereket olvasni kéne. A spekulatív végrehajtás egy olyan további fejlesztés, mikor a kódot a megjósolt útvonal mentén végrehajtják, mielőtt kiderülne, hogy az elágazást kell-e majd választni, vagy sem.
[szerkesztés] Szuperskalár
Még a hozzáadott bonyolultság és kapuk segítségén kívül, amik szükségesek a fent említett elméletek megvalósításához, a félvezető-gyártás fejlődése engedte meg a még több logikai kapu alkalmazását.
A fent említett működés alapján a processzor egyszerre csak egy utasítást hajt végre időegység alatt. Számítógépes programokat gyorsabban tudnának végrehajtani, ha több utasítást tudnának kezelni egyidejűleg. Ez az, amit a szuperskalár processzorok valósítanak meg azáltal, hogy funkcionális egységeket, mint például az ALU-t replikálnak. A funkcionális egységek replikálása csak azután vált lehetségessé mikor egy egyszerre csak egy utasítást végrehajtó processzor gyártása már nem súrolta a megbízható gyártás határait. 1980-as évek végére a szuperskalár tervek elkezdtek belépni a piacba.
Modern tervekben általános, hogy két betöltő egységeket, egy tároló egységet (sok utasításnak nincs eredménye amit tárolni kéne), kettő vagy több egész számos aritmetikai egységet, kettő vagy több lebegőpont számos egységet, és gyakran egy SIMD-szerű egységet is tartalmaz. Az utasítás végrehajtó logika bonyolultsága növekszik azáltal, hogy a memóriából kiolvas egy hatalmas mennyiségű utasítást, majd átadja a megfelelő végrehajtási egységhez ami éppen tétlen. Az eredményeket aztán összegyűjtik és a végén újrarendezik.
[szerkesztés] Soron kívüli végrehajtás
A gyorsítótárak alkalmazása csökkenti a várakozások előfordulását amiatt, hogy adatokra kell várni hogy a memóriából, de nem szabadul meg ezektől a várakozásoktól teljesen. Korai kialakításokban egy gyórsítótári hiba kényszerítené a gyorsítótár-vezérlőt, hogy állítsa le a processzort és várakozzon. Természetesen lehet abban a programban egy másik utasítá adata is, ami elérhető a gyorsítótárban annál a pontnál. A soron kívüli végrehajtás megengedi annak a kész utasításnak, hogy végrehajtsák, amíg egy régebbi utasításra vár a gyorsítótárban, azután újrarendezi az eredményeket, hogy úgy tűnjön, mintha az egész programozott sorrendben történt volna.
[szerkesztés] Spekulatív végrehajtás
Egy probléma egy utasítás pipeline-nal az, hogy vannak olyan típusú utasítások, aminek teljesen végig kell haladnia a csővezetéken, mielőtt a végrehajtás folytatódhat. Különösen feltételes elágazásoknak kell tudniuk egy előzetes utasítás eredményét eldönthető, hogy melyik ágat kell választani. Például, egy olyan utasítás, ami azt mondja, „ha x nagyobb mint 5 akkor teszi ezt, különben teszi azt” várnia kell majd az eredményekre x mielőtt eldönthető hogy ezután melyik utasítást kell kérnie.
Egy kisebb, négy ciklus mély pipeline esetében ez akár három ciklus késedelmet is jelenthet — a dekódolás még megtörténhet. De az órajelek növekedésével nő a pipeline nagysága is, modern processzoroknak lehet 20 vagy több szintük is lehet. Ebben az esetben a CPU-t minden alkalommal késleltetik a ciklusai nagy többségében, minden alkalommal, mikor ilyen utasítással találkozik.
A megoldás, vagy közülük egy, a spekulatív végrehajtás, amit szintén elágazás jövendölésként van nyilvántartva. Valóságban, az elágazás egyik oldala sokkal gyakrabban lesz meghívva, mint a másik, így sok esetben helyes ha egyszerűen azt mondjuk: „x valószínűleg kisebb lesz ötnél, kezdd el annak a végrehajtását”. Ha a jóslatról kiderül, hogy helyes, hatalmas mennyiségű időt meg tudunk spórolni. Modern terveknek vannak meglehetősen összetett jóslatrendszereik, amik figyelembeveszik az azelőtti ágak eredményeit hogy nagyobb pontossággal jósolják meg a jövőt.
[szerkesztés] Multiprocessing és többszálú működés
A számítógépek tervezőknek egyre nagyobb fejtörést okoz a CPU-k működési frekvenciái és a DRAM-ok hozzáférési idői közötti egyre inkább növekvő különbségek miatt. A technikák közül , amik kihasználták az utasítás-szintű párhuzamosságot egy programon belül, egyik sem bizonyult elégnek, hogy behozzák a hosszú késedelmekért elvesztegetett időt, amikor adatokat kellett elhozni központi memóriából. Továbbá a tranzisztorok nagy száma és magas működési frekvenciák miatt, amikre a haladóbb ILP technikák miatt volt szükség, ez nagyobb energiafelvételt igényelt, amit már nem lehetetett olcsón és hatékonyan hűteni. Ezekért az okokért a számítógépek újabb nemzedékei kezdték el kihasználni a párhuzamosságnak azon a magasabb szintjeit, amik egy szimpla programon vagy programszálon kívül léteznek.
Ezt a tendenciát néha akként ismerik, hogy átmenő számítás. Ez az ötlet származott a serverpiacon, ahol online tranzakciófeldolgozáson volt a hangsúly, de nem csak egy tranzakció végrehajtási sebességének a csökkentése volt a cél, hanem a képesség, hogy nagy számú tranzakcióval foglalkozzanak egyidejűleg. Tranzakció alapú alkalmazások, mint például a hálózati útválasztás és webes szolgáltatások miatt, amik az elmúlt évtizedben rohamosan növekedtek, a számítógépipar a kapacitás és átmenő teljesítményre kényszerült koncentrálni.
Ennek a párhuzamosságnak a megvalósításának egyik módja multiprocessingen keresztül, a több CPU-val rendelkező számítógépes rendszer. Csúcsminőségű szerver-számítógépek és szuperszámítógépek részére, a kisvállalkozások esetében 2-8 multiprocesszort, míg a nagy vállalatoknál, 16-256 darab multiprocesszort is használnak. Az 1990-es évek óta már megjelentek a több processzort tartalmazó PC-k is.
A félvezetők technológiájának fejlődésével a tranzisztorok méretei tovább csökkentek, ezáltal megjelentek a többmagos CPUk, ahol több CPU-t ugyanarra a szilícium-chipre helyeznek. Kezdetben használt chipek a beágyazott piacokat célozták meg, ahol egyszerűbb és kisebb CPU-k megengedték, hogy egy darab szilíciumlapra több processzort illesszenek. Néhány konstrukció, mint például a Sun Microsystems 'UltraSPARC T1, visszatért egyszerűbb (skaláris) kialakításhoz, hogy egy darab szilíciumra több processzort tudjanak illeszteni.
Egy másik technika, ami nemrég vált népszerűvé, a többszálú működés (multithreading). Ebben az esetben, mikor a processzornak a lassú rendszermemóriából kell adatokat elhoznia, akkor ahelyett, hogy várakozna az információ érkezésére, a processzor átkapcsol egy másik programba vagy a programfonálba, ami készen áll a végrehajtásra. Bár ez nem gyorsítja fel azt a program/szálat, de növeli a teljes rendszerátmenő teljesítményt azáltal, hogy csökkenti az időt, amíg a CPU tétlen.
Konceptuálisan a többszálú működés egyenértékű egy kontextuskapcsolóval az operációs rendszer szintjén. A különbség az, hogy egy többszálú CPU egy szálkapcsolást egyetlen ciklus alatt végre tud hajtani a több száz vagy több ezer ciklus helyett, amit egy kontextuskapcsoló általában igényel. Ez azáltal valósítható meg, hogy minden aktív szál számára replikálja az állapothardvert (mint például a regiszter fájl és utasításszámláló).
Egy további fejlesztés az egyidejű többszálú működés. Ez a technika superskaláris processzoroknak, ugyanabban a ciklusban engedi végrehajtani az utasításokat különböző program/szálból egyidejűleg. Lásd az általános célú processzorok című bejegyzést más kutatási témákért, amik a processzorkialakításokkal foglalkoznak.
[szerkesztés] Források
- Ez a szócikk részben vagy egészben a Microarchitecture című angol Wikipédia-szócikk ezen változatának fordításán alapul. A fordítás eredetijének szerzőit az eredeti cikk laptörténete sorolja fel.

