Pokročilé architektury počítačů Přednáška 5 GPU - CUDA Martin Milata
Obsah Obecné výpočty a GPU Grafické procesory NVIDIA Tesla Výpočetní model Paměťový model GT200 Zpracování instrukcí Vydávání instrukcí a časování procesoru Větvení programu Přístup do pamětí NVIDIA Fermi
Výpočty a GPU Použití GPU k obecným výpočtům Vývoj v oblasti GPU donedávna veden především herním průmyslem Rychle rostoucí výkon s omezenými schopnostmi grafického procesoru Podpora omezené aritmetiky s plovoucí řádovou čárkou rozšiřuje možnosti uplatnění GPU Skutečný průlom až s příchodem unifikované výpočetní architektury Co počítat? Standardní využití GPU pro práci s obrazovými daty Vědecké výpočty s omezenými možnostmi přesnosti v oblasti plovoucí řádové čárky Vždy je potřeba extrémní paralelizovatelnost problému s jednoduchými datovými strukturami (obvykle vícerozměrná pole)
Grafické procesory (GPU) Architekturou určeny pro zpracování tisíců vláken Přímočarý snadno paralelizovatelný kód umožňuje využít jejich potenciál Masivní vláknový paralelismus přináší mnoho omezení Žádné nebo výjimečně minimální možnosti spekulace Absence predikce větvení programu Odlišně realizované cache pamětí Mnohonásobný paralelní přístup (šířka pásma) Latence není primárním účelem Obtížné řízení a synchronizace vláken programu Jak zajistit běh více než 1000 vláken Jak zacházet s větvením programu a to mnohdy v rozdílných směrech Jak realizovat přístup do paměti při práci s rozdílnými bloky
NVIDIA Tesla Navržená pro grafické a obecné výpočty Podpora obecných výpočtů v podobě programovacího modelu CUDA Compute Unified Device Architecture (CUDA) Nástavba programovacího jazyka pro práci se stovkami vláken v prostření GPU (programovací model) Cílem je vytvořit zdání téměř bezlimitních možností paralelismu na úrovni vláken Dynamické využívání HW zdrojů GPU využíván jako koprocesor CPU pro jednoduché masivně paralelní výpočty Vychází z architektury GPU používané pro standardní grafické výpočty Zachovává si některé specifika pro GPU (Cache textur, interpolace pixelů, Z- buffer, alpha-blending)
Výpočetní model CUDA Organizace kódu Sériově organizovaný kód určený pro CPU Paralelní kód prováděný na GPU Označuje se jako kernel GPU kernel provádí se na tzv. grid struktuře Grid se skládá z bloků (1D nebo 2D struktura) Blok je skupina až 512 vláken pro revize 1.x resp. 1024 vláken pro revize 2.x organizovaných do 1, 2 nebo 3 rozměrného pole Hierarchizované uspořádání paralelismů
Výpočetní model CUDA Skupina vláken - blok (Thread block) Startuje provádění na stejné adrese (začínají na stejné instrukci) Je prováděna paralelně prostředky daného bloku Sdílí oblast ve sdílené paměti (sdílení dat a synchronizační mechanizmy) V omezené míře mohou jednotlivá vlákna při vlastním výpočtu volit rozdílné cesty kódem (neomezená divergence by měla významný výkonnostní dopad) V rámci grid struktury kolekci bloků je rovněž možné plně paralelní provádění Bloky a vlákna v nich mohou být prováděny paralelně Mezi bloku jedné grid struktury nesmí existovat závislosti (explicitní pořadí provádění bloků nelze stanovit) Serializační hranici tvoří grid (resp. kernel)
Paměťový model CUDA Definuje různé adresní prostory pro přístup v rámci GPU a komunikaci s CPU Globální paměť, paměť konstant a textur jsou přístupné GPU a CPU Registry, lokální a sdílená paměť přístupné GPU Latence paměti Rychlá paměť s nízkou latencí registry a sdílená paměť Frame buffer (DRAM paměť) lokální paměť, paměť konstant a textur
Paměťový model CUDA Vláknům vyhrazené paměti Registry pro vlákno vyhrazená skupina registrů Lokální paměť prostor vyhrazen vláknu, fyzicky uložen v DRAM (off-chip), pomalý přístup bez použití cache Paměť sdílená vlákny bloku Sdílená paměť přístupná výhradně v rámci bloku, umístěná on-chip, latence téměř rovna registrům Paměť sdílená mezi bloky v rámci gridu Globální paměť off-chip DRAM paměť, R/W přístup, pomalá paměť bez použití cache, přístupná z GPU i CPU Paměť konstant a Paměť textur obě paměti off-chip, pouze pro čtení, přístup akcelerován pomocí cache Revize jádra Fermi přináší nově pravou hierarchii cache pamětí. Umožňuje akceleraci přístupu k off-chip pamětem
Evoluce a CUDA Evoluce a revize Odráží vývoj hardware Revize rozšiřují schopnosti CUDA např. o podporu atomických operací se slovy ve sdílené či globální paměti Revize 1.3 přidává podporu pro tzv. double precision operace/hodnoty v plovoucí řádové čárce (NVIDIA Fermi architektura) Monolitické a více-čipové systémy Monolitická architektura pro obecné výpočty užitečnější; mezi více čipy není s podporou HW zajištěna synchronizace; v rámci čipu synchronizace částečně zajištěna je Více-čipové systémy levnější, dostupnější a více zastoupené na trhu; synchronizace dat při obecných výpočtech v rukou programátora, dopad na výkon
Vztah CUDA - TESLA CUDA logický popis x TESLA hardwarová architektura Streaming Multiprocessor (SM) přibližně jádro v pojetí mikroprocesorů obsahuje jednotky pro vydání, dekódování a provádění instrukcí disponuje privátními registry, sdílenou pamětí a tzv. thread procesory Thread block logického popisu je mapován na Streaming Multiprocessor hardwarové implementace Každý SM provádí skupinu warpů s oddělenými PC (program counter). Provádí se vždy warp s připravenými instrukcemi. Obdoba SMT, hyperthreading
Představení GT200 Více-jádrový čip s dvouvrstvou hierarchií 10x Thread Processing Cluster (TPC) na vyšší úrovni 3x Streaming Multiprocessor (SM) nebo Thread Processor Array (TPA) na nižší úrovni v rámci každého TPC Hierarchie definovaná realizací přístupu do paměti SM v rámci TPC sdílí přístup k hierarchií cache pamětí v rámci přístupu do paměti textur
Bližší pohled na výpočetní architekturu GT200 Globální plánovač (Global Block Scheduler) Pracuje nad CUDA kernelem předaným na GPU z CPU Zpracovává informace z kernelu a distribuuje Thread Block na SM s dostupnými zdroji přes celý čip Streaming Multiprocessor Dokáže zpracovávat až 8 bloků (na SM zaslány z GBS) celkem 1024 možných vláken je postupně vykonáváno předpoklad jsou volné zdroje Překládá bloky do tzv. warp, které dále provádí na SP Warp obsahuje 32 vláken Instrukce seskupovány primárně podle latence (doba provádění nebo latence spojená s přístupem do paměti)
Bližší pohled na výpočetní architekturu GT200 Streaming Multiprocessor (SM) SM Controller Instrukční cache Warp buffer Tabulka skóre 8x Streaming Processor (SP) Funkční jednotka 2x speciální funkční jednotka souvisí s grafickými výpočty zle je použít jako násobičky 1x 64bit funkční jednotka 16k 32bit registrů 16kB sdílené paměti
Zpracování instrukcí na SM SM zajišťuje zpracování (převod na warp), řazení, plánování a provádění instrukcí v rámci warp (instrukce 32 vláken) Vytvořená warp instrukce je uložena v bufferu Plánování warp instrukcí je závislé na tabulce skóre warp instrukci přidán příznak ready-to-execute příznak se nastaví v okamžiky vyřešení všech závislostí Plánovač provádí plánování na základně priority warp instrukce v bufferu a příznaku ready-to-execute Výpočet priority odvozen např. od typu warp instrukce
Vydávání instrukcí a časování procesorů V rámci NVIDIA mikroarchitektury existují tři domény s rozdílným časováním Core clock pomalý cyklus (např. 600MHz) FUs clock rychlý cyklus (např. 1200MHz) Memory clock (např. 1100MHz) Vydávací logika může vydávat 1 warp instrukci každý pomalý cyklus Vydávání je možné pouze v případě podporované kombinace vydávaných warp instrukcí FU obvykle potřebují k dokončení výpočtu 4 rychlé cykly Přibližně každé dva rychlé cykly je vydaná jedna warp instrukce pro nezávislé jednotky v rámci SM Instrukce jsou prováděny nezřetězeně v paralelním překryvu na více FU
Větvení programu Zpracování warp Všechny vlákna warp začínají provádění na stejné adrese Při zpracování instrukcí větvení je další provádění pozastaveno dokud nejsou vypočteny všechny cílové adresy Pokud všechna vlákna pokračují provádění stejnou cestou, zpracování instrukcí warp se nemění Pokud vlákna v provádění divergují (vypočtené adresy skoku se liší) Warp serializuje provádění jednotlivých cest pomocí postupného omezení výpočtu instrukcí Vlákna mohou rekonvergovat a pokračovat ve společném provádění Divergence cest ve warp má nepříznivý dopad na výkon Potřeba načítání instrukcí mimo bloky cache paměti Rozdílné cesty mezi warp nepředstavují problém
Přístup do paměti Load a Store instrukce jsou generovány v SM Jejich vydání a provádění je rozprostřeno v HW doménách s rozdílným časováním vyžaduje účast SM kontroléru Výpočet adresy z registru a offsetu Překlad adresy virtuální - fyzická L/S instrukce vykonávané v rámci warp jsou zaslány přes intra-chip crossbar na řadič paměti (resp. ROP) Řadič paměti je vykonává ve skupinách poloviční velikosti warp (16 přístupů) Zarovnání a slučování přístupů Pokud vlákna ve zpracovávaném půl-warp přistupují sekvenčně k souvislé a zarovnané oblasti paměti přístup je sloučen pod jednu transakci s pamětí
Fermi Vychází z předešlé architektury s tím, že vylepšuje výkonnost karty při double precision operacích přidává podporu Error Correction Codes (ECC) nahrazuje grafický systém cache pamětí pravým (Systém cache používaný v CPU) cache paměti jsou používány i při přístupu do globální paměti zvětšuje velikost sdílené paměti (sdílení paměťového prostoru s L1 cache) vylepšuje techniku a rychlost přepínání kontextů modifikuje architekturu SM (32 funkčních jednotek per SM) od revize architektury 2.1 je počet funkčních jednotek navýšen na 48
Třetí generace SM 32x CUDA Core provádí celočíselné operace i operace v plovoucí řádové čárce ALU a FPU single i double precision 64KB Sdílené paměti Konfiguračně rozdělena mezi L1 cache a sdílenou paměť (16KB x 48KB pro sdílenou paměť nebo cache) 16x L/S jednotka Jednotná cesta přístupu do paměti (dříve separována paměť textur čtení a výstupní pixel zápis) 4x SFU Speciální operace sin, cos, exp, rcp Obrázek převzat z: Whitepaper NVIDIA's Next Generation CUDA Compute Architecture: Fermi
Třetí generace SM plánování instrukcí CUDA Core seskupeny do dvou skupin v SM Tvoří dva bloky o 16 jádrech; zpracovávají warp instrukci ve dvou taktech L/S jednotky Seskupeny do jednoho bloku; výpočet dokončen ve dvou taktech SFU blok Blok tvoří čtyři jednotky pro speciální operace (sin, con,...); výpočet trvá 8 taktů Pro plánování warp instrukcí má SM k dispozici dvě plánovací jednotky (Dual Warp Scheduler) celkem čtyři výkonné bloky, kterým může být instrukce předána 2x 16CUDA Core blok, 1x SFU blok, 1x L/S blok neblokující přístup k vydávání instrukcí (instrukce s velkou latencí nebrání vydávání další instrukce jinému bloku)
Třetí generace SM plánování instrukcí Obrázek převzat z: nvidia.com
Sumární srovnání Obrázek převzat z: Whitepaper NVIDIA's Next Generation CUDA Compute Architecture: Fermi
Závěr Obecné výpočty na GPU Problémy při masivně paralelním přístupu NVIDIA CUDA Výpočetní a paměťový model Mikroarchitektura GT200 Zpracování instrukcí NVIDIA Fermi
Literatura D. Kanter: NVIDIA's GT200: Inside a Papallel Processor Whitepaper NVIDIA's Next Generation CUDA Compute Architecture: Fermi Paul H. J. Kelly, Advanced Computer Architecture Lecture notes 332 P. N. Glaskowsky: NVIDIA s Fermi: The First Complete GPU Computing Architecture Internetové zdroje: http://www.nvidia.com/