2019. július 21., vasárnap

Útvonal

Tesztek » Videokártya rovat

AMD RX 5700 és 5700 XT: navigáció felfelé

Vajon mire elég az új architektúra és a korábban már bizonyított, 7 nm-es gyártástechnológia?

Mi a GPU-k gondja?

Szándékosan nem vágunk bele abba, hogy az AMD az előző oldalon taglaltakra milyen megoldással állt elő, mivel olyan fogalmakról lenne szó, amelyeket korábban egyetlen cikkünkben sem vizsgáltunk. Éppen ezért előbb érdemes megvizsgálni azt, hogy miképpen működik egy mai modern GPU. Példának jó lehet az AMD Vega és az NVIDIA Turing architektúrája, de ez igazából csak formalitás, az elméleti alapok mindkét dizájnon belül ugyanazok.

Az egyik legfontosabb működési szempont az adatpárhuzamosság. Ez a grafikus vezérlők esszenciája, de gondot jelent az adatok elérése. Ezek a memóriában vannak, vagyis ahhoz, hogy dolgozzunk velük, be kell őket tölteni a regiszterekbe. Maga a folyamat igen drága, akár 100 ns-nyi időt is igénybe vehet, az pedig nem lenne túl előnyös, ha addig a grafikus vezérlők nem csinálnának semmit. Emiatt a hardverek rengeteg konkurens szálat futtatnak. A koncepció nagyon leegyszerűsítve az, hogy ha az egyik szálhoz nincs adat, akkor nézünk egy olyat, amihez már van. Ha ez új adatelérésbe kezd, akkor lesz egy harmadik szál, ami betölthető, és így tovább, megfelelően optimalizált program esetében zömében lesz olyan szál, amit lehet futtatni, amíg a többihez beérkeznek az adatok.

A fenti leírás a közérthetőség kedvéért meglehetősen leegyszerűsített, de most, hogy a rendszer mögöttes koncepciója világos, leáshatunk mélyebbre is. Ha szálról beszélünk, akkor valami olyasmire gondol az ember, mint a processzorok feldolgozási szála. Olyan nagyon messze ez nem is jár az igazságtól a GPU-k esetében sem, de a rengeteg adat miatt ezeket nem túl célszerű egyesével kezelni, így a hardverek működése szempontjából a szálak azonos szemcsézettségű csoportokba vannak rendezve. Erre a gyártók másképp utalnak, az NVIDIA a warp, míg az AMD a wavefront nevet használja, ami tulajdonképpen a lényegen nem változtat. Mivel a Microsoft a shader modell 6.0 bevezetésével ezt a működési modellt már a HLSL programozási nyelv szintjén is kezeli, talán az lesz a legjobb, ha a redmondi óriáscég elnevezéseit vesszük figyelembe a továbbiakban, vagyis a warpot és a wavefrontot szimplán wave-nek hívjuk, a benne csoportosuló szálakat pedig lane-nek.

Ezek után érdemes rátérni a GPU-k legfontosabb részegységére, vagyis a multiprocesszorra. Ha nagyon le szeretnénk ezt egyszerűsíteni, akkor ami a processzornak a processzormag, az a grafikus vezérlőnek a multiprocesszor. A specifikus működés miatt azonban a GPU-k esetében elég sok lehetőség adódik a különböző fizikai felépítések alkalmazására. Ha a tipikusan alkalmazott FP32-t, azaz 32 bites lebegőpontos feldolgozást vesszük alapul, akkor például az AMD Vega multiprocesszora négy darab 512 bites, vagyis a végeredmény tekintetében négy darab 16 utas vektormotort tartalmaz, míg az NVIDIA Turing multiprocesszora is négy részre van osztva szintén 16 utas feldolgozótömbbel. Ez azt jelenti, hogy mindkét architektúra órajelenként 16 operációt tud végrehajtani a legkisebb végrehajtótömböt tekintve, de az ütemezésük ennél bonyolultabb.

Az AMD és az NVIDIA is wave-ekkel eteti a saját 16 utas tömbjeit, de ezek a wave-ek nagyobb méretűek. A Vega esetében 64, míg a Turingnál 32 lane-ből állnak. Ismerve a hardverek fizikai képességeit, könnyen kitalálható, hogy egyik dizájn sem képes egy órajelen belül végezni egy wave-vel. A Vegának ehhez 4, míg a Turingnak 2 ciklusra van szüksége, amiből az következik, hogy az egy munkaelemre levetített IPC (egy órajelciklus alatt elvégzett műveletek száma) rendre 0,25 és 0,5.

Ezzel önmagában nincs semmi baj, a GPU-knál rendkívül fontos, hogy az adatelérés késleltetése át legyen lapolva. Itt tulajdonképpen az történik, hogy egy bizonyos számú wave fut a végrehajtótömbökön, a Vega esetében maximum 10, míg a Turingnál maximum 32. Na de itt a kulcsszó a maximum, ugyanis számos shader programnál ez elérhetetlen, így akár az is előfordulhat, hogy mindkét architektúra esetében egy-egy wave-re csökken ez a szám. Hogy ez miért baj? Nos, a végrehajtótömbökön futó konkurens wave-ek száma határozza meg azt, hogy mennyire hatékonyan lehet átlapolni a memóriaelérés késleltetését. A lényeg, hogy ha egy wave lefutásához adatra van szükség, és azt éppen be kell tölteni a memóriából, akkor legyen egy olyan wave úgymond tartalékban, amelyhez megérkezett az adat, így megkezdheti a munkát.

Felvetődhet a kérdés, hogy mitől is függ, hogy a gyakorlatban mennyi wave futhat egy végrehajtótömbön? Leginkább a betöltött shader programtól, ez ugyanis döntően meghatározza az erőforrás-allokációt. Ezen a ponton dől el, hogy az adott shader mennyi regisztert igényel, illetve compute shaderek esetében még a helyi adatmegosztásra (LDS) is figyelni kell. A manapság használatos modellek mellett elképzelhetőek igen komplex shader programok is, amelyek nem éppen ideálisak a GPU-knak, ezek a hardverek ugyanis statikus erőforrás-allokációt használnak. Ez azt jelenti, hogy gyakorlatilag betöltenek minden adatot a regiszterekbe, illetve opcionálisan az LDS-be, amelyre az adott shadernek szüksége lehet. Mindez elég pazarló, ugyanis az adatbetöltés ténye még nem jelenti automatikusan azt, hogy az eltárolt adatot használni is fogja a futtatott kód, de egyelőre beletörődnek a gyártók ebbe, hiszen egy dinamikus erőforrás-allokációt biztosító hardver tranzisztorköltsége sokkal magasabb lenne.

Az előbb részletezett pazarlás ugyanakkor néha elég fájdalmas, mert elképzelhető, hogy egyetlen wave-hez annyi adatot kell betölteni, hogy az gyakorlatilag elviszi a regiszterek és/vagy az LDS kapacitásának több mint a felét. Ilyenkor nagyon nagy a baj, mert nincs annyi hely, hogy egy másik wave is indítható legyen, vagyis ha egy esetleges adatelérés történik, akkor a végrehajtótömbnek értelemszerűen meg kell várnia, amíg az információ megérkezik a fedélzeti memóriából. Ahogy fentebb említettük, ez úgy 100 ns-nyi időveszteség, és addig ez a hardveres blokk egyszerűen nem tud csinálni semmit.

A gyártók a fentiek miatt adnak egy iránymutatást minden architektúrához, hogy mennyi wave-vel milyen hatékonysággal működnek. Az AMD a Vega esetében azt ajánlja, hogy a maximális számú wave-nek a 70%-a fusson, míg az NVIDIA Turing esetében ez inkább 50-60% közötti. Ezekben az esetekben kellően jó lesz az érintett hardverek kihasználása, hiszen a feldolgozás során szinte mindig lesz egy olyan wave, amelyhez megérkezett már az adat és be lehet tölteni.

A cikk még nem ért véget, kérlek, lapozz!

Hirdetés

Előzmények

Gyártók, szolgáltatók

Hirdetés

Copyright © 2000-2019 PROHARDVER Informatikai Kft.