- velké řazení = vykonáme sekvenční kód out of order
- velké cache
- GPU
- propustnost do paměti
- 204 GB/s
- šířka sběrnice 512b - pro max perf, potřeba číst po blocích
- 108 SM procesorů,
- CUDA jádro = simd jednotka
- říká, čím je náš kód limitován a jak jsme daleko od teoretického peaku
- aritmetická intenzita = kolik operací uděláme vůči načtení X bytů z paměti
- když se nedostaneme na limit bandwidth paměti = skoky v kódu, fixed point výpočet, …
- intel 4 : 1
- amd 8 : 1
- GPU 100 : 1
- SIMT = Single INstruction Multiple Threads
- WARP =
- pod 4 warpy nezaplníme pipeline
- CPU přeháže instrukce na vykrytí latencí vs GPU musí mít více warpů!!! - na státnice
- na daném SM procesoru běží pouze 1 funkce!
- komunikace mezi SM je možná pouze přes globální paměť pomocí atomických hodnot
- není přepínaní kontextu (až do Volty)
- cache nejsou coherentní!! (neprojeví se zápis do 5. prvku v cache, než skončí kernel)
- Cuda jádro - zelený čtvereček
- SM je celý kus s parallel data cache
- od Fermi je L2 cache (1 -> není problém s coherencí)
- lepší atomické operace, než z hlavní paměti (40 taktů vs 400)
- SFU = počítají složitější věci - dělička, násobička, reciprocal násobička, sqrt, …
- ld/st = 5 až 400 taktů
- WARP scheduler nezvládá najít aktivní warp - trvá 2 takty
- SM je rozdělený na 2 části po 16 jádrech
- běží 1. polovina 1. warpu a 1. pol. 2. warpu
- a + b + c + d = vykrytí 2. půlky warpů?
- DMA = překrytí výpočtu a komunikace
- 4 jednotky v 1 SM, každá má vlastní scheduler
- Double Precision značně snížen na 1/32 (zůstalo na všech herních kartách od této generace)
- nvidia_smi = výpis, co běží na kartě
- Texturová jednotka
- změna datových typů on the fly - mám uložený int8 a převedu na f32
- interpolace = uložená data v mřížce po 1mm, ale chci mřížku 0.01mm
- zbavující se krajních podmínek (mohu načítat data z druhé strany matice nebo z kraje)
- 8 tenzorových jader (násobička matic)
- nově současný počet int a fp operací (pouze serverové karty)
- nové primitiva sync (
__syncwarp;), ale za značného snížení výkonu
- lze rozdělit kartu pro více uživatelů
- nastavitelná L1-sdílená paměť za běhu
- grid ..
- spojení sdílených pamětí na clusteru
- zvětšení prostoru pro matice, ale trochu perf penalty (stále se ale vyplatí)
- dynamic programming = kernel umí spustit další kernel
- lze vyhradit L2 cache po dobu výpočtu