GPU-optimalizálás - igazságok, a it-jegyzetek

[Pullquote align = "left | center | right" textalign = "left | center | right" width = "30%"] magok soha nem túl sok ... [/ pullquote]

Modern GPU - ez szörnyű vadállatok fürge, képes rágni gigabájtnyi adatot. Egy ember azonban ravasz, és mivel nem növekszik a számítási teljesítmény, jön fel a feladat egyre nehezebb, így jön egy pillanat, amikor meg kell jegyeznünk, a szomorúság - szükség optimalizálás 🙁

Ez a cikk ismerteti az alapvető fogalmakat annak érdekében, hogy könnyebb navigálni az elmélet GPU-optimalizálás és alapvető szabályok ezeket a fogalmakat, el kellett menni kevesebb.

Az okok, amelyek miatt a GPU hatékony nagy mennyiségű feldolgozandó adatok:

  • hogy több lehetőséget párhuzamos feladatok végrehajtása (sok-sok processzor)
  • nagy sávszélességű memória

Memória Sávszélesség (memória sávszélesség) - ez mennyi információt - bit vagy gigabájt - lehet továbbítani az időegység, vagy egy második feldolgozási ciklust.

Az egyik probléma az optimalizálás - használja a maximális kapacitás - a teljesítmény növelése áteresztőképességű (ideális esetben meg kell egyeznie a memória sávszélesség).

Hogy javítsa a sávszélesség-használat:

  • megnöveli az információ - használja a járat teljes (pl minden szál működik float4)
  • a várakozási idő csökkentése - a késedelem a műveletek

Delay (késleltetés) - közötti időszak, amikor a szabályozó kért konkrét
memória cella, és a pillanat, amikor az adatok elérhetővé kell tenni a processzort az utasítások végrehajtására.
Abban a késés nem tudjuk érinti - ezek a korlátozások vannak jelen a hardver.
Ez annak köszönhető, hogy ez a késedelem, a processzor egyidejűleg képes több szálat -
amíg az áramlás, és a kérés, hogy neki a memória áram B lehet valamit számolni és stream várni, hogy jöjjön a kért adatokat.

Hogyan lehet csökkenteni a késleltetést (latency), ha a szinkronizálás használjuk:

  • számának csökkentésére adatfolyamok blokkban
  • számának növelése blokkcsoportokra

Használata GPU források maximális - GPU Férőhely

A GPU számítási teljesítmény - több száz processzoros éhes számítások létrehozásakor a program - a mag (kernel) - a programozó válláról megállapítják a terheléselosztás terhet ró rájuk. Hiba vezethet az a tény, hogy a legtöbb ilyen értékes erőforrásokat lehet tétlen céltalanul. Most fogom magyarázni, hogy miért. Meg kell kezdeni a távolból.

Hadd emlékeztessem önöket, hogy a lánc- (lánc az NVidia szempontból hullámfront - AMD terminológia) - egy sor szálak egyszerre ugyanazt a funkciót látja a processzor-Kernel. Az áramok kombinált tömb osztva a programozó a láncfonal ütemező (külön-külön minden egyes multiprocesszoros) - amíg egy lánc- fut, egy második memóriát várakozó kérések feldolgozására, stb Ha néhány láncszála még számításokat végezni, és mások már megtették amit lehetett - a hely, hogy nem hatékony felhasználása a számítási erőforrások - népszerű néven a kihasználatlan kapacitás.

Minden szinkronizálási pont, minden elágazás logika helyzetet idézhet elő az inaktivitás. A maximális eltérés (végrehajtás logikai elágazás) méretétől függ a vetemedik. GPU NVIDIA - 32 AMD - 64.

Annak érdekében, hogy csökkentsék egy egyszerű többprocesszoros futásidejű lánc-:

  • csökkenti a várakozási időt akadályok
  • hogy minimalizálja a különbség a teljesítmény logikai függvények-Kernel

Ahhoz, hogy hatékonyan megoldani ezt a problémát értelme megérteni - hogy a formáció a lánc- (abban az esetben a nekolko méretek). Tény, az eljárás egyszerű - elsősorban az X, Y és majd, az utolsó esetben, Z. A

GPU-optimalizálás - igazságok, a it-jegyzetek

kernel elindul, blokkok mérete 64 × 16, a láncfonalak vannak osztva a sorrendben X, Y, Z - azaz a az első tagja a 64 vannak osztva két vetemítési, majd a második, stb

GPU-optimalizálás - igazságok, a it-jegyzetek

A kernel elindul, blokkok mérete 16 × 64. Az első vetemítési hozzáadjuk az első és második elemek 16 a második vetemítési - a harmadik és negyedik, stb

Hogyan lehet csökkenteni a divergencia (emlékszik - elágazás - nem mindig az oka a kritikus a termelékenység csökkenését)

  • ha a szomszédos patakok különböző módon kivitelezés - sok szempontból, és rájuk kattint - keresni a módját, hogy újra strukturálása
  • törekszünk, nem szimmetrikus terheléssel áramlás és határozottan eltávolítani (ez az, ahol nem csak az, hogy vannak olyan körülmények, kacsa még esedékes ezeket a feltételeket az első menet mindig valamit számítani, és az ötödik ebben az állapotban nem esik, és üresjáratban)

Hogyan kell használni a GPU a max

GPU erőforrások, sajnos, szintén megvannak a maguk korlátai. És, szigorúan véve, a rendszermag előtt funkciót, akkor van értelme, hogy meghatározza azokat a korlátokat és ezeket a korlátokat figyelembe veszik a megoszlása ​​a terhelést. Miért fontos ez?

  • blokkok száma / munkacsoport folyamok többszörösének kell lennie számos stream processzor
  • blokk méret / munkacsoport többszörösének kell lennie a lánc-

Meg kell venni, hogy az abszolút minimum - 3-4 lánc- / veyfronta fonás egyszerre minden processzor, bölcs vezetők azt tanácsolják, hogy folytassa a szempontok - nem kevesebb, mint hét veyfronatov. Ugyanakkor - ne felejtsük el, a korlátozások hardver!

Élén ezeket a részleteket, hogy a könnyen unatkozik, mert a számítás GPU-kihasználtság NVidia felajánlotta egy váratlan eszköz - ekselny számológép tele makrók (!). Ott megadhatja az információkat a szálak maximális száma az SM, a regiszterek száma és mérete a közös (megosztott) memória áll rendelkezésre a stream processzor, és a paraméterek funkció elindításához - és ez ad egy százalékát erőforrás-felhasználás hatékonysága (és hányt a fej haj felismerve, hogy ahhoz, hogy használni az összes magot hiányolod regiszterek).

GPU és a memória műveletek

A probléma ebben a helyzetben - minden kérésre választ küld vissza az adatokat nagysága több darab 128 bites. És minden szál a rendszer csak a negyedét (abban az esetben a hagyományos négy bájtos változó). Ha a szomszédos patakok egyszerre dolgozunk az adatok sorba a memóriában sejtek - ez csökkenti az összes memória hozzáférés. Hívják ezt a jelenséget - kombinált olvasási és írási műveletek (összeolvadt hozzáférés - jó olvasni és írni!) -, valamint a helyes kód szervezet (strided hozzáférés folytonos darabkája memória -! Rossz) jelentősen javíthatja a teljesítményt. Ha a szervező a kernel - emlékszik - szomszédos hozzáférés - belül az elemek egy memória sor, együttműködik az elemek az oszlop - ez nem olyan hatékony. Szeretne további információkat? Tetszett itt pdf - vagy google „memória coalescing technikák”.

És végül, egy kicsit többet a memóriát. Osztott memória többprocesszoros általában szervezett formában tárolószintek tartalmazó 32 bites szó - adatokat. A bankok száma a jó hagyomány változik egyik generációról a másikra GPU - 16/32 Ha minden szál kér adatokat egy másik bank - minden jó. Egyébként kiderül számos felkérést olvasási / írási hozzáférést biztosít az azonos bank, és van - a konfliktus (megosztott memória bank ütközés). Az ilyen konfliktusok kezelése szerializálódik és szekvenciálisan hajtjuk végre, illetve helyett párhuzamosan. Ha egy bank, hogy foglalkozzon minden szála - használja a „broadcast” válasz (broadcast), és nincs konfliktus. Számos módja van, hogy hatékonyan kezelje a hozzáférési konfliktus, tetszett a leírás a fő módszer, hogy megszabaduljunk a konfliktusok hozzáférjen a memória bank - itt.

Hogyan lehet matematikai műveleteket még gyorsabban? Ne feledje, hogy:

  • kiszámítása kétszeres pontosságú - ez egy nagy terhelés esetén, fp64 >> fp32
  • Állandó típusú 3.13 a kódot, alapértelmezés szerint értelmezi fp64 hacsak kifejezetten pont 3.14f
  • Az optimalizálás a matematika nem felesleges foglalkozni Hyde - és ha van olyan zászlókat a fordító
  • gyártók közé tartozik a saját SDK használó funkciók bizonyos eszközöket, hogy elérjék a teljesítmény (gyakran - a rovására tolerancia)

Fémhulladék profilalkotás:

P. S. Egy még hosszas optimalizálási irányelveket, tudom ajánlani googling mindenféle legjobb gyakorlatok útmutató OpenCL és CUDA.