AltiVec

A Wikipédiából, a szabad enciklopédiából

Az AltiVec egy lebegőpontos és egész típusú számokon értelmezett SIMD utasításkészlet, amelyet az AIM Szövetség, az Apple, az IBM és a Freescale Semiconductor (korábban a Motorola félvezetőgyártó részlege) által alkotott számítástechnikai fejlesztési társulás tervezett és a mai napig birtokolja a tulajdonjogokat. Az AltiVec utasításkészletet számos PowerPC változatba belekerült, többek között a Motorola G4, az IBM G5 és POWER6 processzorába, valamint a P.A. Semi PWRficient PA6T modelljébe is. Az AltiVec védjegy kizárólagos tulajdonosa a Freescale, emiatt a rendszerre több más néven is hivatkozak, például a Velocity Engine az Apple, a VMX az IBM és a P.A. Semi helyettesítő elnevezése, bár az IBM valami miatt újabban nyíltan az AltiVec megnevezést is használja.

Míg az AltiVec név egy utasításkészletre vonatkozik, megvalósításai, tehát a konkrét áramkörökben való logikai kialakítása igencsak különbözik / jelentősen eltér az IBM és a Motorola fizikai processzoraiban. Jelenleg egyetlen eddig gyártott IBM magban sem található a Motorola által licenszelt logikai kialakítás, és a Motorola magjaiban sincs IBM logika.

Az AltiVec szabványos tartozéka az új Power ISA v.2.03[1] specifikációnak. Egészen eddig a specifikációig nem volt része a PowerPC architektúrának, bár a PowerPC utasításformátumot és szintaxist használja és kifejezetten az erre a célra lefoglalt opkód-területet foglalja el.

Jellemzői és összehasonlítása az x86-64 Streaming SIMD Extensions kiterjesztésével[szerkesztés | forrásszöveg szerkesztése]

Mind az AltiVec, mind az SSE kiterjesztést 128 bites vektorregiszterek használata jellemzi, amelyek tizenhat 8 bites előjeles vagy előjel nélküli karaktert reprezentálhatnak, avagy nyolc 16 bites előjeles vagy előjel nélküli rövid egészet (short), négy 32 bites egészet vagy négy 32 bites lebegőpontos változót. Mindkettő tartalmaz gyorsítótár-vezérlő utasításokat, amelyek a gyorsítótár-szennyezés minimalizálását célozzák az adatfolyamok feldolgozása közben.

A kettő között lényeges eltérések is vannak. Az SSE2-vel ellentétben, az AltiVec támogat egy speciális RGB "pixel" adattípust is, de nem dolgozik 64 bites duplapontosságú lebegőpontos értékekkel, és ebben nincs közvetlen adatmozgatási lehetőség a skalár és a vektorregiszterek között. A PowerPC RISC kialakításának „load-store” modelljéhez igazodva a vektorregiszterek tartalma, a skalár regiszterekhez hasonlóan, csak a memóriából tölthető be és oda írható ki. Az AltiVec azonban jóval teljesebb „horizontális” művelethalmazt biztosít, amelyek egy vektor összes elemén működnek; az adattípusok és műveletek megengedett kombinációi egy sokkal teljesebb készletet alkotnak. Harminckét 128 bites vektorregiszter áll rendelkezésre, szemben az SSE nyolc és az SSE2 16 regiszterével, emellett a legtöbb AltiVec utasítás három regiszteroperandust kaphat, ezzel szemben az IA-32-ben két regiszter/regiszter vegy regiszter/memória operandus a megszokott.

Az AltiVec abban is egyedülálló, hogy támogat egy igen hajlékony vektorpermutációs utasítást, amelyben az eredményvektor minden bájtja két másik vektor tetszőleges bájtjából származhat, és a kiválasztást egy újabb vektor paraméterezi. Ez igen bonyolult adatkezelkést tesz lehetővé egyetlen művelettel.

A GNU Compiler Collection (GCC) újabb változatai, az IBM VisualAge és egyéb fordítók belső funkciókat biztosítanak az AltiVec utasítások közvetlen elérésére a C és C++ nyelvű programokból. A GCC a 4. verziótól kezdve szintén tartalmaz auto-vektorizációs lehetőségeket, amelyek megkísérlik intelligensen létrehozni az Altivec által gyorsított binárisokat anélkül, hogy a programozónak közvetlenül a belső függvényeket kéne használnia. A natív vektor típusok használatát a "vector" típus-kulcsszó bevezetésével tették lehetővé, így pl. a "vector unsigned char foo;" C nyelvű programsor egy 128 bites, tizenhat 8 bites előjel nélküli karaktert tartalmazó "foo" nevű vektorváltozót deklarál. A vektoros típusokon az aritmetikai és bináris operátorok teljes készlete meghatározott, így a vektorváltozók szabályos C nyelvű kifejezésekkel kezelhetők. Léteznek még túlterhelt belső függvények, mint pl. a "vec_add", amelyek a megfelelő opkódot bocsájtják ki a vektor elemeinek típusától függően, és kikényszerítik a nagyon erős típusellenőrzést. Ezzel ellentétben, az Intel által az IA-32 SIMD regiszterek számára meghatározott adattípusok csak a vektorregiszterek méretét deklarálják (128 vagy 64 bit), valamint csak a 128 bites regiszterek esetén még azt, hogy a regiszter az egész vagy lebegőpontos értékeket tartalmaz. A programozónak az éppen alkalmazott adattípushoz ki kell választania a megfelelő beépített függvényt, pl. két, nyolc 16 bites egészet tartalmazó vektor összeadása a "_mm_add_epi16(x,y)" kóddal írható.

A tervezés története[szerkesztés | forrásszöveg szerkesztése]

Az AltiVec egy együttműködés keretében indított fejlesztési projekt eredménye, amelyet 1996 és 1998 között folytatott az Apple, IBM és a Motorola. Az Apple volt az AltiVec legfőbb vásárlója / felhasználója, egészen az Intel gyártmányú x86 alapú processzorokra való átállásig 2006-ban. A cég a multimédiás alkalmazások, pl. a QuickTime vagy iTunes gyorsítására használta az AltiVec egységet, és az Apple Mac OS X operációs rendszer Quartz grafikai összeállító rétegében. Más cégek is használták az AltiVec lehetőségeit a képfeldolgozó programjaikban, ennek egyik példája az Adobe Photoshop. Elsőként a Motorola gyártott AltiVec kiterjesztésű processzorokat, a G4 processzorvonaltól kezdődően. Az AltiVec egyes beágyazott rendszerekbe is belekerült, a nagy teljesítményű digitális jelfeldolgozás céljából.

Az IBM következetesen kihagyta a VMX-et a korai POWER mikroprocesszoraiból, amelyeket szerverekben való felhasználásra szántak, ahol ez a kiterjesztés nem látszott túl hasznosnak. A 2007-ben bemutatott POWER6 mikroprocesszor már tartalmazza az AltiVec kiterjesztést. A megvalósítás hasonló a 970 és Cell processzorokban kiépített megoldáshoz. Az IBM utolsó asztali mikroprocesszora, a PowerPC 970 (amelyet az Apple berkeiben "G5"-nek neveztek) szintén hardveresen implementálja az AltiVec kierjesztést, a PowerPC 7400-ban alkalmazott felépítéshez hasonlóan.

Az AltiVec a Power ISA v.2.03[1] specifikácó szabványos részegysége, a "Vektorprocesszor" fejezet írja le a vektor kategória részeként.

A Cell Broadband Engine, amely többek között a PlayStation 3 fő processzora, szintén támogatja az AltiVec kiterjesztést a PPU egységben (Power Processing Element vagy Power Processing Unit; IBM tervezésű Power architektúrájú processzormag, a Cell processzor egyik fő része), a szinergikus feldolgozóelemek (SPU) utasításkészlet-architektúrájával együtt, amely fejlettebb, de felépítésében hasonló.

A Freescale az AltiVec egy továbbfejlesztett verzióját építette be a e6500 alapú QorIQ processzoraiba.

VMX128[szerkesztés | forrásszöveg szerkesztése]

Az IBM továbbfejlesztette a VMX-et a Xenon processzorokban (Xbox 360) való felhasználás céljából, és a feljavított változatot VMX128-nak nevezte el. A fejlesztések újabb, játék-célú rutinokat is magukban foglalnak; ezek a 3D-s grafika és a játék fizikájának gyorsítására szolgálnak,[2] ugyanakkor a vektorregiszterek számát is 128-ra növelték. A VMX128 nem teljesen kompatibilis a VMX / Altivec kiterjesztéssel, mivel jónéhány egész műveletet eltávolítottak, hogy helyet csináljanak a nagyobb regiszterfájl és további alkalmazás-specifikus műveletek számára.[3]

VSX[szerkesztés | forrásszöveg szerkesztése]

A Power ISA v2.06 specifikáció egy újabb, Vector-Scalar Extension, VSX elnevezésű kiterjesztést (kategóriát) vezetett be, amely vekor-skalár utasítástípussal bővíti a Power ISA SIMD feldolgozását. A kiterjesztésben a regiszterek számát 64-re növelték, a végrehajtás támogatja a szabványos IEEE-754 lebegőpontos típusokat mind a skalár, mind a vektoros számításokban, Az első Power ISA v2.06-ot implementáló Power architektúrájú processzor a 2010-ben megjelent POWER7 volt.

Hibák[szerkesztés | forrásszöveg szerkesztése]

A C++ nyelvben az AltiVec támogatás elérésének szabványos módja kizárja a Standard Template Library vector<> osztálysablon használatát, és ez fordítva is így van, a "vector" fenntartott szóként való kezelése miatt, abban az esetben, mikor a fordítóprogram nem valósítja meg a vector szó környezetfüggő értelmezését. Fordítóprogram-specifikus elkerülő megoldásokkal azonban lehetséges a kettő kombinációja, például a GCC fordító esetén kiadható az #undef vector direktíva a vector kulcsszó tulajdonságának megszüntetésére, ezután a GCC-specifikus __vector használható helyette.

Implementációk[szerkesztés | forrásszöveg szerkesztése]

A következő processzorok rendelkeznek AltiVec bővítménnyel, a VMX-et vagy VMX128-at is beleértve

Motorola/Freescale[szerkesztés | forrásszöveg szerkesztése]

IBM[szerkesztés | forrásszöveg szerkesztése]

P.A. Semi[szerkesztés | forrásszöveg szerkesztése]

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

Fordítás[szerkesztés | forrásszöveg szerkesztése]

Ez a szócikk részben vagy egészben az AltiVec 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.

Források[szerkesztés | forrásszöveg szerkesztése]

További információk[szerkesztés | forrásszöveg szerkesztése]

Kapcsolódó szócikkek[szerkesztés | forrásszöveg szerkesztése]