Pokročilé architektury počítačů

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

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

Vláknové programování část V

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

Paralelní architektury se sdílenou pamětí

Úvod do OpenMP. Jiří Fürst

Paralelní architektury se sdílenou pamětí

Programování založené na posílání zpráv

Motivace. Software. Literatura a odkazy

Vláknové programování část V

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

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

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

Úvod do MPI. Úvod do MPI Operace send a recieve Blokující a neblokující posílání zpráv Blokující posílání zpráv Neblokující posílání zpráv

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

Proč potřebujeme komunikátory? - pokrač. Týden 4 Programování zasíláním zpráv (MP) - programování v MPI - počítání na svazcích stanic

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Programování bez vláken. OpenMP

Operační systémy. Cvičení 4: Programování v C pod Unixem

Martin Lísal. Úvod do MPI

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

PROGRAMOVÁNÍ V C++ CVIČENÍ

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programovani v Maplu Procedura

Paralelní programování

Procesy a vlákna (Processes and Threads)

Algoritmizace a programování

Algoritmizace a programování

Algoritmizace a programování

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

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

Algoritmizace a programování

C++ 0x aka C++11. Základním kamenem je třída std::thread

2 Datové typy v jazyce C

Zápis programu v jazyce C#

Paralelní programování

Vláknové programování část VI

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Cvičení předmětu MI-PAR P. Tvrdík, I. Šimeček, M. Šoch

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Paralelní algoritmy --- Parallel Algorithms

Základní operace. Prefix sum. Segmentovaný prefix-sum

IUJCE 07/08 Přednáška č. 1

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Programovací jazyk C++ Hodina 1

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Úvod do programovacích jazyků (Java)

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

OpenMP (Open Specification for Multi Processing)

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

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

Jazyk C++, některá rozšíření oproti C

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Pavel Procházka. 3. prosince 2014

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

Vláknové programování část I

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Transformace digitalizovaného obrazu

- jak udělat konstantu long int: L long velka = 78L;

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

x86 assembler and inline assembler in GCC

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

1 Rozdělení paralelních úloh z hlediska jejich

Paralelní programování

Procesy a vlákna - synchronizace

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Paralelizace výpočtů v systému Mathematica

Operační systémy. Cvičení 3: Programování v C pod Unixem

Programovanie v jazyku C - ti to zratam...

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Základy programování (IZP)

Struktura programu v době běhu

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Objektově orientované programování

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

Základní komunikační operace

Jakub Čermák Microsoft Student Partner

Algoritmizace a programování

C++ objektově orientovaná nadstavba programovacího jazyka C

Optimalizace pomocí icc/gcc - vektorizace

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

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

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

Pokročilé architektury počítačů

Programování v C++ 1, 1. cvičení

Paralelní grafové algoritmy

Řídicí struktury. alg3 1

Základy programování (IZP)

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

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY TECHNIKY PARALELNÍHO ZPRACOVÁNÍ VÝPOČTŮ

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Základní datové struktury

Řídící struktury, if, while, switch

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Transkript:

Pokročilé architektury počítačů 03 Programování paralelních systémů Část II. OpenMP a MPI České vysoké učení technické, fakulta elektrotechnická A4M36PAP Pokročilé architektury počítačů Ver.1.00 1

Přehled: OpenMP vs. MPI OpenMP (Open Multi-Processing) jenom pro SMS jednoduchá paralelizace (pomocí direktiv) implicitní komunikace MPI (Message Passing Interface) jak pro SMS tak DMS náročné pro programátora (paralelizace, debugging) explicitní komunikace Hybridní přístup: OpenMP + MPI současný softwarový trend v paralelním počítání MPI napříč uzly clusteru, OpenMP uvnitř uzlu (efektivní využití prostředků; potlačení komunikačního přetížení uvnitř uzlu; dynamické vyvažování zátěže) je možné dosáhnout lepší speedup než při použití jenom OpenMP nebo jenom MPI A4M36PAP Pokročilé architektury počítačů 2

MPP Cray XT5-HE 37 000 výpočetních uzlů (224 162 VE celkem), servisní uzly pro I/O Jeden uzel dva 6-jádrové procesory oba přístup do sdílené paměti Každý uzel 25.6 GB/s do lokální paměti (XT6: 85.3 GB/sec ), 6.4GB/s do sítě, Uzly jsou pospojovány do 3D toroidu 12 OpenMP nebo MPI úloh v uzlu, MPI mezi uzly A4M36PAP Pokročilé architektury počítačů 3

Cluster poskytuje výpočetní výkon spojením vícero počítačů (obvykle střední cenové kategorie) patří sem 85 % systémů z dnes 500 nejvýkonnějších výhodou je nižší cena, dobrá škálovatelnost A4M36PAP Pokročilé architektury počítačů 4

Příklad výpočet určitého integrálu y f(x) b = a I f ( x) dx a b x A4M36PAP Pokročilé architektury počítačů 5

#include <stdio.h> Příklad výpočet určitého integrálu double integral(double a, double b, double (*f)(double), unsigned long int N) { double sum=0, dx=(b-a)/n, x=a+dx; long int i; for(i=1; i<n; i++ ) sum += f(x+i*dx); sum += (f(a)+f(b))/2; return sum*dx; double polynom(double x) { return 2*x+1; void main() { long int N=5e8; double res, a=4, b=5; res = integral(a, b, polynom, N); printf("i = %lf ",res); A4M36PAP Pokročilé architektury počítačů 6

#include <stdio.h> #include <omp.h> Příklad výpočet určitého integrálu double integral(double a, double b, double (*f)(double), unsigned long int N) { double sum=0, dx=(b-a)/n, x=a+dx; long int i; #pragma omp parallel for shared(x,n,dx,f) private(i) reduction(+:sum) for(i=1; i<n; i++ ) sum += f(x+i*dx); sum += (f(a)+f(b))/2; return sum*dx; double polynom(double x) { return 2*x+1; void main() { long int N=5e8; double res, a=4, b=5; res = integral(a, b, polynom, N); printf("i = %lf ",res); Speedup: 1,85!!! A4M36PAP Pokročilé architektury počítačů 7

OpenMP - přehled vše začíná: #pragma omp directive [clause list] program běží sekvenčně pokud nenarazí na parallel direktivu clause list specifikuje podmínky paralelizace, počet vláken, přístup k datům a následnou manipulaci s nimi, rozčleňování.. podmíněná paralelizace: if(scalar expression) stupeň paralelizace: num_threads(integer expression) přístup k datům: shared(variable list), private(variable list), firstprivate(variable list) sběr privátních dat na konci paralelního vykonávání: reduction(operator: variable list), možné operátory: +, *, -,&,, ^, &&, rozčleňování a rozvrhování: schedule(scheduling_class[, parameter]), přičemž je možné volit z: static, dynamic, guided, a runtime A4M36PAP Pokročilé architektury počítačů 8

OpenMP paralelizace for cyklů #pragma omp parallel default (private) shared (n) { #pragma omp for for (int i = 0; i < n; i++) { /* tělo cyklu*/ nebo zkráceně: #pragma omp parallel for default (private) shared (n) for (int i = 0; i < n; i++) { /* tělo cyklu*/ A4M36PAP Pokročilé architektury počítačů 9

OpenMP paralelizace for cyklů #pragma omp parallel default (private) shared (n) { #pragma omp for for (i = 1; i < n; i++) { a[i] = i + a[i-1];? A4M36PAP Pokročilé architektury počítačů 10

OpenMP každé vlákno dělá něco jiného sekvenční vykonávání taska(); taskb(); A4M36PAP Pokročilé architektury počítačů 11

OpenMP každé vlákno dělá něco jiného 1 #pragma omp parallel 2 { 3 #pragma omp sections 4 { 5 #pragma omp section 6 { 7 taska(); 8 9 #pragma omp section 10 { 11 taskb(); 12 13 14 paralelní vykonávání taska taskb A4M36PAP Pokročilé architektury počítačů 12

nebo zkráceně: OpenMP každé vlákno dělá něco jiného 1 #pragma omp parallel sections 2 { 3 #pragma omp section 4 { 5 taska(); 6 7 #pragma omp section 8 { 9 taskb(); 10 11 A4M36PAP Pokročilé architektury počítačů 13

OpenMP co dále umožňuje? vnořený paralelizmus (OMP_NESTED nastavit na TRUE) explicitně specifikovat bariéry (bod synchronizace) označit kód, který má vykonávat pouze jedno vlákno (buď libovolné nebo master) označit kritickou sekci (může vstoupit a vykonávat pouze jedno vlákno v daném čase; ostatní buď čekají, nebo jsou již za touto sekcí) uspořádané vykonávání (jako při sériovém vykonávání) vynucení zápisu do paměti (aktualizace proměnných..) flush; kdy se flush použije implicitně? A flush is implied at a barrier, at the entry and exit of critical, ordered, parallel, parallel for, and parallel sections blocks and at the exit of for, sections, and single blocks. A flush is not implied if a nowait clause is present. It is also not implied at the entry of for, sections, and single blocks and at entry or exit of a master block. A4M36PAP Pokročilé architektury počítačů 14

OpenMP co dále poskytuje? void omp_set_num_threads (int num_threads); int omp_get_num_threads (); int omp_get_max_threads (); int omp_get_thread_num (); int omp_get_num_procs (); int omp_in_parallel(); void omp_init_lock (omp_lock_t *lock); void omp_destroy_lock (omp_lock_t *lock); void omp_set_lock (omp_lock_t *lock); void omp_unset_lock (omp_lock_t *lock); int omp_test_lock (omp_lock_t *lock); A mnoho jiných funkcí A4M36PAP Pokročilé architektury počítačů 15

#include <stdio.h> Příklad výpočet určitého integrálu jinak double integral(double a, double b, double (*f)(double), long N); double polynom(double x) { return 2*x+1; void main() { long int N=5e8; double res, a=4, b=5; y a y = k x + q x b res = integral(a, b, polynom, N); printf("i = %lf ",res); A4M36PAP Pokročilé architektury počítačů 16

#include <stdio.h> Příklad výpočet určitého integrálu jinak double integral(double a, double b, double (*f)(double), long N); double polynom(double x) { return 2*x+1; void main() { long int N=5e8; double res, a=4, b=5; int i=0, pp=1; y (b-a)/pp a y = k x + q x b a b N res = integral(a+((b-a)/pp)*i, a+((b-a)/pp)*(i+1), polynom, N/pp); printf("i = %lf ",res); A4M36PAP Pokročilé architektury počítačů 17

#include <stdio.h> Příklad výpočet určitého integrálu jinak double integral(double a, double b, double (*f)(double), long N); double polynom(double x) { return 2*x+1; void main() { long int N=5e8; double res, a=4, b=5; int i=???, pp=4; y (b-a)/pp a i = 0 1 2 3 y = k x + q b x res = integral(a+((b-a)/pp)*i, a+((b-a)/pp)*(i+1), polynom, N/pp); printf("i = %lf ",res); A4M36PAP Pokročilé architektury počítačů 18

#include <stdio.h> #include <omp.h> Příklad výpočet určitého integrálu jinak double integral(double a, double b, double (*f)(double), long N); double polynom(double x) { return 2*x+1; void main() { long int N=5e8; double res, a=4, b=5; int i, pp=4; y (b-a)/pp a i = 0 1 2 3 #pragma omp parallel private(i) reduction(+:res) num_threads(pp) { i = omp_get_thread_num(); res = integral(a+((b-a)/pp)*i, a+((b-a)/pp)*(i+1), polynom, N/pp); printf("i = %lf ",res); y = k x + q A4M36PAP Pokročilé architektury počítačů 19 b x

#include <stdio.h> #include <omp.h> Příklad výpočet určitého integrálu jinak double integral(double a, double b, double (*f)(double), long N); double polynom(double x) { return 2*x+1; void main() { long int N=5e8; a b double res, a=4, b=5; int i, pp; i = 0 1 2 3 pp = omp_get_num_procs(); #pragma omp parallel private(i) reduction(+:res) num_threads(pp) { i = omp_get_thread_num(); res = integral(a+((b-a)/pp)*i, a+((b-a)/pp)*(i+1), polynom, N/pp); printf("i = %lf ",res); y (b-a)/pp y = k x + q A4M36PAP Pokročilé architektury počítačů 20 x

#include <omp.h> int a, b, i, tid; #pragma omp threadprivate(a) OpenMP další příklad main () { omp_set_dynamic(0); /* Explicitly turn off dynamic threads */ #pragma omp parallel private(b,tid) { tid = omp_get_thread_num(); a = b = tid; printf("thread %d: a,b,%d %d \n",tid,a,b); /* end of parallel section */ #pragma omp parallel private(tid) { tid = omp_get_thread_num(); printf("thread %d: a,b,%d %d \n",tid,a,b); /* end of parallel section */ A4M36PAP Pokročilé architektury počítačů 21

MPI Message Passing Interface komunikace je explicitní, proto: většina MPI funkcí požaduje komunikátor jako argument, komunikátor je objekt definující skupinu procesů, které mohou vzájemně mezi sebou komunikovat, komunikátor MPI_COMM_WORLD zahrnuje všechny procesy, uvnitř komunikátoru pak mají všechny procesy přiděleno své unikátní identifikační číslo RANK, komunikace je buď kolektivní (zúčastňují se všechny procesy komunikátoru), nebo point-to-point A4M36PAP Pokročilé architektury počítačů 22

kolektivní komunikace: je vždy blokující, MPI Message Passing Interface používá předdefinované datové typy MPI (MPI_CHAR, MPI_INT, MPI_LONG, ) se dále dělí na: synchronizaci (procesy se počkají v daném bodě) kolektivní výpočet (redukci) kdy jeden proces sesbírá data od všech ostatních a vykoná nad nimi zadanou operaci přesuny dat (Broadcast, Scatter, Gather, All-to-All) A4M36PAP Pokročilé architektury počítačů 23

#include <stdio.h> #include <mpi.h> MPI téměř minimální program void main(int argc, char *argv[]) { int numprocs, rank, namelen; char proc_name[mpi_max_processor_name]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(processor_name, &namelen); printf("process %d on %s out of %d\n", rank, proc_name, numprocs); MPI_Finalize(); A4M36PAP Pokročilé architektury počítačů 24

#include <stdio.h> #include "mpi.h" Příklad výpočet určitého integrálu ještě jinak inline double f(double x) { return 2*x+1; int main(int argc, char *argv[]) { int myid, numprocs,volba=0; unsigned long int i, n; double startwtime, endwtime, a = 4.0, b = 5.0; double total, integral = 0.0; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); // zjistí počet procesů MPI_Comm_rank(MPI_COMM_WORLD, &myid); // zjistí číslo procesu A4M36PAP Pokročilé architektury počítačů 25

Příklad výpočet určitého integrálu ještě jinak do { if (myid == 0) { printf("\n Zadej pocet intervalu (0 pro ukonceni): "); fflush(stdout); scanf("%ld", &n); if(n==0) break; startwtime = MPI_Wtime(); // pošle proměnou n, délky 1, typu int, z procesu #0 ostatním MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); A4M36PAP Pokročilé architektury počítačů 26

Příklad výpočet určitého integrálu ještě jinak if (n!= 0) { double h = (b - a) / n; double i1 = myid*(n/ numprocs); double i2 = (myid+1)*(n/numprocs); integral= ( f(a+i1*h) + f(a+i2*h) ) / 2; for( i=i1+1 ; i<i2 ; i++ ) integral += f(a+i*h); // proměnou integral ze všech procesů převede do total procesu 0, // délka 1, typ double, operace sčítání MPI_Reduce(&integral, &total, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); A4M36PAP Pokročilé architektury počítačů 27

Příklad výpočet určitého integrálu ještě jinak if (myid == 0) { endwtime = MPI_Wtime(); printf("i= %f\n", total); printf("trvani vypoctu: %f s\n", endwtime - startwtime); fflush(stdout); while (n!= 0); MPI_Finalize(); return 0; A4M36PAP Pokročilé architektury počítačů 28

Příklad výpočet určitého integrálu ještě jinak Výpočet na osmi jedno-jádrových procesorech: Hlavní proces Speedup: 7.89!! Grafy nejsou zarovnány A4M36PAP Pokročilé architektury počítačů 29

Kombinace OpenMP a MPI téměř minimální program #include <stdio.h> #include "mpi.h" #include <omp.h> int main(int argc, char *argv[]) { int numprocs, rank, namelen, iam = 0, np; char processor_name[mpi_max_processor_name]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(processor_name, &namelen); #pragma omp parallel default(shared) private(iam, np) { np = omp_get_num_threads(); iam = omp_get_thread_num(); printf("hello from thread %d out of %d from process %d out of %d on %s\n", iam, np, rank, numprocs, processor_name); MPI_Finalize(); return 0; A4M36PAP Pokročilé architektury počítačů 30