81
Párhuzamos programozás… … a gyakorlatban Tódor Balázs [email protected]

Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Párhuzamos

programozás…

… a gyakorlatban

Tódor Balázs

[email protected]

Page 2: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Tematika

Erről lesz szó

1 PC

C++

OpenMP, thread-ek

Közös memória

Használati technikák, trükkök

Erről nem

Sok PC (grid, cluster)

C#, Java, Python

MPI, process-ek

Elosztott memóriás modell

Mi a mutex, CS, stb.

Page 3: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Tartalom

Párhuzamosítás 1x1

Eszközök, technikák

FP, AP, kommunikáció

Tervezés

Az eddigiek használata

Top-down/Bottom-up

Egy lehetséges jövő

Stream programming

Page 4: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Miért?

Hány processzorod van?

A GPU számít?

1 CPU

2, 4, 8,… mag

Moore törvénye: 1,5 évente x2 mag

Kihasználtság

50%, 25%, 13%, …

Core i7 = 8 mag

Page 5: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Párhuzamosítás 1x1

Független feladatok azonosítása

Megjelenítés + számolás

Zene + kezelőfelület

Beolvasás + helyesírás

Külön szál minden feladatnak

Eszközök: Intel TBB, boost

Kölcsönös kizárás

printf

Kommunikáció

teljes függetlenség nem szokott lenni

Page 6: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Zab és bab

Független feladatok

Zab

Bab

Két külön szál

Eszközök

Boost::thread

OpenMP

Válogatás

BabmosásZabmosás

HámozásHegyezés

Csomagolás Csomagolás

Vége

Page 7: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Boost

„STL++”

Platformfüggetlen, ingyenes

Mit tud?

Array, circular buffer, bitset

Graph, FSM

File system, függvénypointerek

Thread, mutex, stb.

Any, variant, konvertálás

String algoritmusok

Page 8: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Boost::thread

Thread

Ctor

Join

ThreadFunc

Függvény

N paraméter

Válogatás

BabmosásZabmosás

HámozásHegyezés

Csomagolás Csomagolás

Vége

boost::thread

zabThread(ZabFunc);

zabThread.join();

babThread.join();

boost::thread

babThread(BabFunc);

Page 9: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

OpenMP

Fordítóba beépített

Intel, MSVC, gcc

Minimális kódmódosítás

„#pragma omp”

Multiplatform

Linux, Win32, stb.

Rugalmas

AP, FP, mutex, CS, single/master, stb.

Page 10: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

OpenMP

Parallel

OMP

engedélyezése

Sections

Párhuzamos blokk

Section

Szálak

létrehozása

Barrier

Join_all

Válogatás

BabmosásZabmosás

HámozásHegyezés

Csomagolás Csomagolás

Vége

omp parallel

omp sections

omp barrier

omp section omp section

Page 11: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

OpenMP vs boost

Page 12: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

OpenMP

Page 13: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

boost

Page 14: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Funkcionális párhuzamosítás

Független funkciók

Kölcsönös kizárás

Kommunikáció

... egyszerű, gyors, rugalmatlan

2x annyi szál?

Page 15: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Fizikai szimuláció

Ütköztetés 1.

NxN

R: objektumok

Feloldás

N

R: objektum

W: objektum

dSpaceCollide NearCallback Step

Ütköztetés 2.

NxN

R: objektumpár

W: contact-ok

Page 16: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Fizikai szimuláció

Feladatok dSpaceCollide: (1*N)*N

NearCallback: (1*N)*N

Step (1*N)

Független feladatok (collide+near+step)

(collide+near+step)

(collide+near+step)

...

Azonos funkció, sok szál

Rugalmas, egyszerű

De: csak független adatokon

Page 17: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Parallel for

Ciklusváltozósigned int

Összehasonlításegyszerű

Léptetéskonstanssal

KiugrásBreak, continue,

goto

fork

join

Page 18: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Közös erőforrások

Az írás-olvasás

között más is

beleírhat.

Kölcsönös kizárás

vagy

Csak olvasás

Közös változó

Írás

Olvasá

s

Page 19: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Explicit saját változó

Saját változó

Page 20: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Implicit saját változó

Saját változó

Page 21: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Közös és saját

Egy tömb összes elemét akarjuk

összeadni

Mi legyen a célváltozó?

Közös, mert meg akarjuk tartani

Saját, mert többen is írnának bele

Ha közös?

Kölcsönös kizárás (lassú)

Ha saját?

Eltűnik amit beleírunk!

Page 22: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Redukció

Közös változó

Redukció bekapcs.

Implicit: sajátok -> közös

Explicit: saját változó

Page 23: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Fizika és AP

Collide

N szál

NearCallback

Ír a contact-ok listájába -> lock

Step

N szál

… máshol keressük a függetlenséget!

Page 24: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Fizikai szimuláció:

függetlenség A különböző „szigetek” függetlenek

Számolhatjuk őket külön szálakon

Collide: N*N

PhysX, ODE

Legjobb eset

egyforma szigetek

Legrosszabb eset

N, 1, 1, 1

Ez gyakorlatilag egyszálú

Page 25: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Fizikai szimuláció:

függetlenség A különböző „szigetek” függetlenek

Számolhatjuk őket külön szálakon

Collide: N*N

PhysX, ODE

Legjobb eset

egyforma szigetek

Legrosszabb eset

N, 1, 1, 1

Ez gyakorlatilag egyszálú

Page 26: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

„Legrosszabb eset”

Funkcionális

lassú/gyors eljárások külön szálon

pl. beolvasás + helyesírásellenőrzés

Adat

kevés/sok adat: N, 1, 1, 1

Nem egyforma műveletek

Statikus kiosztás

Hány szál van?

Melyik szál mit csinál?

Page 27: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

A megoldás

Skálázhatóság

Feladat és végrehajtás külön

Dinamikus erőforráskiosztás

Szálak közötti feladatmozgatás

N, 1, 1, 1 -> N/2, 1+N/2, 1, 1

Lassú, gyors -> gyors+lassú/2, lassú/2

Page 28: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hibrid rendszerek

Taszk

Funkciórész + valamennyi adat

Kicsi: jobb kihasználtság

Nagy: kevesebb szinkronizáció

Ütemező

Taszk-szál összerendelés

Egyszálas (gyors legyen)

Erőforrás

Processzor (szálak)

HDD, user (képernyő, billentyűzet)

Page 29: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Fizikai szimuláció: gráfban

Page 30: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Ütemezés

Mikor futhat egy taszk?

Bemenet (producer-consumer)

Erőforrásigények

Olvasás/írás?

Gyors, egyszerű

Critical section-ben fut

Amdahl törvénye

Page 31: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Amdahl

A „varázsképlet”:

P: párh./soros arány

N: CPU-szám

Jól gondold meg hol lockolsz!

Page 32: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Ütemezés

Taszk

list<Object*>

m_apWriteLocks;

list<const Object*>

m_apReadLocks;

bool CanRun(const

guard&);

CanRun()

Erőforrások

Bemenetek

LOCK

task=list.front()

task.CanRun()

list.move(task, vége) list.pop_front()

UNLOCK

Task.Run()

true false

Page 33: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hibrid rendszerek

A végrehajtás és a feladat független

Skálázható

Legyen elég taszk

Logikus: irányított gráfból hozható létre

Page 34: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Párhuzamosítás 1x1

Független feladatok azonosítása

Szálak létrehozása

Kölcsönös kizárás

Olvasás, írás

Kommunikáció

Közös erőforrások

Kommunikáció

Producer-consumer

Page 35: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Kölcsönös kizárás

Olvasás vs írás

Olvasni: akárhányan

Írni: csak egy

Tanulság: olvasni jó

HL2 (Source): 95%

Eszközök

Mutex, Critical Section, stb.

Egyik sem biztonságos

De mindegyik lassú

Page 36: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Kommunikáció

Nincs kizárás

Atomi műveletek

Lockless

Hardware-es kölcsönös kizárás

Kölcsönös kizárás

Mutex, CS, stb.

Kettős pufferelés

Igazi garázsbaillő megoldás

Page 37: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Atomi megoldások

Hardverfüggő

1 db aligned read/write mindig atomi

iValue = 0;

++a

Beolvasás+növelés+visszaírás = 3

OpenMP: 'atomic' kulcsszó

Több atomi művelet?

Page 38: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Több atomi művelet

Tipikus hiba

iData = 5; bValidData = true;

Ellenségünk: instruction reordering

Az MMU blokkokban írja a memóriát

Főleg XBox, de PC-n is előfordul

Megoldás

Critical section

Platformfüggő: barrier utasítások

Page 39: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Lockless

„Lock”

Lock, tárolás, unlock

Lassú, ismert, biztonságos

„Lockless”

CompareAndSwap utasítás

Sok lock megoldás erre épül

Page 40: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Lockless

Láncolt lista

old=NULL

CAS(head, old, new)

false -> head=old, újra

Tulajdonságok

Gyors (hardveres)

Végrehajtási idő?

Prioritások?

ABA-probléma

A != A

Page 41: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

ABA-probléma

A probléma

Thread1: A->B->A

Thread2: CAS(&p, A, C)=true

Mikor jön elő?

Az ‘A’ érték nem a teljes állapotot tárolja(A!=A)

Pl. A = pointer

A megoldás

32b: DCAS: 64 bit (32b pointer + azonosító)

64b: aligned pointerek + bitbuherálás

Page 42: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

ABA-probléma: láncolt lista

A lista

struct { Obj* next; } *

Eredetileg: A, B

Műveletek

Thread1: read A (nincs pop)

Next = A.next (B)

Thread2: pop A, pop B, push A

A.next = NULL

Thread1: CAS(head, A, C)

true, de C.next = B !

Page 43: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Lockless: miért jó?

Nincs deadlock (és ez a helyes megoldás?!)

Nincs prioritásinverzió

Prioritásörökléssel is megoldható

Mondjuk itt prioritás sincs…

Nincs sorbanállás „… a kamion a leggyorsabb”

Interrupt handler

Malloc, interrupt, a handler-ben malloc?

Hatékonyabb, mint a mutex

Nagy méretű tömb esetén hogy lockolsz?

Page 44: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Szünet

Végig maradt Szünetben hazament

Page 45: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Párhuzamos problémák

Instruction reordering

A=5; B=1; -> B=1; A=5;

CS, barrier

Változók regiszterekben

„Tudatlan” fordítók

Volatile kulcsszó

False sharing

Nem hiba, csak lassú

Page 46: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

False sharing

Struct: A, B elemek

Thread1: A-t használja

Thread2: B-t használja

Helyesen működik

Független feladatok

Nem kell kölcsönös kizárás

Rém lassú… miért?

Page 47: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

False sharing

Thread1: A=1;

Cache line „piszkos”

Core2: cache line „érvénytelen”

Thread2: ++B

L1 Cache line „érvénytelen”

Újraolvasás: RAM->L2->L1->B

Megoldás:

Egy cache line = egy core

Page 48: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Kettős pufferelés

Memóriaigényes: két példány

Késik egy „swap”-et

Nincs lock

Kivéve: swap

Hatékony

Funkcionálisan párhuzamos rendszerek

Erősen összekötött rendszerek

Page 49: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Intel „Smoke”

Rendszerek: MI, fizika, grafika, hang, input

Az FP a legszebb, de…

Fizika -> MI, gfx, hang

gfx -> MI

Input->fizika

Change manager

Inkább késsen, mint lockoljon

„Kettős puffer továbbfejlesztve”

Page 50: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Intel „Smoke”

FP volt, hibrid lett

1 nagy feladat = sok (soros) taszk

Egyszerűbb, mint a teljes párhuzamosítás

A rendszerenkénti futási idő nem változik

De jobb kitöltés -> „párhuzamosíthatóbb”

Page 51: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Intel „Smoke”

Observer: Saját másolat a közös objektumokból Nincs lock, amikor olvasol

Cserébe késik az információ

Change Controller: per frame szinkronizáció 1 frame késés

Sok rendszer?

Page 52: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Intel „Smoke”

Fix időnként átviszi a változásokat

Clock: game clock (lehet renderfüggetlen)

Page 53: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Lock technikák

Hol lockolunk?

„adathoz v. kódhoz” közel

Lock helyett guard

Private változók = nincs lock!

Thread Local Storage

„Multithreaded Singleton”

A mutex:adat arány

1:1, N:1, 1:N

Page 54: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hol lockoljunk?

Működik?

Igen

Bővíthető?

Nehezen

(Enter/Leave)

Skálázható?

Nehezen (FP)

lock

unlock

Page 55: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hol lockoljunk?

Van egy osztály... több szál akarja használni.

nem thread safe

nem thread safe

Page 56: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hol lockoljunk?

Külső lock

Majd megoldja valaki…

+3 nap debuggolás / osztály (~270eFt)

Belső lock

Az osztály magának elintézi

Esetek 90%-a

Hívó által biztosított

A hívónak bizonyítania kell, hogy lockolt

Ez a +10%

Page 57: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Belső lock

Biztonságos

Teljesen thread safe

„Idiótabiztos”

Kívülről láthatatlan

Bárki használhatja az osztályt

Rugalmatlan

Annyi lock, ahány művelet.

guard

guard

Page 58: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hívó által

bizonyíték

Page 59: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hívó által

Nem az igazi...

Mit bizonyít egy lock_guard<mutex>?

Kinek a mutexe?

Továbbfejlesztési lehetőségek

Típusos lock_guard

Lock_guard<Type>

Fordítási idejű ellenőrzés

Pointeres lock_guard

Lock_guard<Type>.m_pOwner

Futási idejű ellenőrzés

Page 60: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

1:1

1 adat, 1 mutex

Lock: minél közelebb

Erre van a Get/Set

Tömbök?

Page 61: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

1:N

„Modulo N” lockolás:

pl. páros/páratlan

Mitől függ az N?

Szálak száma

Egy szál hány elemhez fér hozzá egyszerre

Page 62: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hívó általi lock

1 lock, N művelet

Ez is 1:N!

Gyorsabb… de „egyszálúbb”

explicit lock

implicit unlock

Page 63: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

N:1

Több mutex egy adathoz?

„A” szál lefogja az egyiket...

„B” szál a másikat...

Sok-sok debuggolás…

Intel Thread Checker

1000 USD

Page 64: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Tartalom

Párhuzamosítás 1x1

Eszközök, technikák

FP, AP, kommunikáció

Tervezés

Az eddigiek használata

Top-down/Bottom-up

Egy lehetséges jövő

Stream programming

Page 65: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Hogyan párhuzamosítsunk?

Hol kell párhuzamosítani?

Leglassabb részek keresése

90/10-es szabály

Független feladatok azonosítása

Sugárkövetés

Videófeldolgozó program

Page 66: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Megközelítés

Top-down

rendszerszinttől, lefelé

Bottom-up

közvetlenül ott, ahol szükséges

„Call stack” módszer

Breakpoint a 10%-ba

Melyik szinten érdemes próbálkozni?

Page 67: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Példa

Független részek

Pixelek

Leglassabb

Sugár-test metszés

Top-down

Pixelek

Bottom-up

Testek

Sugarak

Független részek

Pixelek

Képkockák

Leglassabb

Motion blur

Top-down

Képkockák

Bottom-up

Pixelek

Page 68: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Előre tervezés

Milyen új funkciók lehetnek?

Mit kéne tudnia egy év múlva?

Milyen új adatok lehetnek?

Több?

Más?

Merre fejlődik a hardver?

Több mag

SIMD, SIMT

Page 69: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Előre tervezés

Általában több adat kerül be mint funkció

Videófeldolgozás

A frame-ek száma gyorsabban nő, mint a

pixeleké

Raytracer

Szebb képhez több sugár/test ütközés kell

Kompromisszum?

FP mellett OpenMP-s AP

Mindegy mit csinálsz, az OpenMP még belefér

Page 70: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Párhuzamos optimalizáció

Ami gyors egy szálon, az nem biztos, hogypárhuzamosítható is.

Mátrixszorzás:

Triviális: O(n3)

Strassen: O(n2,81)

Page 71: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Mátrixszorzás

Triviális

4 szál

Azonos terhelés

Strassen

7 szál, aztán 4

Eltérő terhelés

Soros rész!

Page 72: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Tartalom

Párhuzamosítás 1x1

Eszközök, technikák

FP, AP, kommunikáció

Tervezés

Az eddigiek használata

Top-down/Bottom-up

Egy lehetséges jövő

Stream programming

Page 73: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

A jövő

Intel core i7

8 mag

GPU

8800 GTS = 112 mag (GTX 280: 240)

Nem csak grafikára

Hogyan programozzuk? HLSL, BrookGPU

CUDA / AMD Stream

OpenCL

C++ (Larrabee)

Page 74: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Stream programming

HLSL, Brook Pixel shader, adat=textúra, kimenet=rendertarget

1 helyre írás

CUDA/Stream „Scatter write”

Gyártófüggő

OpenCL AMD, Apple, nVidia, stb.

2009

Larrabee > 25 db P54C

C++

… „Linux a videókártyán”

Page 75: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Stream programming

(olvas, feldolgoz, ír)xN

Sok, független adat (N>1000)

Teljesen azonos feldolgozás (SIMT)

Divergencia?

Mi hiányzik?

Rekurzió

Pointerek

Össze-vissza írás/olvasás

Feltételek/ugrások

Page 76: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

CUDA

Szálkezelés

Buta, gyors (~1000)

SIMT

Adatkezelés

Tömb (textúra)

Konstans tömb

Háromszintű memória

Kommunikáció

Barrier (__syncthreads)

CPU-s emuláció

printf

Page 77: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

CUDA

ThreadID adat index

Közös memória Local: blokkon belül

Global: grid-en belül

Barrier Blokkon belül

Kernel float *pIn, *pOut (stream!)

Adat: pIn[threadID]

Page 78: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

CUDA példa

Thread ID

Kernelhívás

Page 79: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Összefoglalás

Funkcionális vagy adatpárhuzamosítás FP: ha független funkciók vannak

AP: ha sok független adat van

N~1000 -> stream

Hibrid rendszerek Adatfolyamgráfból -> Taszk + ütemező

OpenMP-vel FP/AP együtt

Kommunikáció, lock Atomi/Lockless/lock

adathoz közel

Page 81: Párhuzamos programozás… - mit.bme.humit.bme.hu/~szell/parhuzamos/Todor_Balazs_Parhuzamos_programozas_a... · C#, Java, Python MPI, process-ek Elosztott memóriás modell Mi a

Köszönöm a figyelmet!

A. Alexandrescu: „Multithreading and the C++ Type System”

T. Refenes: „How to Start a Multi-Threading RelationShip”

C. Breshears: „8 Simple Rules for Designing Threaded Applications”

T. Mattson, L. Meadows: “A „Hands-on‟ Introduction to OpenMP”

Intel: „Designing the Framework of a Parallel Game Engine”

T. Leonard (Valve): „Dragged Kicking and Screaming: Source Multicore”

Bruce Dawson (XNA): „Multicore Memory Coherence: The Hidden Perils of Sharing Data”

Cyril Zeller(nVidia): „CUDA Tutorial”

Jon Olick (id): „Current Generation Parallelism In Games”

Ian Buck (nVidia): „Programming CUDA”

Intel: „Smoke demo”

ODE: Open Dynamics Engine

Boost C++ libraries

Khronos Group: OpenMP, OpenCL

Geoff Langdale: „Lock-Free Programming”

Wikipedia: „Strassen algorithm”