A párhuzamosítás formái (SMT, SIMD, SIMT)

A programok párhuzamosítása manapság az egyik legfontosabb kutatási terület a szoftverfejlesztők és a hardvergyártók körében is. A párhuzamosítás hardverszintű kivitelezése jelenti a lényeges problémát, hiszen e rendszereknek ez a kulcsa. Ahogy sok más területen itt is van számos választási lehetőség, és egyik sem egyértelműen rosszabb vagy jobb a másiknál, csupán más modellnek tekinthetők. Ma leginkább három nagy csoportba sorolható be a párhuzamosítás kivitelezése: SMT, SIMD és SIMT.

Az SMT (Simultaneous Multi-Threading) az egyik legegyszerűbb forma, hiszen tulajdonképpen a mai homogén többmagos processzorok kihasználása ide sorolható. Lényegében a programozó számos programszálat futtat párhuzamosan, és ügyel ezek szinkronizálására. Ez kínálja a program oldaláról a legtöbb flexibilitást, ugyanakkor a hatékonyság szempontjából ez a legrosszabb. Mindemellett a programozók szempontjából sem annyira kedvező, hiszen explicit szálmenedzselést kell végezni.

A SIMD (Single Instruction Multiple Data) funkcionálisan igen különböző, mert ennél lényegében valamilyen hosszúságú vektorműveletek párhuzamos futtatása zajlik. Minél hosszabb vektorokra van szükség, annál nehézkesebb optimalizálni rá, hiszen a fordítóprogram nem biztos, hogy tökéletes vektorokat készít a forráskódból, ilyenkor pedig majdnem assembly, azaz igen alacsony szinten kell manuálisan optimalizálni. Ugyanakkor amellett, hogy a SIMD által kínált flexibilitás igen korlátozott, a hatékonyság – megfelelően megírt kód mellett – kiváló lehet, tehát a programozás oldalán keletkező kellemetlenségeket teljesítményével képes ellensúlyozni.

A SIMT (Single Instruction Multiple Thread) modell egyfajta érdekes keveréke a fenti két koncepciónak. Leginkább arany középútként jellemezhető, mivel nem kínál olyan flexibilitást, mint az SMT, de nem is olyan rossz, mint a SIMD, ezzel egyetemben teljesítménye sem biztos, hogy olyan jó lesz, mind a SIMD-é, ugyanakkor az SMT-nél hatékonyabb. A SIMT előnye a SIMD-hez viszonyítva leginkább a programkódban észlelhető. A párhuzamosítás koncepciója lehetővé teszi, hogy számos esetben a fejlesztő egy szálra levetített kódot írjon általános aritmetikai operátorokkal, ami sokak számára lényegesen kényelmesebb, mint az SMT-s explicit szálmenedzselés, illetve a SIMD-es vektorokra való optimalizálás. Emellett a címszámításnál jóval kedvezőbb a SIMT modell, mivel működésének természete kompenzálja a magas késleltetést anélkül, hogy rontaná a feldolgozók kihasználását. Ez olyan kódok párhuzamosítását is lehetővé teszi, ami a hagyományos SIMD modellen nem, vagy csak nagyon nehézkesen oldható meg.

Általánosan elmondható, hogy a teljesítmény szempontjából a SIMD modellre lehet a leggyorsabb kódot írni, a SIMT nem sokkal lemarad mögötte, míg az SMT esetében az elérhető hatékonyság elég rossz is lehet, ami a kód teljesítményére sem hat kedvezően.

A flexibilitás, azaz az elvben leprogramozható kódok szempontjából már az SMT tekinthető a legjobbnak, míg a SIMT a működési modelljével elég jó lehetőségeket teremt, ám a SIMD a koncepciója számos kód leprogramozását nem teszi lehetővé.

A programozás szempontjából elvben a SIMT a legkönnyebb opció. Ilyenkor a fejlesztőnek sem a szálak, sem pedig a vektorok optimalizálásával nem kell törődnie, amelyek tipikusan megnehezítik a munkát. Az SMT már nehezebb, hiszen a létrehozott szálak menedzselése és szinkronizálása sokszor kellemetlen munka. Elvi szinten a hatékony SIMD kód programozása a legnehezebb, de ez függ attól is, hogy milyen széles vektorokat kezel a hardver. 128 bites vektorok kihasználása relatíva könnyű, de efölött már akadnak nehézségek.

Az adatpáhuzamos modellek szempontjából fontos kiemelni, hogy a SIMD és a SIMT lényeges különbsége, hogy előbbit a függőség, míg utóbbit a kihasználtság limitálja. Ha sok az adott kódban a függőség, akkor egyszerűen nem lehet jól munkára fogni a hardveren belüli vektorfeldolgozókat, mivel a szükséges adat még kiszámításra vár. Ez nyilván csökkenti a hatékonyságot. A hardvernek ilyen problémája nincs a SIMT modell mellett, viszont ahhoz, hogy a temérdek feldolgozót kihasználja a programozó, rengeteg programszálat kell párhuzamosan futtatni. Minél kevesebb a futtatott szál, annál kisebb a hardver kihasználtsága.

Természetesen az SMT esetében is kell számolni limitációkkal, de ez leginkább attól függ, hogy a programozó milyen hatékonyan képes a szálak közötti szinkronizációt biztosítani, illetve figyelembe kell venni, hogy a túl sok szinkronizáció már ronthatja a teljesítményt, így az adott feladatra érdemes csak annyi magot használni, amennyivel még hatékony lehet a feldolgozás.

Hirdetés