A Microsoft a tegnapi napon leplezte le a DirectX 12 majdnem végleges specifikációit, de emellett egy külön előadás foglalkozott két rendkívül értékes opcionális funkcióról. Ebből kitalálható, hogy ezeket nem kötelező támogatni, de rendkívül hasznosak, és elképesztő mértékben tudják növelni az elérhető teljesítményt, főleg olyan szituációban, ahol GPU-limit keletkezik.
Mielőtt belekezdenénk ezek bemutatásába, fontos megemlíteni, hogy abszolút tévedés az a felhasználók körében elfogadott álláspont, hogy a mai grafikus vezérlők kihasználása magas. Ezekre a lapkákra ugyan adatpárhuzamos processzorként tekintünk, ami bizonyos szintig igaz is, de valójában heterogén felépítésű adatpárhuzamos processzorokról van szó. A heterogén felépítés egyrészt a kulcs a GPU-k működéséhez, másrészt viszont az egyik legnagyobb fék a hatékony kihasználás szempontjából.
Hirdetés
A miértekre érdemes a modern videojáték-motorok működését látni. Egy manapság korszerű rendszer több ezer grafikai és nagyjából száz compute futószalagból rajzolja meg a képkockát. Ez összességében több ezer feladatot jelent, amelyek meghatározott sorban, egymás után futnak le. Itt jön elő a heterogén felépítés problémája, ugyanis a tesszelláció például nagyrészt a tesszellátort terheli, vagy például a shadow mapok számítása főleg a ROP blokkokat veszi igénybe, és ezek mellé még rengeteg feladatot lehetne felhozni ahol a shader processzorok terhelése alacsony. Elméletben tehát nagyon jó, hogy a GPU-k adatpárhuzamos processzorok, de ha nincs mivel etetni a shader processzorokat, akkor ez csak elmélet marad.
Erre a problémára a DirectX 12 az aszinkron compute képességet veti be. A Microsoft szerint a jövőben a compute feladatok száma megnő. Ennek egyrészt a grafika fejlődése az oka, másrészt számos effektet sokkal kedvezőbb compute shaderben megírni, mert a mai hardvereken gyorsabban fognak futni, mint az elavultnak tekinthető implementációk.
Ugyanaz a shadow map és lighting feladat normál és aszinkron compute mellett. Utóbbi esetben látható, hogy mennyivel kevesebb a fehér négyzet, azaz a kihasználatlan részegység. [+]
Az aszinkron compute arra szolgál, hogy a compute feladatok egymás mellett, vagy a grafikai feladatokkal párhuzamosan futhassanak. Ez azt jelenti, hogy például a tesszelláció mellett a nagyrészt kihasználatlanul álló shader processzorokon indítani lehet egy vagy több compute feladatot, amelyek a tesszellálást nem zavarják, és máris nő a grafikus vezérlő kihasználása. Ugyanez vonatkozik shadow mapok számítására, és más shader processzorokat alig terhelő grafikai feladatra.
Az aszinkron compute beépítése azonban minden esetben komoly elemzést igényel, hiszen a soros feladat-végrehajtás során biztosított, hogy az egymásra épülő feladatok egymás után fussanak le. Az aszinkron compute esetében ehhez szinkronizálni kell az egymás mellett párhuzamosan futó feladatokat. Ugyanakkor ez még így is rendkívül hasznos, és egy jól kivitelezett rendszer komoly gyorsulást hozhat a GPU-limites, illetve mondjuk inkább úgy, hogy annak hitt szituációkban.
Az aszinkron compute képesség olyan grafikus vezérlőket igényel, amelyek egyszerre több compute parancslistából is képesek parancsot fogadni. Ennek megfelelően ezt a képességet támogatják a GCN-architektúrára épülő Radeonok, illetve az NVIDIA GM204, GM206, GM107, GK208 és GK110 kódnevű lapkáira alapozó GeForce-ok. Persze a hatékonyság nagyban függ az architektúrától, így nem mindegy, hogy konkrétan hány compute parancslistából olvasható be parancs, illetve az is fontos, hogy a GPU-k multiprocesszoraiban a shader processzorokra levetítve kellő mennyiségű regiszter legyen, továbbá lényeges tényező, hogy mekkora az egységnyi operációra lebontott sávszélesség a multiprocesszorokon belül. Erre vonatkozóan készítettünk két táblázatot az egyes architektúrákról és azok verzióiról.
Gyártó | AMD | ||||
---|---|---|---|---|---|
Architektúra verzió |
GCN Southern Islands |
GCN Sea Islands |
GCN Volcanic Islands |
||
APU-k vagy GPU-k kódneve | Oland, Cape Verde, Pitcairn, Tahiti |
Bonaire | Kabini, Temash, Beema, Mullins |
Hawaii, Kaveri |
Tonga |
Compute parancslisták száma | 2 | 16 | 32 | 64 |
|
Multiprocesszoronkénti regiszterterület | 256 kB | ||||
Shader processzorra levetített regiszterterület | 4 kB |
||||
Egységnyi operáció sávszélessége | 1,5 bájt/FLOP |
Gyártó | NVIDIA | |||
---|---|---|---|---|
Architektúra verzió |
Kepler V2 |
Maxwell V1 |
Maxwell V2 |
|
GPU-k kódneve | GK208 | GK110 |
GM107 | GM206, GM204 |
Compute parancslisták száma | 32 | |||
Multiprocesszoronkénti regiszterterület | 256 kB |
4 x 64 kB |
||
Shader processzorra levetített regiszterterület | 1,33 kB |
2 kB |
||
Egységnyi operáció sávszélessége | 0,33 bájt/FLOP | 0,66 bájt/FLOP | 1 bájt/FLOP |
Az Intel esetében megtudtuk, hogy a Gen7.5 és Gen8 architektúrára épülő IGP-k nem támogatják a DirectX 12 aszinkron compute képességét, de maga a funkció annyira hasznos, hogy a következő generációs fejlesztéseiknél meg lesz oldva a támogatás.
Az aszinkron DMA szintén egy hasznos, bár ismét csak opcionális funkció, hiszen lehetővé teszi a memóriamásolásokat anélkül, hogy a le kellene állítani a feldolgozást a másolás idejére. Ennek az újításnak az igénye egy olyan grafikus vezérlő, amelyben két aktív DMA motor található. Ennek megfelelően ezt a képességet támogatják a GCN architektúrára épülő Radeonok, illetve az NVIDIA GM204 és GM206 kódnevű lapkáira alapozó GeForce-ok.
Fontos kiemelni, hogy az NVIDIA esetében az összes Fermi és Kepler architektúrára épülő, Quadro családba tartozó VGA is megfelel a célnak, hiszen a vállalat már régóta két DMA motort épít a lapkáiba, de ezek közül az egyiket a korábbi években mindig letiltották a GeForce-okban, így a GM204-es és GM206-os lapkákra korlátozott támogatás tulajdonképpen egy mesterséges limitáció eredménye.