Jak Fermi realizuje inerně výpočty
Kapitoly článků
Zastavme se krátce u oněch kernelů. CUDA je architektura umožňující spouštět na GPU programy psané v C, C++, OpenCL, DirectCompute, dále třeba též ve Fortranu. Hlavní program volá kernely, které jsou vykonávány paralelně skrze paralelní thready (vlákna) v GPU. Paralelismus může organizovat buď sám programátor, nebo to nechá na systému, do jednotlivých bloků a větších celků obsahujících několik bloků. Každý thread v bloku spouští instanci kernelu a má příslušné ID v bloku, programovém čítači, registrech, privátní paměti, na vstupech a výstupech.
Vlastní blok několika threadů je tak ve skutečnosti sada současně vykonávaných vláken, která mohou vzájemně spolupracovat skrze synchronizační bariéru a sdílenou paměť. Blok threadů ve Fermi zvládá současně až 1 536 těchto souběžně běžících vláken. Kdyby synchronizační bariéra chyběla, vedlo by to často k „záhadným pádům“, protože jedno jádro (zde thread/blok) by mělo v paměti jiná data než druhé atd.
Vyšší celek zvaný grid obsahující několik bloků spouští vždy stejný kernel, čte vstupy z globální paměti, zapisuje výsledky do globální paměti a provádí synchronizaci mezi závislými kernelovými voláními. V paralelním modelu CUDA má každý thread vlastní privátní paměťový prostor používaný pro registry, volání funkcí a automatické proměnné v C. Každý blok má vlastní sdílený paměťový prostor používaný pro mezithreadovou komunikaci, sdílení dat a výsledků výpočtů. Grid pak sdílí výsledky v rámci globální paměti poté co proběhne globální synchronizace nad kernely.
Hardware Execution
CUDA mapuje požadovanou hiearchii threadů do hiearchie stream processorů v GPU. GPU spouští jeden nebo více kernel gridů, streaming multiprocessor jako dílčí prvek spouští jeden nebo více bloků threadů a CUDA jádra a další vykonávací jednotky v streaming multiprocessoru vykonávají příslušené thready. Streaming multiprocessor vykonává thready ve skupinách po 32, celek se nazývá warp. Zatímco programátoři mohou tyto warpy a jejich vykonávání ignorovat a programovat pouze v jednom výpočetním vlákně, byla by to škoda, neboť s touto paralelizací získávají potenciál pro výrazný nárůst zpracování požadovaných úloh.