Általános célú számítási feladatok GPU-kon és DSP-ken való megvalósítása
1.
Bevezetés
Napjaink számítógépeiben szinte már kivétel nélkül megtalálhatók olyan különleges célprocesszorok, amelyek számítási képességei csak egy igen szűk területre vannak specializálódva. E processzorok létjogosultsága abban rejlik, hogy azt a szűk feladatkört, amit rájuk bíztak a tervezőés szoftverfejlesztő mérnökök, sokkal hatékonyabban tudják ellátni, mint ahogy azt a központi feldolgozó egység, vagyis a CPU tenné. Egy gép számítási teljesítményét e CPU-val szeretjük leginkább jellemezni; viszont a modern személyi számítógépekben már kozmopolitán módon elterjedt egyéb célprocesszorok fejlődése jogosan ingatja meg ezt a paradigmát! A fent említett részegységek a száraz megfogalmazással ellentétben pont azok, melyek a legtöbb élményt közvetítik a felhasználó felé: a hangkártya és a grafikus gyorsítókártya. Jelen írás készültekor már sok hír és bejelentés jelent meg a fizikai processzorokról (PPU), amelyek már 2006-ban, várhatóan videokártyákra integrálva fognak debütálni. E processzorok új életet hivatottak lehelni a valósidejű 3-dimenziós számítógépes grafikába azáltal, hogy komoly számításigényű fizikai kalkulációkat végeznek, mint amilyen az elasztikus testek dinamikája, a merev testek dinamikája, hidrodinamika, magas poligonszámú ütközés-detektálás, stb. Habár a felsoroltak közül a PPU rendelkezik a legszűkebb specializációval, magasfokú programozhatósága miatt a szerző úgy érzi, jó eséllyel szerepelhetett volna a cikkben, ha az egy évvel később íródott volna.
2.
Hangkártyák
Az e területen tevékenykedő kísérletező kedvűek inkább a grafikus kártyákon található GPU-val (Graphics Processing Unit – grafikus feldolgozóegység) foglalkoznak, mivel a témánknak megfelelő hangkártyák elterjedtsége szinte jelentéktelen a modern grafikus gyorsítókártyákhoz képest, és – habár a GPU-k piacán is igazából két gyártóról beszélhetünk – a tárgyalt hangkártyák csak egyetlen cég kínálatában szerepelnek (kivéve a profiesszionális használatra tervezett kártyákat, ahol ez a technológia mélyebben gyökerezik).
A Creamware 14 DSP-vel felszerelt stúdiókártyájának 2 GFLOPS-os teljesítménye 6 darab pentium II-esnek felelt meg, ha csak a számokat nézzük: de valójában sokkal gyorsabb volt
Creative Sound Blaster X-Fi: a gyártó szerint a kártya lelke egy pentium IV-es teljesítményű DSP processzor – ez már tömegtermék!
A hangkártyáknál szóban forgó technológia az általános, mikrokóddal programozható nagyteljesítményű DSP – Digital Signal Processing, vagyis digitális jelfeldolgozó processzor (az első ilyen tömegcikkben, a Sound Blaster Live! hangkártyában is mikrokóddal programozható volt az EMU10k1 jelű DSP, bár sok tekintetben korlátozott is volt). A DSP-k speciális architektúrájú processzorok, melyek különleges támogatást biztosítanak az olyan algoritmusukhoz, amelyekből a DSP műveletek nagyrésze felépül. Egy ilyen algortimusépítőkocka, a DSP processzorok alapképessége a különböző tömbök elemeinek összeszorzása, majd a részszorzatok szummarizálása (lásd pl. a konvolúció művelet a szoftver szintjén). Ezt speciális, tömbkezelést támogató, és az adott műveletre testreszabott címgenerátor áramkörök nagyon nagy mértékben meggyorsítják (némely címgenerátor még körkörös címzésre is képes). A részösszegeket / részszorzatokat ún. késleltető logikákkal lehet visszavezetni (hozzáadni/beszorozni) a számolás késsőbi szakaszán oda, ahova kell az adott részeredmény – ez pedig mindenféle beavatkozás nélkül fog bekövetkezni!
Fontos megemlíteni, hogy a DSP processzorok pontossága több, mint a legtöbb feladathoz szükséges, sőt a magasabb fokú IIR (infinite impulse response) digitális szűrők pontatlanságra való érzékenysége meg is követeli, hogy a DSP processzorok belső precizitása kiváló legyen (természetesen a DSP processzor lebegőpontos számokkal dolgozik). A DSP processzorok emellett nagyszámú regiszterrel rendelkeznek; egyszerre több memóriaműveletet tudnak végezni; valamint párhuzamosan több lebegőpontos aritmetikai művelet elvégzésére képesek, mely műveletek általában ki is merülnek az összeadásban és szorzásban. (A DSP processzorok területén érdekes irányú fejlődést jelent a Texas Instruments TMS320C6000™, TMS320C5000™, valamint TMS320C28x™ platformja. Ezek gyakorlatilag ötvözni próbálják a DSP és az általános CPU architektúrákat. Még saját valósidejű operációs rendszert is kapott a platform, amit DSP BIOS-ra kereszteltek.)
Az ilyen DSP-vel felszerelt hangkártyák számítási teljesítményének kiaknázása korántsem triviális feladat. Ha meg is oldanánk egy általánosabb probléma megfelelő formába kódolását, nem biztos, hogy a végeredményt a legmegfelelőbb módon tudjuk kinyerni. További kihívás, hogy a DSP egy olyan valósidejű rendszer, amelynek nem célja – bár vannak kivételek! – hogy gyorsabban végezze a dolgát, mint ahogy azt az élet rendje megköveteli. Vannak algoritmusok, amelyek nagyon szoros rokonságban vannak a DSP-vel. (pl képfeldolgozás) Sajnos azok, amelyek nem tartoznak ebbe a szoros rokonságba, szinte elérhetetlenül távolinak tűnnek. Mindazonáltal a probléma egyáltalán nem reménytelen – vagyis hogy általánosabb számítási célokra használjunk egy DSP-t. Ezen a területen minden bizonnyal a GPU-kéhoz hasonló fejlődés várható.
3.
Grafikus gyorsítókártyák
Modern PC már nem képzelhető el valamilyen – akár csökkentett képességű – 3D-s gyorsítókártya nélkül; sőt, a “videókártya” szót már-már szinte kizárólag ilyen kártyák megnevezésére használjuk. E kártyák központi elemei a GPU-k, amelyek mára komplex és kifinomult architektúrájúvá fejldőtek, immár lassan 5 éve több tranzisztort tartalmaznak, mint az első pentium IV-es processzor! A GPU-k felhasználása általános célú számításokhoz nem újkeletű: azonban a GPU-k architektúrája korábban nem tette ezt célszerűvé. ( A professzionális területen itt is voltak kivételek:
pl. a Silicon Graphics InfiniteReality nevű megoldása, mely nagymértékben programozható volt, hasonlóan a modern GPU-khoz) A legfőbb probléma a fix grafikus pipeline architektúra volt:
Tipikus kezdeti grafikus pipeline
A kirajzolási folyamat statikusan definiált lépések követésével, beavatkozás nélkül zajlik le, és kimenetként pixeleket kapunk. Ez nem elég: nem szolgáltat hatékony megoldást, és nem is tudjuk a problémáinkat – feladatainkat megfelelően megfogalmazni a GPU számára. A kártyák és az őket támogató szoftveres absztrakció (Direct3D, OpenGL) fejlődése nyomán ezt a szilíciumba égetett architektúrát lehetőségünk lett befolyásolni kis programocskákkal, amiket vertex shader-nek, illetve pixel shader-nek neveznek. Ezek az assembly-hez hasonlatos szintű nyelvek: bár a vertex shader inkább egy absztrakció, mint közvetlenül végrehajtott gépi kódú (GPU) utasítások sorozata, és ez is az óriási előnye: a viszonylag jó gyártó- és modellfüggetlenség. A pixel shader történelmében voltak nagyon csúnya inkompatibilitások, mert alacsonyabb szintű nyelv volt; talán mára már javult a helyzet. A pixel shaderek a vertex shaderekkel szemben több megkötést tartalmaznak (pl a logikai operátorok hiánya), ezért általános célú számításokra nagyobb előszeretettel alkalmazzák a vertex shadereket.
A modern GPU-k programozható pipeline-ja
Habár mindez a műszaki háttér 3-dimenziós geometria megjelenítését volt hivatott végezni, a shaderek (programok) segítségével már lehetőségünk kínálkozik kiaknázni a GPU-ba rejlő, olykor óriási számítási teljesítményt. A vertex programok maximális méretére elég súlyos korlátot helyeztek: eleinte ez 128 művelet volt, de a specifikáció legújabb verziójában (SM3 – shader model 3) már 65536 utasításból állhat minden programunk. További fontos fejlődés precizitás – a HDR (magas dinamikatartományú) képinformációk igénye miatt már 32-bites lebegőpontos színinformációkkal dolgozhatunk a pixel shaderek-ben. Ezek persze szép adatok, de sose szabad elfelejteni, hogy nem biztos, hogy mindenhol a legújabb és a legmodernebb GPU dolgozik. A vertex shader nyelvére minden okunk megvan úgy tekinteni, mint a GPU egy részének az ISA-jára (Instruction Set Architecture). A vertex shader-ek utasításkészlete viszonylag kicsi (nem a legújabb specifikációt tekintjük):
Művelet
Leírás
ARL
Skalár betöltése
MOV
Adat mozgatása
MUL
Szorzás
ADD
Összeadás
SUB
Kivonás
MAD
Szorzás és összeadás
ABS
Abszolútérték
RCP
Reciprok
RCC
Reciprok (korlátos)
RSQ
Reciprok + négyzetgyök
DP3
3 vektor skaláris szorzata
DP4
4 vektor skaláris szorzata
DPH
Homogén skaláris szorzat
DST
Távolságvektor
MIN
Minimum
MAX
Maximum
SLT
Ha kisebb, akkor :=..
SGE
Ha nagyobb egyenlő, akkor :=..
EXP
2 alapú exp
LOG
2 alapú logaritmus
LIT
Fény együttható formula
Természetesen az operandusok is megvannak: ezek olyan regiszterek, amelyekben egyenként egy lebegőpontos számnégyes van. Négyféle típusú regisztert különböztetünk meg: csak olvasható bemeneti attribútumregisztereket, csak írható kimeneti regisztereket, a csak olvasható konstansregisztereket és az átmeneti regisztereket. Habár bonyolult vezérlési szerkezeteket nem tudunk megvalósítani ezzel a nyelvvel, az SLT és SGE utasítások elég sokat segíthetnek rajtunk, hasonlóan a Pentium II-es CMOV utasításaihoz. Végül az alábbiakban látható pár, a Washingtoni Egyetem által végzett összehasonlítás egy 1.5GHz-es Pentium IV-es gép CPU-ja és egy Geforce4 Ti4600 GPU-ja között.
Aritmetikai teszt. Egy vektor minden elemére Mátrixszorzás. 1500X1500-as mátrix esetén a kiszámolásra kerül a log(πx ) kifejezés. Nagy GPU 3.2-szer gyorsabb, mint a CPU 3
vektorok esetén a GPU több, mint 6-szor jobban teljesít, mint a CPU.
4.
Konklúzió
A számítógépünkben található speciális feladatokat ellátó célhardverek olyan fejlődésen mentek keresztül, hogy némely esetben általánosabb számítási feladatokban is jóval túlteljesítik a CPU-t. Tény és való, hogy a jelenség átlépte azt a küszöböt, hogy megérje vele foglalkozni, de még így is nyitva van számos elméleti és gyakorlati kérdés. De miért is ne használjuk ki a gépünkben lakozó rejtett teljesítménytöbbletet, különösen, ha az igen jelentős? Azoknak, akiknek felkeltettem http://www.gpgpu.org/
az
érdeklődését,
ajánlom
a
gpgpu-s
közösséget:
Nyári Zoltán