Vélemény: a CUDA kiegészítheti az NVIDIA DirectX 12-es implementációját

Az aszinkron compute és a modernebb GeForce hardverek viszonya már több hónapja téma az iparág számára, hiszen az NVIDIA a támogatás mélységéről máig nem mond semmit. Ez a hallgatás nagymértékben megnehezíti a programfejlesztők életét, mivel a multi-engine implementálására vonatkozó döntéseiknél nem tudják, hogy mit szabad és mit nem a modernebb Kepler és Maxwell architektúrákon. Bár a vállalat kiadott egy segédletet a DirectX 12-re vonatkozóan, ez az aszinkron compute-ra csak az iparág általános szabályát fogalmazza meg, azaz nem szabad túlzásba vinni. Ez nem sok segítség, hiszen ugyanezeket már a Microsoft és az AMD is elmondta.

A vizsgálatok is sokszor félreértésekbe futnak, amelyet nemrég megpróbáltunk kibogozni. Bár ez a felhasználók számára talán elégséges információt jelent a lényeg megértésére, egy fejlesztőnek sokkal mélyebben kell tudnia a rendszer működését.

Hirdetés

Ami egyelőre látható, hogy az Xbox One konzolokra írt, lényegében szabványosnak tekinthető multi-engine kódokkal a GeForce nem fogja jól érezni magát. Megtudtuk, hogy a multi-engine egyik legkedveltebb felhasználási formája a két új generációs konzolon a hosszú ideig tartó compute feladatok kiszervezése az amúgy általánosan leterhelt parancsprocesszorokról, ugyanis amíg a grafika számítása történik, addig a többi compute feladat párhuzamosan kihasználhatja az éppen nem használt shader feldolgozókat. Ezeket jellemzően alacsony prioritással is be lehet fogni, és a számítások ily módot történő átlapolásával igen jó eredményeket lehet elérni.

Egy ilyen, jellemzően erőforrás-korlátozásokkal tarkított kód PC-n azonban csak a GCN-es Radeonokon működik hasonló hatékonysággal, míg GeForce-on valamiért igen magas processzorterhelést eredményez, és lassító hatása van a feldolgozásra. Előbbinek a pontos oka egyelőre rejtély, de utóbbi azért történik, mert a GeForce hardverek nem képesek párhuzamosan grafikai és compute feladatot futtatni a DirectX 12 követelményei mellett. Ez abból a szempontból kellemetlen, hogy a konzolra írt kódok nagy része olyan compute feladatot futtat, ahol a fejlesztő nézőpontjából nem számít, ha a kód valami miatt halogatja a feldolgozást, mivel mellette úgyis fut minimum egy grafikai feladat. A GeForce-on egy ilyen kód gyakorlatilag azt eredményezi, hogy a hardver a feldolgozás leállása és újraindítása között gyakorlatilag nem csinál semmit. Talán ehhez köthető a nagymértékű processzorterhelés is, ugyanis az NVIDIA meghajtója valószínűleg próbálja olyan sorrendben betölteni a parancsokat, hogy a hardver csak minimális időközönként álljon le teljesen. Ennek a kivitelezése nagyon nehéz, mivel a részletes elemzés viszonylag sok extra processzoridőbe kerülhet.

Sajnos az sem megoldás az NVIDIA számára, ha a compute parancsokat szimplán betölti a meghajtó a grafikai parancslistába. Bár alapvetően a Microsoft úgy dolgozta ki a DirectX 12-t, hogy ez legyen a menekülőút a régebbi hardverek számára, de ez a GeForce-okon, különösen a Maxwell architektúrán valamiért lényeges teljesítménycsökkenéssel jár, amit az NVIDIA szeretne elkerülni.

Az NVIDIA számára az ideális megoldás az eddigi tesztek alapján egy CUDA-val kiegészített DirectX 12-es implementáció, mivel szabványos formában valójában sehogy sem igazán jó egy multi-engine kód. Úgy tudjuk, hogy az AMD és az NVIDIA hardveres compute implementációi között a legfőbb különbség az erőforrás-korlátozások kezelése. Utóbbira azért van szükség, hogy kényszerített formában megakadályozható legyen a grafikus vezérlőn belül egy olyan művelet, amely elvileg korlátozhatja a programkód gyors és hibátlan lefuttatását. A működés szempontjából az AMD GCN architektúrája ezt a funkciót a fő parancsprocesszoroktól kezdve az ACE egységeket át az új GCN dizájn HWS blokkjaiig minden szempontból támogatja, de az NVIDIA modernebb Kepler és Maxwell architektúrái az erőforrás-korlátozások kezelésére csak a fő parancsprocesszoron belül képesek.

Az NVIDIA számára ez a döntés nagyon fontos volt, mert az erőforrás-korlátozás a hardver oldalán nem számít egyszerűen megoldható konstrukciónak, és szükséges tudás beépítése drámai mértékben növelheti a fogyasztást a sokkal komplexebb ütemezés miatt. A vállalat valószínűleg szándékosan döntött úgy, hogy csak a fő parancsprocesszor rendelkezzen ezzel a képességgel, mivel relatíve nagy esély van arra, hogy az adott compute feladat erőforrás-korlátozás nélkül is biztonságosan ütemezhető, ha pedig nem, akkor mehet a fő parancsprocesszoron keresztül. A cég azonban valószínűleg nem számított rá, hogy a Microsoft, vagy bárki más ezt a funkciót belátható időn belül minden parancsprocesszorban követelje egy szabványos felületen. Tulajdonképpen ez is érthető, az AMD-n kívül erre senki sem számított.

Lényegében ez lehet az NVIDIA legfőbb problémája, és emiatt a modernebb Kepler és Maxwell architektúrára GeForce-ok képtelenek valóban aszinkron módban futtatni egy grafikai és egy vagy több compute feladatot. Megoldás lehet azonban a CUDA. Utóbbi platform a DirectX 12-nél engedékenyebb, így a erőforrás-korlátozásokkal nem rendelkező compute parancsokat képes lehet a HyperQ funkciót támogató compute parancsprocesszorokon futtatni. Ez távolról sem mondható ideális megoldásnak, mivel rendkívül komplex meghajtóinfrastruktúrát követel, ami nem feltétlenül kedvező az NVIDIA számára, hiszen megnőne a hibalehetőségek száma is. Mindemellett a szabványos kód így sem lenne jó, tehát a fejlesztőknek direkten kellene támogatni a CUDA platformot is a DirectX 12-es leképezőn belül. Ehhez az NVIDIA-nak biztosítania kell egy olyan réteget, amellyel megoszthatók a két API között a pufferek.

Természetesen több platformmal senki sem szeret foglalkozni, de ez most egy speciális eset. Egy időszakos problémáról van szó, amire a CUDA-val kiegészített DirectX 12-es implementáció időszakos megoldást jelentene. Hosszabb távon az NVIDIA is nagyobb tudású hardverben gondolkodhat, így például a Pascal architektúra megjelenése után az időszakos extra támogatást szépen be lehet szüntetni, és mindenki vehet a mostani GeForce-oknál modernebb hardvert. Addig viszont nem árt, ha legalább a Maxwell architektúra kap egy kis segítséget a jobb belső kihasználhatóság érdekében, és a pascalos GeForce-ok megjelenéséig ezt valószínűleg a legtöbb fejlesztő nem tagadná meg.

Azóta történt

Előzmények

Hirdetés