Paralelní programování

Podobné dokumenty
Paralelní programování

Paralelní programování

Paralelní programování

OPS Paralelní systémy, seznam pojmů, klasifikace

Paralelní programování

Přehled paralelních architektur. Dělení paralelních architektur Flynnova taxonomie Komunikační modely paralelních architektur

Procesy a vlákna - synchronizace

Paralelní programování

Paralelní a distribuované výpočty (B4B36PDV)

Paralelní programování

Řada programovacích jazyků nabízí prostředky pro řešení meziprocesové komunikace jako je synchronizace a řízení přístupu do kritické sekce.

Paralelní programování

Obsah. Kapitola 1 Hardware, procesory a vlákna Prohlídka útrob počítače...20 Motivace pro vícejádrové procesory...21

Paralelní systémy. SIMD jeden tok instrukcí + více toků dat jedním programem je zpracováváno více různých souborů dat

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

Paralelní programování

Operační systémy. Přednáška 1: Úvod

Pavel Procházka. 3. prosince 2014

Základní úrovně: Moorův zákon: multi-core mikroprocesory (CPU) hypertherading pipeline many-core Paralelní systém Instrukce iterace procedura Proces

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Principy operačních systémů. Lekce 6: Synchronizace procesů

Vzájemné vyloučení procesů

Teoretická informatika Tomáš Foltýnek Paralelní programování

Operační systémy. Přednáška 4: Komunikace mezi procesy

Obecné výpočty na GPU v jazyce CUDA. Jiří Filipovič

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

Synchronizace Mgr. Josef Horálek

Paralelní programování

Principy operačních systémů. Lekce 5: Multiprogramming a multitasking, vlákna

Charakteristika dalších verzí procesorů v PC

Spuštění instalace. nastavení boot z cd v BIOSu vložení CD s instal. médiem spuštění PC. nastavení parametrů instalace (F2 čěština)

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Přednáška 1. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Princip funkce počítače

Úvod SISD. Sekvenční výpočty SIMD MIMD

VISUAL BASIC. Práce se soubory

Představení a vývoj architektur vektorových procesorů

Základy informatiky. 2. Přednáška HW. Lenka Carr Motyčková. February 22, 2011 Základy informatiky 2

Procesy a vlákna (Processes and Threads)

Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;

Procesy a vlákna IPC Komunikace mezi procesy (IPC = Inter-Process Communication)

Pro úlohy digitálního zpracování obrazu je příznačný velký objem dat. Doposud ani rychlé počítače s konvenční sériovou architekturou nejsou schopny

Konzistentnost. Přednášky z distribuovaných systémů

CHARAKTERISTIKA MODERNÍCH PENTIÍ. Flynnova klasifikace paralelních systémů

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Služba ve Windows. Služba (service) je program

Pokročilé architektury počítačů

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

IB109 Návrh a implementace paralelních systémů. Organizace kurzu a úvod. Jiří Barnat

Inovace výuky prostřednictvím ICT v SPŠ Zlín, CZ.1.07/1.5.00/ Vzdělávání v informačních a komunikačních technologií

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

Základní komunikační operace

Programovací jazyk Pascal

Architektury paralelních počítačů II.

Management procesu I Mgr. Josef Horálek

Algoritmy a datové struktury

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Přednášky o výpočetní technice. Hardware teoreticky. Adam Dominec 2010

Knihovna EpsnetLib TXV první vydání září 2012 změny vyhrazeny

Přidělování paměti II Mgr. Josef Horálek

Vlákna a přístup ke sdílené paměti. B4B36PDV Paralelní a distribuované výpočty

Paralení programování pro vícejádrové stroje s použitím OpenMP. B4B36PDV Paralelní a distribuované výpočty

Kapitola 13: Transakce. Koncept transakce. ACID vlastnosti

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Martin Hejtmánek hejtmmar

Sada 1 - Základy programování

Operační systémy. Přednáška 5: Komunikace mezi procesy

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Přednáška 3. Rekurze 1

Binární soubory (datové, typované)

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

Basic256 - úvod do programování Příklady. ing. petr polách

Ústav technické matematiky FS ( Ústav technické matematiky FS ) / 35

Principy počítačů a operačních systémů

Algoritmy. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 15. dubna / 39

Pohled do nitra mikroprocesoru Josef Horálek

Přidělování zdrojů (prostředků)

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Operační systémy 2: Zápočtové úkoly

Hardware - komponenty počítačů Von Neumannova koncepce počítače. Von Neumannova koncepce počítače

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Paměti a jejich organizace

C2115 Praktický úvod do superpočítání

Matematika v programovacích

Implementace LL(1) překladů

Práce se soubory. Základy programování 2 Tomáš Kühr

Přerušovací systém s prioritním řetězem

Cvičení MI-PRC I. Šimeček

Sada 1 - Základy programování

Mezipaměti počítače. L2 cache. L3 cache

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

ALGORITMIZACE A PROGRAMOVÁNÍ

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Synchronizace paralelních procesů

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ DOKTORSKÁ DISERTAČNÍ PRÁCE

Transkript:

Paralelní programování přednáška 3 Michal Krupka 1. března 2011 Michal Krupka (KI UP) Paralelní programování 1. března 2011 1 / 14

Ještě k atomickým proměnným Další neatomické proměnné Mohou to být proměnné, jejichž velikost je menší než slovo: Příkaz A[i] = 1; nemusí být atomický, pokud je A bitové pole. (Proč?) Vždy je potřeba konzultovat dokumentaci Michal Krupka (KI UP) Paralelní programování 1. března 2011 2 / 14

Ještě k atomickým proměnným Další neatomické proměnné Mohou to být proměnné, jejichž velikost je menší než slovo: Příkaz A[i] = 1; nemusí být atomický, pokud je A bitové pole. (Proč?) Vždy je potřeba konzultovat dokumentaci Michal Krupka (KI UP) Paralelní programování 1. března 2011 2 / 14

Sdílené proměnné, aktivní čekání Synchronizace procesů obvykle nutná kvůli dosažení korektnosti programu nejjednodušší způsob: pomocí sdílených proměnných a aktivního čekání Sdílené proměnné přístupné více procesům ke čtení i zápisu nejjednodušší příklad: globální proměnné, dále místo v paměti o známé adrese (např. předané procesu parametrem), lexikální uzávěr musí být atomické a volatilní Aktivní čekání periodická kontrola hodnoty sdílené proměnné, kterou nastavuje jiný proces operace await, např: await n = 0 loop while n 0 v praxi se nepoužívá (pasivní čekání) Michal Krupka (KI UP) Paralelní programování 1. března 2011 3 / 14

Sdílené proměnné, aktivní čekání Synchronizace procesů obvykle nutná kvůli dosažení korektnosti programu nejjednodušší způsob: pomocí sdílených proměnných a aktivního čekání Sdílené proměnné přístupné více procesům ke čtení i zápisu nejjednodušší příklad: globální proměnné, dále místo v paměti o známé adrese (např. předané procesu parametrem), lexikální uzávěr musí být atomické a volatilní Aktivní čekání periodická kontrola hodnoty sdílené proměnné, kterou nastavuje jiný proces operace await, např: await n = 0 loop while n 0 v praxi se nepoužívá (pasivní čekání) Michal Krupka (KI UP) Paralelní programování 1. března 2011 3 / 14

Sdílené proměnné, aktivní čekání Synchronizace procesů obvykle nutná kvůli dosažení korektnosti programu nejjednodušší způsob: pomocí sdílených proměnných a aktivního čekání Sdílené proměnné přístupné více procesům ke čtení i zápisu nejjednodušší příklad: globální proměnné, dále místo v paměti o známé adrese (např. předané procesu parametrem), lexikální uzávěr musí být atomické a volatilní Aktivní čekání periodická kontrola hodnoty sdílené proměnné, kterou nastavuje jiný proces operace await, např: await n = 0 loop while n 0 v praxi se nepoužívá (pasivní čekání) Michal Krupka (KI UP) Paralelní programování 1. března 2011 3 / 14

Dodavatel-odběratel Dodavatel-odběratel (Producer-Consumer) jeden ze základních synchronizačních problémů dva procesy: dodavatel (Producer) periodicky získává data a ukládá je do sdíleného úložiště (bufferu), odběratel (Consumer) vyzvedává data z bufferu a zpracovává je dodavatel nesmí zapisovat do plného bufferu (příp. musí počkat) odběratel nesmí číst z prázdného bufferu (příp. musí počkat) Jednoduchý případ: Pouze dva procesy, buffer pojme jednu položku. Zobecnění: Buffer pojme více položek, více dodavatelů a odběratelů. Pozn.: větší buffer má smysl kvůli vyrovnávání, ne pokud je rychlost dodavatele větší než odběratele. Příklady dodavatel: komunikační linka, odběratel: webový prohlížeč dodavatel: klávesnice, odběratel: operační systém dodavatel: výpočetní proces, odběratel: GUI Michal Krupka (KI UP) Paralelní programování 1. března 2011 4 / 14

Dodavatel-odběratel Dodavatel-odběratel (Producer-Consumer) jeden ze základních synchronizačních problémů dva procesy: dodavatel (Producer) periodicky získává data a ukládá je do sdíleného úložiště (bufferu), odběratel (Consumer) vyzvedává data z bufferu a zpracovává je dodavatel nesmí zapisovat do plného bufferu (příp. musí počkat) odběratel nesmí číst z prázdného bufferu (příp. musí počkat) Jednoduchý případ: Pouze dva procesy, buffer pojme jednu položku. Zobecnění: Buffer pojme více položek, více dodavatelů a odběratelů. Pozn.: větší buffer má smysl kvůli vyrovnávání, ne pokud je rychlost dodavatele větší než odběratele. Příklady dodavatel: komunikační linka, odběratel: webový prohlížeč dodavatel: klávesnice, odběratel: operační systém dodavatel: výpočetní proces, odběratel: GUI Michal Krupka (KI UP) Paralelní programování 1. března 2011 4 / 14

Dodavatel-odběratel Dodavatel-odběratel (Producer-Consumer) jeden ze základních synchronizačních problémů dva procesy: dodavatel (Producer) periodicky získává data a ukládá je do sdíleného úložiště (bufferu), odběratel (Consumer) vyzvedává data z bufferu a zpracovává je dodavatel nesmí zapisovat do plného bufferu (příp. musí počkat) odběratel nesmí číst z prázdného bufferu (příp. musí počkat) Jednoduchý případ: Pouze dva procesy, buffer pojme jednu položku. Zobecnění: Buffer pojme více položek, více dodavatelů a odběratelů. Pozn.: větší buffer má smysl kvůli vyrovnávání, ne pokud je rychlost dodavatele větší než odběratele. Příklady dodavatel: komunikační linka, odběratel: webový prohlížeč dodavatel: klávesnice, odběratel: operační systém dodavatel: výpočetní proces, odběratel: GUI Michal Krupka (KI UP) Paralelní programování 1. března 2011 4 / 14

Dodavatel-odběratel Dodavatel-odběratel (Producer-Consumer) jeden ze základních synchronizačních problémů dva procesy: dodavatel (Producer) periodicky získává data a ukládá je do sdíleného úložiště (bufferu), odběratel (Consumer) vyzvedává data z bufferu a zpracovává je dodavatel nesmí zapisovat do plného bufferu (příp. musí počkat) odběratel nesmí číst z prázdného bufferu (příp. musí počkat) Jednoduchý případ: Pouze dva procesy, buffer pojme jednu položku. Zobecnění: Buffer pojme více položek, více dodavatelů a odběratelů. Pozn.: větší buffer má smysl kvůli vyrovnávání, ne pokud je rychlost dodavatele větší než odběratele. Příklady dodavatel: komunikační linka, odběratel: webový prohlížeč dodavatel: klávesnice, odběratel: operační systém dodavatel: výpočetní proces, odběratel: GUI Michal Krupka (KI UP) Paralelní programování 1. března 2011 4 / 14

Dodavatel-odběratel Zadání jednoduché verze Dodavatel v nekonečné smyčce volá funkci produce(), která vrací dodávaná data, data ukládá do sdílené proměnné buffer. Odběratel data vyzvedává z proměnné buffer, periodicky volá funkci consume() s těmito daty. Hodnota nil v proměnné buffer znamená žádná data. Michal Krupka (KI UP) Paralelní programování 1. března 2011 5 / 14

Dodavatel-odběratel Řešení jednoduché verze Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) Obrázek: Dodavatel-odběratel pro buffer délky 1 Michal Krupka (KI UP) Paralelní programování 1. března 2011 6 / 14

Dodavatel-odběratel Korektnost Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) Michal Krupka (KI UP) Paralelní programování 1. března 2011 7 / 14

Dodavatel-odběratel Korektnost Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item Podmínky bezpečnosti (neformálně): c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) Michal Krupka (KI UP) Paralelní programování 1. března 2011 7 / 14

Dodavatel-odběratel Korektnost Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item Podmínky bezpečnosti (neformálně): c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) každá hodnota vrácená funkcí produce() se dostane do proměnné buffer, Michal Krupka (KI UP) Paralelní programování 1. března 2011 7 / 14

Dodavatel-odběratel Korektnost Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item Podmínky bezpečnosti (neformálně): c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) každá hodnota vrácená funkcí produce() se dostane do proměnné buffer, funkce consume() bude zavolána s každou hodnotou v proměnné buffer. Michal Krupka (KI UP) Paralelní programování 1. března 2011 7 / 14

Dodavatel-odběratel Korektnost Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) Podmínky bezpečnosti (neformálně): každá hodnota vrácená funkcí produce() se dostane do buffer: - Producer.item je lokální proměnná, - podmínka živosti (a férovosti), Michal Krupka (KI UP) Paralelní programování 1. března 2011 7 / 14

Dodavatel-odběratel Korektnost Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) Podmínky bezpečnosti (neformálně): každá hodnota vrácená funkcí produce() se dostane do buffer: - Producer.item je lokální proměnná, - podmínka živosti (a férovosti), funkce consume() bude zavolána s každou hodnotou v buffer: - p4 má splněnou prekondici buffer = nil, - je-li buffer nil, nevykonává se p4 a nutně dojde k c3 a c5 (živost). Michal Krupka (KI UP) Paralelní programování 1. března 2011 7 / 14

Dodavatel-odběratel Korektnost Podmínky živosti: Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) p3: je-li buffer nil, v c2 se nečeká a dojde k c4 (férovost), c2: je-li buffer = nil, v p3 se nečeká a dojde k p2 (rovněž férovost). Michal Krupka (KI UP) Paralelní programování 1. března 2011 8 / 14

Dodavatel-odběratel Korektnost Podmínky živosti: Dodavatel-odběratel 1 datatype buffer nil Producer Consumer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item c1: loop forever c2: await buffer c3: item buffer c4: buffer nil c5: consume(item) p3: je-li buffer nil, v c2 se nečeká a dojde k c4 (férovost), c2: je-li buffer = nil, v p3 se nečeká a dojde k p2 (rovněž férovost). Michal Krupka (KI UP) Paralelní programování 1. března 2011 8 / 14

Cvičení 1. Pozměňte řešení pro situaci, kdy nelze použít nil pro signalizaci prázdného bufferu (zavést novou proměnnou). 2. Přidejte do řešení možnost ukončení obou cyklů v případě, že funkce produce() vrátí nil. 3. Okomentujte zjednodušenou verzi bez proměnné item: datatype buffer nil Producer Consumer p1: loop forever p2: await not buffer p3: buffer produce() c1: loop forever c2: await buffer c3: consume(buffer) c4: buffer nil Michal Krupka (KI UP) Paralelní programování 1. března 2011 9 / 14

Dodavatel-odběratel Varianta: odběratel v hlavní smyčce GUI aplikace dodavatel provádí dlouhý výpočet, který nemá blokovat GUI, hlavní proces aplikace je odběratel, testuje data ve smyčce událostí (musí tedy dostávat pravidelné Idle Events; v praxi se moc nepoužívá). Producer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item Dodavatel-odběratel 2 datatype buffer nil Consumer c1: loop forever //... zpracování události... c2: if buffer then c3: item buffer c4: buffer nil c5: consume(item) Obrázek: Dodavatel-odběratel, buffer délky 1, varianta pro smyčku událostí Michal Krupka (KI UP) Paralelní programování 1. března 2011 10 / 14

Dodavatel-odběratel Varianta: odběratel v hlavní smyčce GUI aplikace dodavatel provádí dlouhý výpočet, který nemá blokovat GUI, hlavní proces aplikace je odběratel, testuje data ve smyčce událostí (musí tedy dostávat pravidelné Idle Events; v praxi se moc nepoužívá). Producer p1: loop forever p2: item produce() p3: await not buffer p4: buffer item Dodavatel-odběratel 2 datatype buffer nil Consumer c1: loop forever //... zpracování události... c2: if buffer then c3: item buffer c4: buffer nil c5: consume(item) Obrázek: Dodavatel-odběratel, buffer délky 1, varianta pro smyčku událostí Michal Krupka (KI UP) Paralelní programování 1. března 2011 10 / 14

Dodavatel-odběratel Zadání verze s omezeným bufferem buffer je jednorozměrné pole dané délky nil opět znamená prázdnou hodnotu varianta: předchozí bod neplatí (prázdná hodnota neexistuje) Michal Krupka (KI UP) Paralelní programování 1. března 2011 11 / 14

Dodavatel-odběratel Řešení problému omezeného bufferu s nil Dodavatel-odběratel 3 datatype buffer[n] nil Producer Consumer integer i 0 p1: loop forever p2: item produce() p3: await not buffer[i] p4: buffer[i] item p5: i i + 1 mod N integer i 0 c1: loop forever c2: await buffer[i] c3: item buffer[i] c4: buffer[i] nil c5: consume(item) c6: i i + 1 mod N Obrázek: Dodavatel-odběratel pro omezený buffer s nil Michal Krupka (KI UP) Paralelní programování 1. března 2011 12 / 14

Dodavatel-odběratel Řešení problému omezeného bufferu bez nil předpokládáme, že množina přirozených čísel je neomezená Producer p1: loop forever p2: item produce() p3: await top < bottom + N p4: buffer[top mod N] item p5: top top + 1 Dodavatel-odběratel 4 datatype buffer[n] integer bottom,top 0 Consumer c1: loop forever c2: await bottom < top c3: item buffer[bottom mod N] c4: bottom bottom + 1 c5: consume(item) Obrázek: Dodavatel-odběratel pro omezený buffer Michal Krupka (KI UP) Paralelní programování 1. března 2011 13 / 14

Cvičení 4. Ověřte korektnost obou programů. 5. Přidejte do obou programů možnost ukončení (viz Cv. 2). 6. Upravte program Dodavatel-odběratel 4 tak, aby se proměnné bottom a top neinkrementovaly donekonečna. Michal Krupka (KI UP) Paralelní programování 1. března 2011 14 / 14

Ještě ke kritickým sekcím Použití v praxi obvykle pomocí zámků (locks) klasické objekty (někdy libovolné, někdy speciální třídy) mají metody na vstupní a výstupní protokol (enter, exit) kritická sekce se označí pomocí klíčového slova Příklad v C# Object thislock = new Object(); lock (thislock) { // Kritická sekce } Cvičení 1. V globálním poli accounts jsou uloženy zůstatky bankovních účtů. Napište funkci transfer, která převede zadanou částku mezi účty: (transfer a1 a2 amount). Můžete použít pomocná globální data. Michal Krupka (KI UP) Paralelní programování 15. března 2011 2 / 13

Ještě ke kritickým sekcím Cvičení 2. Vylepšete funkci transfer tak, aby šlo současně (bez čekání) převádět částku mezi různými dvojicemi účtů. 3. Vylepšete funkci transfer tak, aby kromě požadavků z předchozího příkladu umožňovala provádět účetní uzávěrku, tj. test, zda součet zůstatků na všech účtech odpovídá očekávané hodnotě (jelikož provádíme pouze přesuny mezi našimi účty, musí být tento součet konstantní). Udělejte to tak, že napíšete funkci balance, která vrátí součet zůstatků na všech účtech. Tato funkce musí za všech okolností vracet stejnou hodnotu. Může dočasně zablokovat převody mezi účty (tj. způsobit čekání ve funkci transfer). Pozor na uváznutí! Michal Krupka (KI UP) Paralelní programování 15. března 2011 3 / 13

Flynnova taxonomie klasifikace architektur počítačů podle možnosti - paralelního vykonávání instrukcí - paralelního zpracování dat Michael J. Flynn, 1966 Single Instruction Multiple Instruction Single Data SISD MISD Multiple Data SIMD MIMD SISD Klasická von Neumannova architektura (PC s jedním procesorem) MISD Neobvyklé, např. kvůli zabránění chybám (raketoplán) SIMD Paralelní zpracování dat stejným algoritmem (některé superpočítače, vektorové procesory, GPU) MIMD Více procesů zpracovává různá data (moderní PC, distribuované systémy) Michal Krupka (KI UP) Paralelní programování 15. března 2011 4 / 13

Flynnova taxonomie SISD jeden procesor provádí jeden proud instrukcí, pracuje s daty uloženými v jedné paměti Příklad: klasická von Neumannova architektura MISD více procesorů provádí současně více programů s týmiž daty Příklady: nepříliš obvyklé, používá se kvůli předcházení chybám. Např. raketoplán (pět počítačů zpracovává stejná data). Michal Krupka (KI UP) Paralelní programování 15. března 2011 5 / 13

Flynnova taxonomie SIMD více procesorů provádí současně (ve stejném taktu) jeden proud instrukcí na různých datech mezi procesy není nutná synchronizace masivně paralelní výpočty Příklady: Superpočítače v 70. a 80. letech, např. Cray: Cray-1, 1976 200 000 hradel 1 662 procesorů 113 variant vektorové instrukce pohovka zdarma Michal Krupka (KI UP) Paralelní programování 15. března 2011 6 / 13

Flynnova taxonomie Connection Machine: CM-1, 2, konec 80. let 65 536 jednobitových procesorů, uspořádaných do 12-rozměrné hyperkrychle umělá inteligence Další: vektorové instrukce v procesorech (UltraSPARC I: VIS, x86: MMX, POWER: AltiVec) Michal Krupka (KI UP) Paralelní programování 15. března 2011 7 / 13

Flynnova taxonomie MIMD více procesorů provádí současně více úloh na různých datech mezi procesy je nutná synchronizace Příklad: moderní osobní počítače i superpočítače, distribuované systémy Podskupinou je SPMD: Single Program/Multiple Data jednotlivé procesory vykonávají tentýž program (s různými daty), ale ne nutně ve stejném kroku, je nutná synchronizace pomocí bariér (viz dále) Příklady nejběžnější způsob paralelního programování i na MIMD, moderní GPU: stovky jader, souběžně tisíce procesů - na některé úkoly mnohonásobně rychlejší než CPU - programové modely: CUDA (NVIDIA), OpenCL (Apple, otevřený standard, široce podporovaný) - aplikace: zpracování obrazu, modelování a simulace, výpočetní chemie, biologie, medicína... Michal Krupka (KI UP) Paralelní programování 15. března 2011 8 / 13

Bariéry (Jordan 1978) Synchronizační nástroj, používaný zejména při SPMD programování. Bariéra Místo v programu, na kterém procesy čekají, dokud jej všechny nedosáhnou. Příklad: výpočet n-tého řádku Pascalova trojúhelníku pomocí n procesů. 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 0 0 0 0 1 3 3 1 0 0 0 0 0 0 0 1 4 6 4 1 0 0 0 0 0 0 1 5 10 10 5 1 0 0 0 0 0 1 6 15 20 15 6 1 0 0 0 0 1 7 21 35 35 21 7 1 0 0 0 1 8 28 56 70 56 28 8 1 0 Obrázek: Hodnoty pole A v jednotlivých krocích algoritmu Michal Krupka (KI UP) Paralelní programování 15. března 2011 9 / 13

Bariéry Algoritmus pro výpočet n-tého řádku Pascalova trojúhelníka N-tý řádek Pascalova trojúhelníka integer A[N + 2] 0, A[1] 1 i-tý proces pro i od 1 do N 1 integer sum 1: loop N 1 times 2: sum A[i 1] + A[i] 3: barrier 4: A[i] sum 5: barrier Obrázek: N-tý řádek Pascalova trojúhelníka Michal Krupka (KI UP) Paralelní programování 15. března 2011 10 / 13

Bariéry Implementace Ukážeme jednu možnost implementace bariéry. Nejprve bariéra pro dva procesy, implementovaná symetricky: Bariéra pro dva procesy Boolean arrive[poč. procesů] [false,..., false] Proces i Proces j 1: await not arrive[i] 1: await not arrive[j] 2: arrive[i] = true 2: arrive[j] = true 3: await arrive[j] 3: await arrive[i] 4: arrive[j] = false 4: arrive[i] = false Obrázek: Symetrická bariéra pro dva procesy Cvičení 3. Stanovte podmínky bezpečnosti a živosti pro tento algoritmus a zdůvodněte jejich splnění. 4. Implementujte tento algoritmus. Michal Krupka (KI UP) Paralelní programování 15. března 2011 11 / 13

Bariéry Implementace pro více procesů: Butterfly (motýlkovitá) bariéra pro počet procesů N = 2 X, logaritmická složitost na úrovni s se synchronizují procesy ve vzdálenosti 2 s po projití všech úrovní se proces přímo nebo nepřímo synchronizoval s každým jiným procesem Pracovník 1 2 3 4 5 6 7 8 Úroveň 1 Úroveň 2 Úroveň 3 Cvičení 5. Implementujte motýlkovitou bariéru. Michal Krupka (KI UP) Paralelní programování 15. března 2011 12 / 13

Bariéry Implementace pro více procesů: Diseminační bariéra lepší pro počet procesů N 2 X, logaritmická složitost na úrovni s se proces i synchronizuje s procesem ve vzdálenosti 2 s modulo N: nastaví vlajku procesu (i + 2 s ) mod N čeká na a resetuje vlajku procesu (i 2 s ) mod N Pracovník 1 2 3 4 5 6 Úroveň 1 Úroveň 2 Úroveň 3 Cvičení 6. Implementujte diseminační bariéru. Michal Krupka (KI UP) Paralelní programování 15. března 2011 13 / 13

Čtenáři a písaři (Courtois, Heymans, Parnas 1971) klasický a zároveň praktický synchronizační problém Problém: Dva druhy procesů, čtenáři a písaři, sdílejí data, čtenáři je čtou, písaři čtou i zapisují. Pro zabránění interferencí mezi zápisy a čteními vedoucím k nekonzistentnímu stavu dat musí mít písaři výlučný přístup k datům, pokud žádný písař s daty nepracuje, může číst libovolný počet čtenářů. třídy procesů soutěží o přístup k datům: písaři mezi sebou, čtenáři jako třída s písaři písaři se vzájemně vylučují čtenáři jako třída vylučují písaře Michal Krupka (KI UP) Paralelní programování 19. dubna 2011 2 / 5

Čtenáři a písaři: první řešení pomocí semaforů Čtenáři a písaři 1 Semaphore rw 1 Writer w1: loop forever w2: wait(rw) w3: write() w4: signal(rw) Reader? Michal Krupka (KI UP) Paralelní programování 19. dubna 2011 3 / 5

Čtenáři a písaři: první řešení pomocí semaforů Writer w1: loop forever w2: wait(rw) w3: write() w4: signal(rw) Čtenáři a písaři 1 Semaphore rw 1 Integer nr 0 Reader? r1: loop forever r2: r3: nr nr + 1 r4: if nr = 1 then wait(rw) r5: r6: read() r7: r8: nr nr - 1 r9: if nr = 0 then signal(rw) r10: Michal Krupka (KI UP) Paralelní programování 19. dubna 2011 3 / 5

Čtenáři a písaři: první řešení pomocí semaforů Čtenáři a písaři 1 Semaphore rw 1, mutexr 1 Integer nr 0 Writer Reader w1: loop forever w2: wait(rw) w3: write() w4: signal(rw) r1: loop forever r2: wait(mutexr) r3: nr nr + 1 r4: if nr = 1 then wait(rw) r5: signal(mutexr) r6: read() r7: wait(mutexr) r8: nr nr - 1 r9: if nr = 0 then signal(rw) r10: signal(mutexr) Michal Krupka (KI UP) Paralelní programování 19. dubna 2011 3 / 5

Čtenáři a písaři Problém: Preference čtenářů. Jestliže čtenář čte data a jiný čtenář a písař chtějí pracovat s daty, přednost má čtenář. Čtenáři tak mohou neustále blokovat písaře. Na následujícím slajdu je řešení spravedlivé ke čtenářům i písařům. Michal Krupka (KI UP) Paralelní programování 19. dubna 2011 4 / 5

Čtenáři a písaři: druhé řešení pomocí semaforů Writer w1: loop forever w2: wait(writers) w3: wait(readers) w4: signal(readers) w5: write() w6: signal(writers) Čtenáři a písaři 2 Semaphore writers, readers, mutexr 1 Integer nr 0 Reader Integer prev, current r1: loop forever r2: wait(writers) r3: wait(mutexr) r4: prev nr r5: nr nr + 1 r6: signal(mutexr) r7: if prev = 0 then wait(readers) r8: signal(writers) r9: read() r10: wait(mutexr) r11: nr nr 1 r12: current nr r13: signal(mutexr) r10: if current = 0 then signal(readers) Michal Krupka (KI UP) Paralelní programování 19. dubna 2011 5 / 5