Skip navigation

Szálkezelés

Célok

Ennek az anyagrésznek a célja a CUDA szálkezelés tisztázása. A programok megértse után az olvasó tisztában lesz az alapvető CUDA szálkezeléssel, és képes lesz jó minőségű nagyban párhuzamos kódokat írni GPU-ra.

CUDA szálstruktúra

A CUDA-ban nagy számú párhuzamosan futó szálat indíthatunk el egyszerre. Ez egy sztruktúrált formában történik több szinten az által, hogy a <<<grid, block>>> indítási paraméterekben megadjuk astruktúrát.

  • Az indítási struktúra felső szintje a rács (grid).
    • Blokkok strukturált tömbje.
  • A második szinten a blokkok állnak.
    • Szálak strukturált tömbje.
  • A valódi számítást valójában a szálak (thread) intézik.
    • A kernel egy-egy futásának a példánya.
    • Egyedileg azonosítható.

CUDA párhuzamos szálstruktúra

GPU és szálstruktúra kapcsolata

A szálak fent megadott struktúráltsága nem véletlen. A megértéséhez szükség van a GPU felépítésének ismeretére.

A GPU-ban multiprocesszorok vannak amelyek ALU-k tömbjei. Ezek a multiprocesszorok végzik a számítást. Az elindított rács blokkjait és szálait a GPU ütemezője osztja ki a multiprocesszorokra úgy, hogy szálak a szálakat kiosztja egy-egy ALU-nak.

GPU architektúra és szálstruktúra kapcsolata

Fontos még, hogy a kiosztásra nincs ráhatásunk. Illetve ha egy blokk bekerült a multiprocesszorba, akkor ott is marad amíg az összes szálja le nem futott. Ha egy blokk végzett akkor az ütemező eg másik blokkot tölt a helyére. A legjobb ha a blokkok sorrendjét és kisztását véletlenszerűnek tekintjük.

Tehát egy blokk csak egy mutiprocesszorban dolgozik és ha végzett nem lehet visszatölteni. Ez az oka, hogy a programunk szálainak fóüggetlennek kell lennie. Van sorrend a szálak végrehajtása között, amire nincs ráhatásunk.