MAJC

A Wikipédiából, a szabad enciklopédiából
MAJC
Tervező Sun Microsystems
Bitek száma
Bevezetés 1990-es évek
Kialakítás VLIW
Típus
Nyílt nem

A MAJC (az angol Microprocessor Architecture for Java Computing rövidítése, magyarul kb. „Mikroprocesszor-architektúra a Java-számítástechnikához”) a Sun Microsystems többmagos, többszálú, nagyon hosszú utasításszavas (VLIW) mikroprocesszor kialakítása volt az 1990-es évek második felében. Az eredetileg UltraJava processzornak nevezett MAJC processzor a Java programok futtatását célozta meg hardveres környezetben, mivel a Java „dinamikus fordítása” számos előnyös tervezési megoldás felé nyitott utat a Sun számára. A processzor a Sun két kereskedelmi grafikus kártyájában jelent meg. A többmagos processzoron, többszálú végrehajtással kapcsolatos tapasztalatok képezték az alapot a későbbi OpenSPARC megvalósításokhoz, mint például az UltraSPARC T1.

Tervezési elemek[szerkesztés]

Az utasítás-ütemezés kihelyezése a fordítóprogramba[szerkesztés]

Más VLIW tervekhez, különösen az Intel IA-64 (Itanium) processzorához hasonlóan, a MAJC-ban is úgy próbálták javítani a teljesítményt, hogy a költséges műveletek nagy részét a processzorból a kapcsolódó fordítóprogramokba helyezik át. Általánosan a VLIW tervekben megpróbálják kiküszöbölni az utasításütemezőt, amely gyakran viszonylag nagy részét teszi ki a teljes processzor tranzisztorszámának. A CPU ezen részének a szoftverbe történő áthelyezésével a felszabaduló tranzisztorok más célokra használhatók fel, például funkcionális egységek hozzáadására, amelyekkel egyszerre több utasítást dolgozhat fel a processzor, vagy a gyorsítótár méretének növelésére, ami a csökkenti az adatoknak a sokkal lassabb főmemóriából való megszerzésére fordított időt. Bár a MAJC osztotta ezeket az általános koncepciókat, mégsem hasonlított más VLIW tervekre vagy processzorokra, annyira különbözött azoktól a megvalósítás számos részletében.

Általánosított funkcionális egységek[szerkesztés]

A legtöbb processzor számos különálló „alprocesszort” tartalmaz, amelyek „funkcionális egységnek” nevezhetők. Ezek az egységek általában meghatározott típusú adatokon való működésre vannak beállítva. Egy modern CPU jellemzően két vagy három dedikált funkcionális egységgel rendelkezik az egész/fixpontos adatok és logikai utasítások feldolgozására, ezek az úgynevezett ALU-k, míg más egységek – az FPU-k – kezelik a lebegőpontos számokat, és megint mások: a SIMD egységek a multimédiás adatokat. A MAJC ehelyett egyetlen többcélú funkcionális egységet használt, amely bármilyen adatot képes feldolgozni. Elméletben ez megközelítés azt jelenti, hogy bármely adattípus feldolgozása tovább tart, esetleg sokkal tovább, mint ugyanannak az adatnak a feldolgozása az adott típusú adatra tervezett, az adott adattípushoz rendelt egységben. Másrészt, az általános célú egységek lényege az, hogy a CPU nagy része ne maradjon kihasználatlanul, ha a program az adott pillanatban éppen túl sok (például lebegőpontos) számítást végez.

Változó hosszúságú utasításcsomagok[szerkesztés]

Egy másik különbség, hogy a MAJC megengedte változó hosszúságú "utasításcsomagok" használatát, amelyek a VLIW rendszerben (a hosszú utasításszóban) olyan utasításokat tartalmaznak, amelyekről a fordítóprogram megállapította, hogy egyidejűleg futhatnak. A legtöbb VLIW architektúra rögzített hosszúságú csomagokat használ és mikor a fordítóprogram nem talál (párhuzamosan) futtatható utasítást, akkor a helyet egyszerűen NOP utasításokkal tölti ki, ami csak a helyet foglalja, és ez a módszer a végrehajtás sebességét is csökkentheti. Bár a változó hosszúságú utasításcsomagok használata valamivel bonyolultabbá teszi a CPU-t, viszont csökkenti a kód méretét és ezáltal a költséges „találati hibák” számát, a gyorsítótárban lévő kód mennyiségét növelve, a végrehajtás tetszőleges pontján.

A zárolások és a leállások elkerülése[szerkesztés]

A MAJC kialakítás leginkább megkülönböztető tulajdonsága, hogy nélkülözhetetlen a hozzá tartozó fordítóprogram, mivel az utasítások közötti zárolások (interlocks) feloldása, ill. a végrehajtási lépések közötti várakozások elkerülése a fordítóprogram feladata volt. Például, ha a processzor a C = A + B, E = C + D utasításokat kapja, akkor a második utasítás csak akkor futhat, ha az első befejeződött és a C eredmény elkészült. A legtöbb processzor zárolásokat alkalmaz a lépések között, leállítja és átütemezi az ilyen típusú, egymásba kapcsolt utasításokat, és eközben esetleg más utasításokat futtat a C értékének kiszámítása mellett. Azonban ennek a zárolási mechanizmusnak a megvalósítása a csip hardverében igen drága, sok erőforrást igényel és elfoglalja a utasításütemező logika legnagyobb részét.

Ahhoz, hogy a fordítóprogram elkerülhesse ezeket a zárolásokat, pontosan tudnia kell az egyes utasítások végrehajtási idejét. Ha például egy adott implementációnak három ciklusra van szüksége egy lebegőpontos szorzás végrehajtásához, a MAJC fordítóprogramok megpróbálnak más olyan utasításokat beütemezni, amelyeknek három ciklusra van szükségük, és éppen nincsenek elakadva. A tényleges megvalósítás azonban változhat, így lehetséges, hogy a fenti késleltetés két ciklusra csökken, ekkor a fordítóprogramot hozzá kell igazítani ehhez a változáshoz.

Ez azt jelenti, hogy a fordítóprogram nincs a MAJC egészéhez kötve, hanem a MAJC egy egyedi implementációjához, egy adott CPU megvalósításhoz. Ez komoly logisztikai problémát jelenthet; például elég nehézkes lenne a programfejlesztés, ha az Intel IA-32 kialakítások összes eltérő változatának saját dedikált fordítóprogramra lenne szüksége, és a fejlesztőnek mindegyikhez más-más bináris programot kellene fordítania. Viszont pontosan ez a koncepció működik a Java piacán – valóban minden ISA verzióhoz külön fordító van, és az a fejlesztőé helyett az ügyfél gépére van telepítve. A fejlesztő csak egyetlen bájtkód-verziót publikál a programjához, és a felhasználó gépe fordítja le azt az aktuális platformra.

A valóságban az utasítások ilyen módon történő ütemezése nagyon nehéz probléma. A valós használatban azok a processzorok, amelyek ezt az ütemezést futási időben próbálják elvégezni, számos olyan eseménnyel találkoznak, amikor a szükséges adatok nincsenek a gyorsítótárban, és a programban nincs más olyan utasítás, amely ne függne az ilyen adatoktól. Ilyen esetekben a processzor gyakran hosszú ideig leáll és az adatok érkezésére vár a főmemóriából. A VLIW megközelítés ilyen esetekben nem sokat segít; ugyan a fordító több időt tölthet a futáshoz szükséges utasítások keresésével, de nem garantált, hogy tényleg meg is találja azokat.

A MAJC ezt a problémát úgy próbálta megoldani, hogy más szálak kódját kezdte futtatni, ha az aktuális szál elakadt, memória-hozzáférésre várva. A szálak váltása, azaz a kontextusváltás rendszerint igen drága folyamat, és egy normál processzoron a váltás minden megtakarítást felülmúlna, és általában lelassítaná a gépet. A MAJC egyszerre akár négy szál állapotát is képes volt a memóriában tartani, ezáltal a kontextusváltás néhány utasítás hosszára csökkent. A gyors kontextusváltás azóta más processzorokon is megjelent; az Intel technológiájában ilyen a HyperThreading.

A MAJC-ban egy lépéssel továbbvitték ezt az ötletet, úgy, hogy a processzor megpróbálta előre letölteni a várakozó szálakhoz az adatokat és utasításokat. A legtöbb processzor tartalmaz hasonló funkciót az utasításfolyam különböző részeihez, ez az úgynevezett spekulatív végrehajtás, ahol a processzor lefuttatja egy elágazás mindkét lehetséges kimenetelét, miközben a döntési változó kiszámítására vár. A MAJC ehelyett folytatta a szál futtatását, mintha nem akadt volna el, és ezt a végrehajtást arra használta, hogy megtalálja és betöltse az összes adatot és utasítást, amire rövidesen szükség lesz, mikor a szál újraindul (befejezi a várakozást). A Sun erre Tér-idő számítás (Space-Time Computing, STC) néven hivatkozott, és ez egy spekulatív többszálas kialakítás.

A korábbi processzorokban a párhuzamosítást egyetlen szálon belül próbálták megoldani, és ez a technika kezdett a határaihoz érkezni, egyre kevesebb eredményt (gyorsulást, hatékonyságot) mutatva. Általánosítva, a MAJC tervezésében úgy próbálták megkerülni az elakadásokat, hogy a végrehajtás a szálakon (és programokon) keresztbe futott, ahelyett, hogy egyetlen szálban kereste volna a párhuzamosítási lehetőségeket. A VLIW technológia valamivel rosszabb képet mutat az elakadások szempontjából, mivel a fordítási időben nehéz kiszámítani a futásidejű viselkedést, és ez különösen érdekessé teszi a MAJC megközelítését e probléma kezelésében.

Implementációk[szerkesztés]

A Sun a MAJC-ból egyetlen modellt épített, a kétmagos MAJC 5200 jelűt, amely a Sun XVR-1000 és XVR-4000 munkaállomás grafikus kártyáit hajtotta meg. A processzor terveiben a többmagos felépítés, a többszálú végrehajtás elérésére alkalmazott ötletek nagy része bekerült a Sun SPARC processzorcsaládjába (és más cégek kialakításaiba is), különösen a késleltetések csökkentésére alkalmazott módszer a többszálas végrehajtás esetén. Ezenfelül a MAJC-ban alkalmazott ötlet, miszerint a processzort a szálak, nem pedig az utasítások végrehajtásának maximalizálására tervezték, szolgált alapul a Sun későbbi UltraSPARC T1 (kódnevén Niagara) processzora terveinek.

Mikroarchitektúra[szerkesztés]

  • akár 4 processzor egy lapkán,
  • minden processzor 4 FE-vel (Functional Unit, funkcionális egység) rendelkezik; ezek közül 3 azonos, egy pedig kibővített,
  • minden FE saját logikával és regiszterkészlettel rendelkezik (pl. 32 vagy 64 regiszter),
  • egy processzor 4 FE-je osztozik egy globális regiszterkészleten, pl. 64 regiszter,
  • minden regiszter egységes (nem oszlik fel fixpontos/lebegőpontos fájlokra),
  • bármely FE bármilyen adattípust feldolgozhat.

Mindegyik processzor egy 4 szélességű VLIW, és 4 utas többszálú feldolgozásra képes. Minden processzor a 4 FE-ével együtt 4 utas többszálú üzemmódban működtethető (a Sun ezt Vertical Multithreading-nek nevezi).

A funkcionális egységek regiszterfájljai 3 olvasási és 1 írási porttal rendelkeznek. A regiszterfájlokban a globális regisztereket tetszőleges FE írhatja. A szálak a 4 FE egyikén futnak. A szálak kontextusváltása: gyorsítótár találati hibát követően a processzor elmenti a T szál állapotát, és megkezdi a következő T feldolgozását.

Forrás:[1]

Jegyzetek[szerkesztés]

  1. Sima Dezső: 12. Multithreaded Processors (angol nyelven) (ppt). Advanced Computer Architectures pp. 29/85. Óbudai Egyetem, 2007. január 9. (Hozzáférés: 2022. június 12.)

Fordítás[szerkesztés]

Ez a szócikk részben vagy egészben a MAJC című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Források[szerkesztés]

  • MAJC Architecture Tutorial, White Paper (angol nyelven) (pdf) pp. 35. Sun Microsystems Inc., 1999. [2002. január 26-i dátummal az eredetiből archiválva]. (Hozzáférés: 2022. június 12.)
  • Sudharsanan, S., "MAJC-5200: A High Performance Microprocessor for Multimedia Computing," Sun Microsystems, Inc., May 2000, 8 pages.
  • Tremblay M., "The MAJC Architecture; A Systhesis of Parallelism and Scalability", Sun Microsystems, 901 San Antonio Rd., MS USUN03-202, Palo Alto, CA 94303, USA, Marc_tremblay@sun.com, Nov.-Dec. 2000, 25 pages.

További információk[szerkesztés]

Kapcsolódó szócikkek[szerkesztés]