Hirdetés

Kiderült honnan jön az Ampere magas számítási teljesítménye

Ahogy azt sejteni lehetett, a Turing multiprocesszorának egyik futószalagja lett átalakítva.

Az NVIDIA a hónap elején jelentett be az Ampere architektúrára épülő GeForce-okat, amelyek egyik érdekessége a rendkívül magas számítási teljesítmény volt. Ezeket a sok CUDA mag biztosítja, amit az előbbi hírben leírtunk, de a felépítésről nem szólt a fáma, így csak találgatni lehetett, hogy mi történt. Szerencsére egyre több információt lehet beszerezni a gyártóktól, így körvonalazódik a változás, amit az NVIDIA beépített.

Hirdetés

Az alapok megértéséhez érdemes szemügyre venni a Turing multiprocesszorát, amely négy compute blokkot tartalmaz, és itt kiemelnénk, hogy minden compute blokkban a 32 bites lebegőpontos, azaz FP32 operációk esetében egy darab 16 utas, a 32 bites integer, azaz INT32 mellett pedig egy darab szintén 16 utas feldolgozótömb áll rendelkezésre.

A Turing architektúra multiprocesszora
A Turing architektúra multiprocesszora [+]

Az Ampere compute blokkja az NVIDIA gyártópartnerei szerint más, ugyanis a 16 utas FP32 feldolgozótömbje változatlan, de az INT32-es opció kiegészült olyan formában, hogy már 32 bites lebegőpontos operációkat is képes végrehajtani. Az új dizájnban tehát egy compute blokkon belül két darab 16 utas FP32 feldolgozótömb található, vagyis egyszerre két darab olyan warp (megszokott szóhasználattal wave) is futtatható, amelyekben 32 bites lebegőpontos operációk kerülnek végrehajtásra. Ezzel az NVIDIA bevezet egy úgynevezett 16+16-os co-issue modellt, vagyis ideális körülmények fennállása esetén egy compute blokk 32 bites lebegőpontos számítási teljesítménye a Turinghoz képest megduplázódik. A kérdés az, hogy mi az optimális körülmény.

Elsődlegesen a két futtatott warp egy ütemezőn kerül kiosztásra, vagyis a feldolgozandó feladatok között nem állhat fenn függőség. Ez a legfontosabb kritérium, amire egyébként a shader kódokban is lehet majd figyelni, és erre vonatkozóan lesz egy programozási útmutató, amely segíti a fejlesztők munkáját. Amennyiben az ütemező a compute blokkon belül nem tud kiosztani két olyan warpot, amelyek nem függnek egymástól, akkor csak az FP32 feldolgozók fele fog működni.

Szintén lényeges, hogy ne legyen INT32 feladat, ugyanis ebben az esetben muszáj lekötni az INT32 operációkat kezelő 16 utas feldolgozótömböt, amely értelemszerűen így nem tud FP32-es operációkat elvégezni, tehát ezek a maradék 16 utas feldolgozón futhatnak, vagyis ismét az elméleti kapacitás fele érhető el.

Nem módosultak a regiszterek, tehát ugyan az FP32 feldolgozók megduplázódtak a compute blokkon belül, az adatokat annyi helyen kell tárolni, mint amennyit a Turing kínált. Ha esetleg olyan shadert fog futtatni a compute blokk, amelynek igen nagy a regiszternyomása, akkor nem biztos, hogy befogható a második 16 utas FP32 feldolgozótömb, vagyis egy fog működni. Az úgynevezett LDS-nyomás is probléma lehet, hiszen a kapacitás szabvány szerint állandó, de az NVIDIA be tud állítani nagyobb tárhelyet is. Mindezeken túl az ALU-k kiszolgálását az NVIDIA próbálja úgy javítani, hogy a compute blokkok között megosztott, multiprocesszorban található L1 gyorsítótár sávszélességét megduplázták 64-ről 128 bájt/ciklusra.

Ezek azok a szituációk, amikor a compute blokk a beépített teljesítmény felére kényszerül, tehát a maximális tempó kiaknázásához a shader fordítónak igyekeznie kell a potenciális problémákat kezelni, de ahogy említettük, ebben a fejlesztők is segédkezhetnek megfelelően írt, 16+16 co-issue működésre optimalizált shaderekkel. Ilyen szempontból az Ampere architektúra valamivel jobban függ majd a programkódtól, mint a korábbi generációk.

A fentiekkel kapcsolatban érdemes megjegyezni, hogy a számítási teljesítmény felezése csak leírva hangzik rosszul. Mielőtt mindenki elkezdené elosztani kettővel a megadott TFLOPS értékeket, hogy megkapják a dizájn legrosszabb eshetőség melletti teljesítményét, muszáj megérteni, hogy a GPU-k nem így működnek. Az azért igen ritka eset lesz, hogy pont egy adott pillanatban mindegyik compute blokk belefut valamilyen limitbe, és nem tudja kiaknázni a második 16 utas FP32 feldolgozótömböt. A gyakorlatban ezek egy része biztosan teljes tempóval fog működni, míg a másik részük a 32 bites lebegőpontos számítási teljesítmény szempontjából az elméleti maximum felével. Ami miatt az NVIDIA ezt a megoldást választotta az a könnyű implementálhatóság volt. A Turing dizájnjában már eleve ott csücsült a 16 utas INT32 feldolgozótömb, és azt nem túl nagy tranzisztorköltség kiegészíteni FP32 operációk támogatásával. Még ha nem is tud mindig működni a feldolgozók egyik fele, akkor is megérhette, mert a tipikus teljesítményelőny, amit a gyakorlatban hoz, nagyobb lehet, mint amennyi tranzisztor beépítését igényelte.

Lényegében tehát ez a titok, ami úgy megdobta az 32 bites lebegőpontos feldolgozás melletti elméleti számítási teljesítményt. Nyilván papíron az NVIDIA a maximális kapacitással számol, hiszen lehet írni olyan shadereket, ahol ez a gyakorlatban maximálisan kihasználható. Tulajdonképpen arra kell törekedni mostantól, hogy a fejlesztők írjanak is ilyeneket, mert az Ampere a Turinghoz viszonyítva kényesebbé vált az egyes szituációkra.

Előzmények

Hirdetés