21. tétel - Grafikus kártyák felépítése

Minek köszönhető az általánosan programozható grafikus kártyák léte? Miben különbözik a GPU és a CPU hardver programozói szemmel (cache, memory latency hiding, stb.)? Milyen specialitásokkal és korlátokkal bír a GPU hardver (SIMT végrehajtás, memória, stb.)? Milyen jellegű feladatoknál célszerű használni a GPU-t?

GPU-k fejlődése

A GPU-k megjelenését jelentősen befolyásolta a 3D grafika megjelenése.

  1. A 3D térből az objektumok leképezése a 2D síkra az objektumok háromszögekre való bontásával történik
  2. Ezek a pontok egymástól függetlenek → jól párhuzamosítható a GPU sok végrehajtó egységén
  3. Különféle 3D grafikák más-más workloaddal járnak → shaderek számát nehéz optimalizálni
  4. Probléma áthidalható Unified Shader-rel: egyfajta shader, teljesen általánosan használható végrehajtó egységekkel
  5. Ezzel a hardver rendelkezésre állt, megjelent a GPGPU (General Purpose Computing on GPUs)
  6. Kezdetben kódot írni nehézkes volt → azóta a GPU gyártók driverekkel, framework-ökkel segítenek.

CPU-GPU különbségek

CPUGPU
Nagy teljesítményű ALU-kEnergiahatékony ALU-k, de nagyon sok
Relatíve nagy cache, hogy ne kelljen mindig a memórához nyúlniRelative kis cache
Bonyolult és hatékony vezérlés: branch prediction, data forwarding, stb.Egyszerű vezérlés: nincs branch prediction vagy data forwarding
Gyors kontextusváltás: az adatok a szálakhoz vannak rendelve, nem kell őket másolgatni kontextusváltáskor

Memory Latency Hiding

  • A végrehajtó egységeknek sok adatra van szüksége
  • A memóriasebességek lassabban nőnek, mint a számítási teljesítmény.
  • Elkerülendő, hogy a feldolgozás adathiány miatt várakozzon.
Hogyan oldja meg ezt a CPU?Hogyan oldja meg a GPU?
Bonyolult és hatékony utasítás- és elágazás-előrejelzéssel.
  1. előre betölti azokat az adatokat a memóriából, amikre nagy eséllyel szükség lesz
  2. mire a végrehajtás odaér, az adat rendelkezésre áll
Manapság ez a branch prediction ~95% körüli hatékonyságú.
Nincsenek ilyen kifinomult módszerek. Ha az egyik szál megakad, mert adat kell a memóriából:
  1. a GPU azonnal másik szálra vált, ahol nincs ilyen akadályozó tényező
  2. Majd visszavált
Ezáltal jóformán nem is kell cache.

Ehhez persze több szál kell, 1 szál esetén nem működik.

Specialitások és korlátok

SIMT végrehajtás

A GPU-kban csak egy utasításértelmező/vezérlő tartozik a VE-khez → egyidőben minden VE csak ugyanazt az utasítást hajthatja végre (más adaton).

  • A SIMT a SIMD-hez hasonló, egymás melletti szálak itt is azonos utasítást hajtanak végre
  • azonban a SIMD-től eltérően nem csak egymás melletti adatokon tud dolgozni.
  • De mi van akkor, ha egy kódban van elágazás?
    • valamelyik szálnak az igaz, valamelyiknek a hamis ágat kell lefuttatni, de csak ugyanazt képesek egyszerre végrehajtani
    • megoldás:
      • míg bizonyos ágak az igaz ágat futtatják, a többi kikapcsol, majd fordítva
      • eredmény: sokkal rosszabb teljesítmény

Memória

A GPU-nak külön memórája van.

  • ide át kell másolni azokat az adatokat, amikkel a számítást kell végezni
  • a másolás időigénye miatt sokszor értelmét veszti a GPU végrehajtás

Megoldás: úgy kell megírni a kódot, hogy minél jobban elkerüljük a költséges adatmásolásokat. Például a véletlen számokat a GPU-n hozzuk létre, nem a CPU-ról másoljuk.

Milyen jellegű feladatoknál célszerű használni a GPU-t?

  • nagy számításigényű feladatoknál, ahol nagyon sok szálat kell indítani.
  • olyan feladatoknál, amik jól párhuzamosíthatóak (pl. szálak között nincs függőség).

Előnyök

  1. magas csúcsteljesítmény
  2. jó ár-érték arány
  3. skálázható
  4. dinamikusan fejlődő (játékipar)

Hátrányok

  1. adatmásolások miatti korlátok
  2. GPGPU programozás eléggé új terület, így költségesebb vele foglalkozni