Efektivita méně jak 50% = víc času trávím v sekvenční části než v paralelní
- zvětšuji počet jader a velikost práce (vstupu)
- čím rychleji roste režie, tím víc potřebuji práce na kompenzaci
- → na každé jádro se zvětšuje požadované použití paměti
- pokud nelze režie algoritmicky zmenšit, lze vykrýt jiným počítáním nebo jinak
- Optimalizace sekvenčního algoritmu (vektorizace, cache blocking)
- Dekompozice problému
- nejvíce komunikující komponenty mít blízko sebe
- load balancing =
- stejně se čeká na posledního (slide 8 - bílá místa dělají α)
- ne všechny jádra použita = volná vlákna/procesory např pro OS → úlohy nejdou hezky namapovat na vlákna (nejsou soudělná)
- unstructed meshes = rozdělení práce na mřížce není rovnoměrný
- L1 → L2 → L3 → NUMA → Node → Cluster (už potřeba manuálně)
- rank =
- 1D = slab decomposition
- 2D = pencil decomposition
- slide 15 počet jader P = 9
- lepší posílat menší počet větších dat, než velký počet malých dat
- mezi uzlů openmp dekompozice, v rámci vláken
- “výpočet nestojí vůbec nic” - lepší spočítat něco 2x/3x, než posílat po síti
- slide 18 = při x = 25 → P1 udělá
a a b; P2 udělá a a c
- slide 21 : výpočet $\frac{t_c n^2}{P}$ komunikace $q(t_0 + t_1 n)$
- $t_0$ = ping (1 ms; +- 256 KB)
- $t_1 n$ = propustnost (100 Gb/s)
- $q$ = kolik komunikací máme
- spočítám hranice → pak zahájím komunikaci = vykrytí čekání pro komunikace a počítání
- slide 32:
- s překrytím $2nt_c$ = výpočet krajů
- s překrytím $\max[t_c(\frac{n}{P} - 2), q(t_0 + t_1 n)]$
- v openMP neblokující komunikace
- vylepšení = více bufferů, při počítání načítá do fronty a odesílá již zpracované data
- Použití v projektu
- potřeba vzdáleně zamknout frontu úloh, bez zásahu daného uzlu!
- Dobré se na podívat
- 13 “trpaslíků”
- slide 50