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

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

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

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

Úvod do B4B36PDV. Organizace předmětu a seznámení se s paralelizací. B4B36PDV Paralelní a distribuované výpočty

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

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

Paralelní LU rozklad

Připomenutí co je to soustava lineárních rovnic

Operace s maticemi. 19. února 2018

Operace s maticemi

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

Co je obsahem numerických metod?

Paralelní algoritmy v lineární algebře. Násobení matic

Aplikovaná numerická matematika - ANM

VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY

0.1 Úvod do lineární algebry

Paralelní výpočetní jádro matematického modelu elektrostatického zvlákňování

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

Motivace. Software. Literatura a odkazy

DRN: Soustavy linárních rovnic numericky, norma

0.1 Úvod do lineární algebry

Základy matematiky pro FEK

1 0 0 u 22 u 23 l 31. l u11

Paralelní grafové algoritmy

Numerické metody a programování

MATICE. a 11 a 12 a 1n a 21 a 22 a 2n A = = [a ij]

Matematika B101MA1, B101MA2

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

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.

4. Trojúhelníkový rozklad p. 1/20

1/10. Kapitola 12: Soustavy lineárních algebraických rovnic

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 23, 2016

Základy algoritmizace a programování

Matice. Přednáška MATEMATIKA č. 2. Jiří Neubauer. Katedra ekonometrie FEM UO Brno kancelář 69a, tel

Úvod do OpenMP. Jiří Fürst

Základy programování (IZP)

Implementace numerických metod v jazyce C a Python

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

1 Zobrazení 1 ZOBRAZENÍ 1. Zobrazení a algebraické struktury. (a) Ukažte, že zobrazení f : x

Paralelní programování

Součin matice A a čísla α definujeme jako matici αa = (d ij ) typu m n, kde d ij = αa ij pro libovolné indexy i, j.

Matematika. Kamila Hasilová. Matematika 1/34

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Numerické metody a programování. Lekce 4

Martin Lísal. Úvod do MPI

(Cramerovo pravidlo, determinanty, inverzní matice)

FP - SEMINÁŘ Z NUMERICKÉ MATEMATIKY. Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci

Vícevláknové programování na CPU: POSIX vlákna a OpenMP I. Šimeček

Učební texty k státní bakalářské zkoušce Matematika Matice. študenti MFF 15. augusta 2008

Úvod do lineární algebry

Základy maticového počtu Matice, determinant, definitnost

Lingebraické kapitolky - Počítání s maticemi

1. Matice a maticové operace. 1. Matice a maticové operace p. 1/35

Soustavy lineárních rovnic

1. LINEÁRNÍ ALGEBRA Vektory Operace s vektory... 8 Úlohy k samostatnému řešení... 8

Úvod do lineární algebry

Lineární algebra. Matice, operace s maticemi

VI. Maticový počet. VI.1. Základní operace s maticemi. Definice. Tabulku

Matice. Modifikace matic eliminační metodou. α A = α a 2,1, α a 2,2,..., α a 2,n α a m,1, α a m,2,..., α a m,n

Základy matematiky pro FEK

Matematika 1 MA1. 2 Determinant. 3 Adjungovaná matice. 4 Cramerovo pravidlo. 11. přednáška ( ) Matematika 1 1 / 29

5. Maticová algebra, typy matic, inverzní matice, determinant.

IB112 Základy matematiky

Úvod do GPGPU J. Sloup, I. Šimeček

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

SEMESTRÁLNÍ PRÁCE. Leptání plasmou. Ing. Pavel Bouchalík

D 11 D D n1. D 12 D D n2. D 1n D 2n... D nn

Obecná úloha lineárního programování

ČTVERCOVÉ MATICE. Čtvercová matice je taková matice, kde počet řádků je roven počtu jejích sloupců. det(a) značíme determinant čtvercové matice A

Paralelní programování

Matematika 2 pro PEF PaE

Soustavy linea rnı ch rovnic

Programování bez vláken. OpenMP

DEFINICE Z LINEÁRNÍ ALGEBRY

Lineární diskriminační funkce. Perceptronový algoritmus.

Příklad 1/23. Pro rostoucí spojité fukce f(x), g(x) platí f(x) Ω(g(x)). Z toho plyne, že: a) f(x) Ο(g(x)) b) f(x) Θ(g(x)) d) g(x) Ω(f(x))

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

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

GPGPU. Jan Faigl. Gerstnerova Laboratoř pro inteligentní rozhodování a řízení České vysoké učení technické v Praze

Determinant. Definice determinantu. Permutace. Permutace, vlastnosti. Definice: Necht A = (a i,j ) R n,n je čtvercová matice.

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

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

Slajdy k přednášce Lineární algebra I

1 Determinanty a inverzní matice

KIV/ZI Základy informatiky MS EXCEL MATICOVÉ FUNKCE A SOUHRNY

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

8 Matice a determinanty

Transformace obrazu Josef Pelikán KSVI MFF UK Praha

Paralelní programování

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Digitální učební materiál

4EK213 LINEÁRNÍ MODELY

AVDAT Vektory a matice

1. července 2010

a počtem sloupců druhé matice. Spočítejme součin A.B. Označme matici A.B = M, pro její prvky platí:

Okruh Lineární rovnice v Z m Těleso Gaussova eliminace (GEM) Okruh Z m. Jiří Velebil: X01DML 19. listopadu 2007: Okruh Z m 1/20

maticeteorie 1. Matice A je typu 2 4, matice B je typu 4 3. Jakých rozměrů musí být matice X, aby se dala provést

C# konzole Podíl dvou čísel, podmínka IF

Transkript:

Paralelní a distribuované výpočty (B4B36PDV) Branislav Bošanský, Michal Jakob bosansky@fel.cvut.cz Artificial Intelligence Center Department of Computer Science Faculty of Electrical Engineering Czech Technical University in Prague

Dnešní přednáška Motivace

Dnešní přednáška Techniky paralelizace 3 Chci paralelizovat maticový algoritmus Jak na to?

Násobení matice vektorem a11 a12 a13 a14 a15 x1 y1 a21 x2 y2 x3 X = y3 x4 y4 a55 x5 y5 y 1 = i=1,,5 a 1i. x i

Násobení matice vektorem Jak paralelizovat? a11 a12 a13 a14 a15 x1 y1 a21 x2 y2 x3 X = y3 x4 y4 a55 x5 y5 y 1 = i=1,,5 a 1i. x i

Násobení matice vektorem Zřejmá paralelizace výpočet každé složky y je nezávislý a všechny mohou být spočteny paralelně P1 a11 a12 a13 a14 a15 x1 y1 P2 a21 x2 y2 x3 X = y3 x4 y4 a55 x5 y5 y 1 = i=1,,5 a 1i. x i

Násobení matice vektorem Zřejmá paralelizace výpočet každé složky y je nezávislý a všechny mohou být spočteny paralelně void multiply(std::vector<int>& A, std::vector<int>& x, std::vector<int>& y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { y[i] += A[i * COLS + j]*x[j];

Násobení matice vektorem Zřejmá paralelizace výpočet každé složky y je nezávislý a všechny mohou být spočteny paralelně void multiply(std::vector<int>& A, std::vector<int>& x, std::vector<int>& y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { y[i] += A[i * COLS + j]*x[j]; Co můžeme zlepšit?

Násobení matice vektorem Zřejmá paralelizace výpočet každé složky y je nezávislý a všechny mohou být spočteny paralelně void multiply(std::vector<int>& A, std::vector<int>& x, std::vector<int>& y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { y[i] += A[i * COLS + j]*x[j]; Co můžeme zlepšit? Lze využít vektorizaci?

Násobení matice vektorem void multiply(std::vector<int>& A, std::vector<int>& x, std::vector<int>& y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { y[i] += A[i * COLS + j]*x[j]; a11 x1 a11.x1 a12 x2 a12.x2 a13. x3 = a13.x3 + = y1 a14 x4 a14.x4 a15 x5 a15.x5

Násobení matice vektorem Co když budeme násobit po sloupcích? P1 P2 a11 a12 a13 a14 a15 x1 y1 a21 x2 y2 a31 x3 X = y3 a41 x4 y4 a51 a55 x5 y5 z ij = a ij. x j y i = z ij j=1,,5

Násobení matice vektorem a11 x1 a11.x1 z1 a21 x1 a21.x1 a31. x1 = a31.x1 a41 x1 a41.x1 a11.x1 a12.x2 y1 a51 x1 a51.x1 a21.x1 a22.x2 y2 a12 a22 a32 x2 x2. x2 = a12.x2 a22.x2 a32.x2 z2 a31.x1 a41.x1 a51.x1 + a32.x2 ++ = a42.x2 a52.x2 y3 y4 y5 a42 x2 a42.x2 a52 x2 a52.x2

Násobení matice vektorem Bude to fungovat?

Násobení matice vektorem Bude to fungovat? Operace sice mohou být vektorizovány, nicméně přístup není vhodný pro cache (mnoho dotazů) Můžeme data v matici uspořádat po sloupcích a11 a12 a13 a14 a15 a21 a31 a11 a21 a31 a41 a51 a41 a51 a55

Násobení matice vektorem Bude to teď fungovat?... // data has to be ordered by columns in memory for (int i = 0; i < COLS; i++) { x[i] = rand() % 1000; for (int j = 0; j < ROWS; j++) { A[i * ROWS + j] = rand() % 1000;... void multiply_column(std::vector<int> &A, std::vector<int> &x, std::vector<int> &y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for ( int i = 0; i < COLS ; i ++) { for (int j = 0; j < ROWS; j++) { y[j] += A[i * ROWS + j]*x[i];

Násobení matice vektorem Lze dále zefektivnit původní přístup? Vzpomeňte si na falsesharing void multiply(std::vector<int>& A, std::vector<int>& x, std::vector<int>& y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { y[i] += A[i * COLS + j]*x[j];

Násobení matice vektorem Lze dále zefektivnit původní přístup? Vzpomeňte si na falsesharing void multiply(std::vector<int>& A, std::vector<int>& x, std::vector<int>& y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { y[i] += A[i * COLS + j]*x[j]; Nahradíme pole lokální proměnnou

Násobení matice vektorem Lokální proměnná void multiply(std::vector<int> &A, std::vector<int> &x, std::vector<int> &y) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) int tmp; #pragma omp parallel for num_threads(thread_count) reduction(vec_int_plus : y) for (int i=0; i<rows; i++) { tmp = 0; for (int j=0; j<cols; j++) { tmp += A[i * COLS + j]*x[j]; y[i] += tmp;

Násobení dvou matic a11 a12 a13 b11 b12 b13 c11 c12 c13 a21 X b21 = c21 c ij = k=1,,n a ik. b kj

Násobení dvou matic a11 a12 a13 b11 b12 b13 c11 c12 c13 a21 X b21 = c21 Výpočet prvků c je opět nezávislý a lze paralelizovat c ij = k=1,,n a ik. b kj Nevýhody? Velké množství úloh, malé úlohy

Násobení dvou matic a11 a12 a13 b11 b12 b13 c11 c12 c13 a21 X b21 = c21 Můžeme zvětšit úkoly spojením několika řádků void multiply(std::vector<int>& A, std::vector<int>& B, std::vector<int>& C) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) int tmp; #pragma omp parallel for collapse(2) num_threads(thread_count) reduction(vec_int_plus : C) for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { tmp = 0; for (int k=0; k<rows; k++) { tmp += A[i * COLS + k] * B[k * COLS + j]; C[i * COLS + j] += tmp;

Násobení dvou matic Rozdělení na bloky 1 úkol odpovídá částečnému výsledku submatice

Násobení dvou matic Rozdělení na bloky 1 úkol odpovídá částečnému výsledku submatice ( např. c11,c12,c21,c22) b11 b12 b13 b14 b21 a11 a12 a13 a14 a21 c11 c12 c13 c14 c21 c 11 += a 11. b 11 + a 12. b 21 c 12 += a 11. b 12 + a 12. b 22

Násobení dvou matic void multiply_blocks(std::vector<int>& A, std::vector<int>& B, std::vector<int>& C) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) const int ROWS_IN_BLOCK = 10; const int BLOCKS_IN_ROW = ROWS/ROWS_IN_BLOCK; int tmp; #pragma omp parallel for collapse(2) num_threads(thread_count) reduction(vec_int_plus : C) private(tmp) for (int br1=0; br1<blocks_in_row; br1++) { for (int bb=0; bb<blocks_in_row; bb++) { for (int bc2 = 0; bc2 < BLOCKS_IN_ROW; bc2++) { for (int r = br1 * ROWS_IN_BLOCK; r < (br1 + 1) * ROWS_IN_BLOCK; r++) { for (int c = bc2 * ROWS_IN_BLOCK; c < (bc2 + 1) * ROWS_IN_BLOCK; c++) { tmp = 0; for (int k = 0; k < ROWS_IN_BLOCK; k++) { tmp += A[r * COLS + (k + bb*rows_in_block)] * B[(bb*ROWS_IN_BLOCK + k) * COLS + c]; C[r * COLS + c] += tmp;

Násobení dvou matic a11 a12 a13 b11 b12 b13 c11 c12 c13 a21 X b21 = c21 A co dál? Lze využít vektorizaci? Můžeme najednou spočítat vektor částečných hodnot?

Násobení dvou matic a11 a12 a13 b11 b12 b13 c11 c12 c13 a21 X b21 = c21 A co dál? Lze využít vektorizaci? Můžeme najednou spočítat vektor částečných hodnot? Co když budeme násobit řádek i matice A a řádek j matice B? a11 a12 a13 b11 b12 b13 a21 X b21 = z21

Násobení dvou matic a11 a12 a13 b11 b12 b13 a21 X b21 = z21 Opět máme vektor dílčích výsledků z Násobení je vektorové, součet různých vektorů z lze také vektorizovat void multiply(std::vector<int>& A, std::vector<int>& B, std::vector<int>& C) { #pragma omp declare reduction(vec_int_plus : std::vector<int> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<int>())) \ initializer(omp_priv = omp_orig) #pragma omp parallel for collapse(2) num_threads(thread_count) reduction(vec_int_plus : C) for (int r1=0; r1<rows; r1++) { for (int r2=0; r2<rows; r2++) { for (int k=0; k<rows; k++) { C[r1 * COLS + k] += A[r1 * COLS + r2] * B[r2 * COLS + k];

Gaussova eliminace Dalším typickým úkolem je řešení soustavy lineárních rovnic Lze využít Gaussovu eliminaci a11 a12 a13 b1 a21 b2 a11 a12 a13 b1 0 a 22 a 23 b 2 b3 0 0 a 33 b 3 Jak můžeme paralelizovat?

Gaussova eliminace Jaké jsou závislosti mezi hodnotami? Po výběru pivota se změní všechny hodnoty pro řádky a sloupce větší než pozice pivota

Gaussova eliminace Jaké jsou závislosti mezi hodnotami? Po výběru pivota se změní všechny hodnoty pro řádky a sloupce větší než pozice pivota Kterou část můžeme paralelizovat? void gauss(std::vector<double>& A) { for (int i=0; i<rows; i++) { // Make all rows below this one 0 in current column for (int k=i+1; k<rows; k++) { double c = -A[k * COLS + i]/a[i*cols + i]; for (int j=i; j<rows; j++) { if (i==j) { A[k * COLS + j] = 0; else { A[k * COLS + j] += c * A[i * COLS + j];

Gaussova eliminace Jaké jsou závislosti mezi hodnotami? Po výběru pivota se změní všechny hodnoty pro řádky a sloupce větší než pozice pivota void gauss_par(std::vector<double>& A) { #pragma omp declare reduction(vec_int_plus : std::vector<double> : \ std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<double>())) \ initializer(omp_priv = omp_orig) for (int i=0; i<rows; i++) { // Make all rows below this one 0 in current column #pragma omp parallel for num_threads(thread_count) for (int k=i+1; k<rows; k++) { double c = -A[k * COLS + i]/a[i*cols + i]; for (int j=i; j<rows; j++) { if (i==j) { A[k * COLS + j] = 0; else { A[k * COLS + j] += c * A[i * COLS + j];

Gaussova eliminace Co lze dále zefektivnit?

Gaussova eliminace Co lze dále zefektivnit?

Shrnutí paralelní části Základní nástroje pro psaní paralelního programu vlákna a práce s nimi Atomické proměnné OpenMP (Vektorizace, SIMD paralelizace)

Shrnutí paralelní části Základní nástroje pro psaní paralelního programu vlákna a práce s nimi Atomické proměnné OpenMP (Vektorizace, SIMD paralelizace) Základní techniky paralelizace Rozděluj a panuj Threadpool Dekompozice, nalezení co možná nejvíc paralelně bezkonfliktně vykonatelných operací

Shrnutí paralelní části Základní nástroje pro psaní paralelního programu vlákna a práce s nimi Atomické proměnné OpenMP (Vektorizace, SIMD paralelizace) Základní techniky paralelizace Rozděluj a panuj Threadpool Dekompozice, nalezení co možná nejvíc paralelně bezkonfliktně vykonatelných operací Základní algoritmy Řazení

Shrnutí paralelní části Paralelizujete s cílem zefektivnit běh programu/algoritmu Musíte (alespoň částečně) rozumět vykonávání programu na HW Falsesharing Cache optimization

Shrnutí paralelní části Paralelizujete s cílem zefektivnit běh programu/algoritmu Musíte (alespoň částečně) rozumět vykonávání programu na HW Falsesharing Cache optimization Vynechali jsme spoustu věcí Úvodní kurz, aby jste získali základní znalosti a zkušenosti Pokud Vás paralelní programování zaujalo Paralelní algoritmy (B4M35PAG) Obecné výpočty na grafických procesorech (B4M39GPU)

Shrnutí paralelní části Na zkoušku programujte, programujte, programujte! Dostanete problém + sériový algoritmus Cílem bude vytvořit rychlou paralelní verzi

Shrnutí paralelní části Na zkoušku programujte, programujte, programujte! Dostanete problém + sériový algoritmus Cílem bude vytvořit rychlou paralelní verzi Dále paralelizujte, pokud je to potřeba! Pracujte iterativně (mám verzi 1, pokud je pomalá zrychlím, atd.)