- texture a load/store jednotka nemají koherentní cache - problém při přístupu na stejnou adresu ves stejnou dobu
- 163KB - poslední KB je pro přenos parametrů, např pointery v argumentech funkce
- přístup do sdílené paměti je rychlé, pokud každé 1 vlákno warpu přistupuje do jiné banky!
- každá banka může vystavit 32 b za takt
- Adresa banky = adresa % (32 bank * 4B)
- čtení z 1 banky stále lepší než z globální paměti!
- jednotlivé sloupce se mapují do stejných bank
- řešení - zarovnání pole/řádků na liché číslo! -
- nově od Hopperu / Cuda 12
- možnost číst, zapisovat a provádět atomické operace do sdílené paměti jiného bloku v rámci stejného block clusteru
- block cluster - další úroveň indexování mezi bloky a gridem
- sdílená paměť pak až 2 MB
- aritmetická intenzita = ${2 \text{ operace} \over 2 \text{ loady} \cdot 4 B} = \frac{1}{4}$
- problém
Mk maticí - záleží na velikosti cache, každá vlákno načítá po k, může dojít, že načtení dalšího prvku bude vyhazovat cache
- v případě, že matici nezarovnáme na násobek - budou penalty na přístup na začátek řádku.
- SM A100 vzládne 64 warpů v maximálně 32 blocích
- Herní pouze 48 warpů 16 bloků.
- 2 memory accessy (8B) na 1 fma operaci
- při 1024 vláken máme pouze 1 blok na __, tak máme ld/st a pak fma - warp nemůže se přepnout
- → nejprve Global mem načte → do Registru (každé vlákno 1)
- → Registr do SM; synchronizace
- →
- na každé 2 FP op máme 3 INT op: poměr 2FP:3INT
- → rozbalím smyčky
#pragma unroll