8. cvičenie – pokročilá CUDA ⚛️

Úvod

Zdrojové súbory na cvičenie si stiahnite spoločne ako archív.

1. Atomické inštrukcie

Nižšie je program na výpočet histogramu. Zatiaľ obsahuje naivnú implementáciu, ktorá počíta histogram paralelne, ale bez žiadnych pamäťových ochrán a zámkov. Týmto je výsledný histogram nesprávny. Opravte výpočet pomocou atomických inštrukcií.

Po oprave je výpočet správny, ale použitie atomických inštrukcií spôsobilo veľké súperenie o výstupné pole s histogramom hist. Dokončite implementáciu tretieho kernelu, ktorý počíta histogram nezávisle v zdieľanej pamäti na každom bloku a po výpočte prenesie výsledky do globálneho histogramu.

Program implementujte podľa pokynov v TODO komentároch.

2. Redukcia

Dokončite implementáciu jednoduchej redukcie. Uvedomte si, že záverečný súčet v kerneli znižuje efektivitu výpočtu, nakoľko kvôli konzistencii dát musí byť serializovaný. Ako by vyzerala efektívnejšia implementácia?

Vytvorte redukčný kernel pomocou dekorátora, ktorý poskytuje Numba. Porovnajte dobu výpočtu oboch verzií redukcie na GPU a výpočtu na CPU pomocou Numpy.

3. Redukcia vo warpe pomocou shuffle inštrukcie

Nižšie je jednoduchá implementácia násobenia matice vektorom. Výpočet paralelizujeme po riadkoch, pričom každý blok vlákien má na starosti vynásobenie jedného riadka matice. Počet vlákien na blok bol zvolený schválne – je rovný počtu vlákien vo warpe (32). Využite špeciálnu inštrukciu shfl_down_sync, ktorá umožňuje vykonať operáciu súčtu párovo na niekoľkých vláknach warpu paralelne. Implementujte pomocou nej redukciu čiastočných súčtov val každého vlákna vo warpe. Po redukcii by mal byť konečný súčet uložený vo vlákne 0 každého bloku.