praca_magisterska/pytania/questions/pytanie_25.md

5.6 KiB
Raw Blame History

PYTANIE 25: Prawo Amdahla — przyspieszenie równoległe

Oszacować przyspieszenie. Co osłabia ograniczenie?


Tło pojęciowe — słowniczek

Obliczenia równoległe (parallel computing) — wykonanie wielu operacji jednocześnie na wielu procesorach/rdzeniach. Cel: przyspieszenie obliczeń. Nie każdy program da się w pełni zrównoleglić — zawsze jest część sekwencyjna (inicjalizacja, agregacja wyników, I/O).

Sekwencyjnie (1 rdzeń): ████████████  12 sec
Równolegle (4 rdzenie):  ███         3 sec (część równoległa)
                         ██           2 sec (część sekwencyjna)
                         Razem:       5 sec (nie 3!)

Przyspieszenie (speedup) — stosunek czasu sekwencyjnego do równoległego: S(n) = T_seq / T_par(n). Idealne przyspieszenie na n procesorach = n (liniowe). W praktyce zawsze mniej z powodu części sekwencyjnej i overheadów.


Prawo Amdahla (Amdahl's Law) — określa MAKSYMALNE przyspieszenie programu przy zrównolegleniu na n procesorach. Kluczowe parametry:

  • p — część programu, którą DA SIĘ zrównoleglić (0 ≤ p ≤ 1)
  • (1-p) — część sekwencyjna (nie do zrównoleglenia)
  • n — liczba procesorów

Wzór:

S(n) = 1 / ((1-p) + p/n)

Dlaczego tak? Czas sekwencyjny = 1. Część sekwencyjna zajmuje (1-p), nie przyspiesza. Część równoległa trwa p/n. Suma = nowy czas.

Maksymalne przyspieszenie (n→∞):

S_max = 1/(1-p)

p=90% (10% sekwencyjne) → S_max = 1/0.10 = 10x
p=95% (5% sekwencyjne)  → S_max = 1/0.05 = 20x
p=99% (1% sekwencyjne)  → S_max = 1/0.01 = 100x

Kluczowy wniosek: nawet z nieskończoną liczbą procesorów, 10% sekwencyjnego kodu ogranicza przyspieszenie do 10x! Sekwencyjna część dominuje.

Przykład liczbowy: p=90%, n=4:

S(4) = 1 / (0.10 + 0.90/4) = 1 / (0.10 + 0.225) = 1/0.325 ≈ 3.08x
Z 4 procesorów uzyskamy ~3.08x, NIE 4x!

Prawo Gustafsona (Gustafson's Law) — alternatywna perspektywa osłabiająca ograniczenie Amdahla. Zamiast „przyspiesz stały problem" → „rozwiąż WIĘKSZY problem w tym samym czasie".

S = 1  p + p·n    (scaled speedup)

Dla p=90%, n=100: Gustafson → S = 1 - 0.9 + 0.9×100 = 90.1x (vs Amdahl: ~10x!)

Strong scaling (Amdahl) — stały rozmiar problemu, więcej procesorów. Weak scaling (Gustafson) — rozmiar problemu rośnie proporcjonalnie do procesorów. W praktyce: więcej rdzeni → większa symulacja, więcej danych, wyższa rozdzielczość.


Efektywność (efficiency): E(n) = S(n)/n — ile z dodanych procesorów jest naprawdę wykorzystane. E(4)=3.08/4=0.77 → 77% efektywności. Spada z n.

Overhead synchronizacji — dodatkowy koszt koordynacji między wątkami/procesami: mutex contention, bariery, komunikacja. Im więcej procesów, tym większy overhead.

False sharing — dwa rdzenie modyfikują różne zmienne, ale leżące w tej samej linii cache. Powoduje ciągłe invalidation cache — dramatyczny spadek wydajności.

Core 0 pisze: x (cache line 42)
Core 1 pisze: y (cache line 42!)  ← ta sama linia!
→ Pingpong cache line między rdzeniami

NUMA (Non-Uniform Memory Access) — architektura: pamięć „bliżej" jednego procesora jest szybsza dla niego. Odwołanie do pamięci zdalnej = wolniejsze. Programy muszą uwzględniać lokalność.

Load imbalance (nierównomierne obciążenie) — procesory kończą w różnych czasach. Najwolniejszy limituje cały czas. Rozwiązanie: dynamic scheduling, work stealing.

Lock-free (bez blokad) — struktury danych operujące na CAS (Compare-And-Swap) zamiast mutexów. Eliminują blokowanie, ale trudniejsze w implementacji.

Pipelining — podział pracy na etapy: każdy etap na osobnym rdzeniu. Jak taśma montażowa: etap 1 przetwarza dane N, etap 2 — dane N-1, etap 3 — dane N-2, jednocześnie.


Prawo Amdahla

S(n) = 1 / ((1-p) + p/n)
  • p = część równoległa, n = procesory
  • Maks. przyspieszenie (n→∞): S_max = 1/(1-p)
  • 10% sekwencyjnego kodu → max 10x nawet z ∞ procesorami!

Tabela przykładów

p n=4 n=16 n=∞
90% 3.08 5.93 10
95% 3.48 9.52 20
99% 3.88 13.91 100

Co osłabia ograniczenie?

Prawo Gustafsona: S = 1 p + p·n. Skaluj problem (więcej danych), nie procesory. Dla p=90%, n=100 → S=90.1x (vs Amdahl: ~10x).

Techniki: algorytmy równoległe, lock-free structures, pipelining, speculative execution, ukrywanie latencji (async I/O, prefetching).

Czynniki zmniejszające RZECZYWISTE przyspieszenie

  • Overhead synchronizacji (mutex contention)
  • Komunikacja (latencja, bandwidth)
  • Load imbalance
  • Cache effects (false sharing, NUMA)
  • Thread management

Efektywność: E(n) = S(n)/n — spada z n

Etymologia

Gene Amdahl (IBM, 1967, „Validity of the single processor approach..."); współtwórca IBM System/360. John Gustafson (Sandia Labs, 1988, „Reevaluating Amdahl's Law"); weak scaling vs strong scaling. Speedup (przyspieszenie) — stosunek czasu sekwencyjnego do równoległego. Efektywność — ile z dodanych procesorów jest naprawdę wykorzystane. Lock-free — struktury danych bez blokad (CAS — Compare-And-Swap).

Jak zapamiętać

  • S = 1/((1-p) + p/n) — zapamiętaj wzór!
  • „10% seq = max 10x" — sekwencyjna część limituje WSZYSTKO
  • Gustafson = „zwiększ problem, nie procesory" — weak scaling
  • „FLOP" = False sharing, Load imbalance, Overhead, Poor locality