1 Příkazy MPI REDUCE a MPI ALLREDUCE

Podobné dokumenty
1.1 Příkazy pro kolektivní komunikaci (pokračování)

Univerzita Jana Evangelisty Purkyně v Ústí nad Labem. Přírodovědecká fakulta

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

APLIKACE. 1.1 Částice v jednorozměrném silovém poli

APLIKACE (pokračování) 1 Paralelní molekulární dynamika

Paralelní LU rozklad

WORKSHEET 1: LINEAR EQUATION 1

Numerické řešení rovnice f(x) = 0

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Ú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

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

Základní komunikační operace

NPRG030 Programování I, 2018/19 1 / :25:37

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

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

Gymnázium, Brno, Slovanské nám. 7 WORKBOOK. Mathematics. Teacher: Student:

Interpret jazyka IFJ2011

CODE BOOK NEISS 8. A code book is an identification tool that allows the customer to perform a test result evaluation using a numeric code.

Lekce 04 Řídící struktury

Compression of a Dictionary

4 Numerické derivování a integrace

MAXScript výukový kurz

Dynamic programming. Optimal binary search tree

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.

Programovací jazyk Pascal

Identifikátory označují objekty v programu používané (proměnné, typy, podprogramy).

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

Transportation Problem

Klávesy, které lze naprogramovat:

Histogram. 11. února Zadání

Úvod do programování

Numerická integrace a derivace

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

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

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

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

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

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

PHP tutoriál (základy PHP snadno a rychle)

Číslo materiálu: VY 32 INOVACE 29/18. Číslo projektu: CZ.1.07/1.4.00/

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

a rhomboid, a side, an angle,a vertex, a height, a perimeter, an area an acute angle, an obtuse angle, opposite sides, parallel sides

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

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

Tento materiál byl vytvořen v rámci projektu Operačního programu Vzdělávání pro konkurenceschopnost.

Počítačová simulace logistických procesů I. 11. přednáška Programování v SimTalk. ŠAVŠ, Fábry

DC circuits with a single source

Martin Lísal. Úvod do MPI

Obsah. 2 Fortran ve Windows a v Linuxu Windows Prostředí MSDS Linux Intel Fortran Úkoly Základy syntaxe 11

C2110 Operační systém UNIX a základy programování

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

X37SGS Signály a systémy

2N LiftIP. IO Extender. Communicator for Lifts. Version

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011

LabView jako programovací jazyk II

Distribuované systémy a výpočty

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

Pokročilé architektury počítačů

MAPLOVSKY PROGRAMOVACI JAZYK

Evoluční algoritmy. Podmínka zastavení počet iterací kvalita nejlepšího jedince v populaci změna kvality nejlepšího jedince mezi iteracemi


Jazyk VHDL konstanty, signály a proměnné. Jazyk VHDL paralelní a sekvenční doména. Kurz A0B38FPGA Aplikace hradlových polí

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

Jazyk PL/SQL Úvod, blok

Execrices. Mathematics FRDIS

Zpracování studie týkající se průzkumu vlastností statistických proměnných a vztahů mezi nimi.

MIDAM Verze 1.1. Hlavní okno :

Úvod do Operačních Systémů

Číslo projektu: CZ.1.07/1.5.00/ Název projektu: Inovace a individualizace výuky

PCKEYB JEDNOTKA PRO OBSLUHU KLÁVESNICE TYPU PC AT. Příručka uživatele a programátora

2. Numerické výpočty. 1. Numerická derivace funkce

x86 assembler and inline assembler in GCC

ALGORITMIZACE A PROGRAMOVÁNÍ

Základy digitální techniky

O makrech, která umí aritmetiku s velkými čísly. Macros Which Handle Arithmetics with Big Numbers. Jan Šustek KMa PřF OU. Brejlov

PŘETĚŽOVÁNÍ OPERÁTORŮ

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

Programovací jazyky. Obsah. Proč používáme programovací jazyky? Programovací jazyk

Multiple Event Support

Samovysvětlující pozemní komunikace

10 Algoritmizace Příklad 2 Word 2007/ VBA

Gymnázium, Brno, Slovanské nám. 7 WORKBOOK. Mathematics. Student: Draw: Convex angle Non-convex angle

Uni- and multi-dimensional parametric tests for comparison of sample results

Souhrn Apendixu A doporučení VHDL

1 LC - numerické řešení integrálu - rozšíření

PODPROGRAMY PROCEDURY A FUNKCE

Matematika (KMI/PMATE)

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

Numerické integrace některých nediferencovatelných funkcí

Binární vyhledávací stromy

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

Zápis programu v jazyce C#

- transpozice (odlišuje se od překlopení pro komplexní čísla) - překlopení matice pole podle hlavní diagonály, např.: A.' ans =

Analyzátor, minimalizátor kombinačních logických obvodů

cyklus s daným počtem opakování cyklus s podmínkou na začátku (cyklus bez udání počtu opakování)

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

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

Transkript:

Martin Lísal listopad 2003 1 Příkazy MPI REDUCE a MPI ALLREDUCE Příkazy MPI REDUCE a MPI ALLREDUCE umožňují provést určité typy operací (např. sčítání či násobení) na proměnných ( mezivýsledcích ), které se nachází na jednotlivých procesech. Zároveň umožňují výsledek těchto operací buď poslat na určitý proces (MPI REDUCE) či rozeslat na všechny procesy (MPI ALLREDUCE). Ukažme si opět použití těchto příkazů v paralelním programu pro numerickou integraci lichoběžníkovou metodou. Připomeňme si, že paralelní program pro numerickou integraci lichoběžníkovou metodou: (i) rozdělil celkový interval na podintervaly podle celkového počtu procesů; (ii) jednotlivé procesy spočetly integrály pro jednotlivé podintervaly pomocí lichoběžníkové metody a (iii) tyto integrály se poslaly pomocí MPI SEND a MPI RECV na proces mající pořadí 0, kde se sečetly a výsledek se vytiskl. Bod (iii) nyní nahradíme příkazem MPI REDUCE a modifikovaná verze paralelního programu pro numerickou integraci lichoběžníkovou metodou může vypadat následovně: Trapezoidal Rule, MPI version 6. Algorithm: 1. Each process calculates "its" interval of integration. 2. Each process estimates the integral of f(x) over its interval using the trapezoidal rule. 3a. MPI_REDUCE sums the integrals on 0. 3b. Process 0 prints the result. program par_lich_int6 implicit none include mpif.h preprocessor directive 1

integer :: nprocs, & # of processes myrank, & my process rank ierr integer :: n, & # of trapezoids local_n # of trapezoids for a processor real :: a, & left endpoint b, & right endpoint h, & trapezoid base length local_a, & left endpoint for a processor local_b, & right endpoint for a processor integral, & integral over a processor total total integral start up MPI call MPI_INIT(ierr) find out how many processes are being used call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) get my process rank call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) get data call Get_Data2(a,b,n,myrank) if(mod(n,nprocs) /= 0) stop "par_lich_int6: Wrong n/nprocs ratio" h=(b-a)/real(n) h is the same for all processes local_n=n/nprocs # of trapezoids length of interval of integration for a process local_a=a+real(myrank)*real(local_n)*h 2

local_b=local_a+real(local_n)*h calculate integral on a process call Trap(local_a,local_b,local_n,h,integral) add up the integrals calculated by each process using MPI_REDUCE call MPI_REDUCE(integral,total,1,MPI_REAL,MPI_SUM,0, & MPI_COMM_WORLD,ierr) print the results if(myrank == 0) then write(*, (1x,a,e13.5) ) " Integral =",total endif shut down MPI call MPI_FINALIZE(ierr) end program par_lich_int6 Subroutine trapezoid for a processor subroutine Trap(local_a,local_b,local_n,h,integral) implicit none integer :: local_n,i real :: local_a,local_b,h,integral,x,f integral=(f(local_a)+f(local_b))/2.0 x=local_a do i=1,local_n-1 x=x+h integral=integral+f(x) enddo integral=integral*h end subroutine Trap 3

Algorithm: 1. Process 0 reads data. 2. Process 0 broadcasts data to other processes. subroutine Get_Data2(a,b,n,myrank) implicit none include mpif.h preprocessor directive integer :: myrank, & my process rank ierr integer :: n # of trapezoids real :: a, & left endpoint b right endpoint if(myrank == 0) then print *," a:" read*,a print *," b:" read*,b print *," n:" read*,n endif call MPI_BCAST(a,1,MPI_REAL,0,MPI_COMM_WORLD,ierr) call MPI_BCAST(b,1,MPI_REAL,0,MPI_COMM_WORLD,ierr) call MPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) end subroutine Get_Data2 Function for integration function f(x) implicit none real :: f,x f=x*x end function f 4

Argument MPI SUM v příkazu MPI REDUCE říká, že se má provést součet proměnných integral z jednotlivých procesů do proměnné total. Šestý argument 0 v příkazu MPI REDUCE říká, že se výsledek total (součet proměných integral) má poslat na proces s pořadím 0. Obecný tvar příkazu MPI REDUCE lze obecně zapsat jako: call MPI_REDUCE(operand,result,count,MPI_data_type,operation,root, & comm,ierr) kde význam argumentů kromě operand, result, operation a root je zřejmý z předchozích probíraných MPI příkazů. operand je proměnná, s kterou MPI REDUCE provádí určité typy operací. result je proměnná typu MP I data type, která obsahuje výsledek určitého typu operace na proměnných operand. operation říká, jaký typ operace se provádí: 1 operation MPI SUM MPI PROD MPI MAX MPI MIN MPI MAXLOC MPI MINLOC Význam součet, násobení, maximum minimum maximum a pořadí procesu, kde se maximum nachází minimum a pořadí procesu, kde se minimum nachází root je typu INTEGER a vyjadřuje pořadí procesu, na který se result posílá. Kdybychom použili v předchozím programu příkaz MPI ALLREDUCE místo příkazu MPI REDUCE, pak by se total rozeslal na všechny procesy. Je tedy zřejmé, že syntaxe příkazu MPI ALLREDUCE je totožná se syntaxí příkazu MPI REDUCE s tím, že neobsahuje argument root. 1 Uvádíme jen nejpoužívanější operace. 5

2 Často používané MPI příkazy Uveďme si pro přehlednost probrané MPI příkazy a doplňme si je o nové. 2.1 Příkazy pro vytvoření a správu paralelního prostředí 2.1.1 Inicializace MPI call MPI_INIT(ierr) 2.1.2 Ukončení MPI call MPI_FINALIZE(ierr) 2.1.3 Definování komunikátoru a určení celkového počtu procesů call MPI_COMM_SIZE(comm,nprocs,ierr) 2.1.4 Definování pořadí jednotlivých procesů call MPI_COMM_RANK(comm,myrank,ierr) 2.1.5 Zastavení paralelního programu call MPI_ABORT(comm,errorcode,ierr) Příkaz MPI ABORT je paralelní verzí příkazu programovacího jazyka STOP. Použije-li jakýkoliv proces příkaz MPI ABORT (např. dojde-li k chybě během čtení na procesu), ukončí se běh paralelního programu na všech procesech. 6

2.2 Příkazy pro kolektivní komunikaci 2.2.1 Synchronizace či blokace paralelního programu call MPI_BARRIER(comm,ierr) 2.2.2 Rozeslání informace na jednotlivé procesy call MPI_BCAST(broadcast_message,count,MPI_data_type,root,comm,ierr) 2.2.3 Distribuce informací stejné velikosti na jednotlivé procesy call MPI_SCATTER(sendbuf,sendcount,send_MPI_data_type, & recvbuf,recvcount,recv_mpi_data_type,root,comm,ierr) Funkce příkazu je vysvětlena na obr. 1 a použití MPI SCATTER demonstruje následující program. program scatter implicit none include mpif.h preprocessor directive integer :: nprocs, & # of processes myrank, & my process rank ierr integer :: i real :: sendmsg(4), & send message recvmsg recieve message start up MPI call MPI_INIT(ierr) find out how many processes are being used call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) 7

if(nprocs > 4) stop " scatter: nprocs > 4" get my process rank call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) if(myrank == 0) then do i=1,nprocs sendmsg(i)=real(i) enddo endif call MPI_SCATTER(sendmsg,1,MPI_REAL,recvmsg,1,MPI_REAL,0, MPI_COMM_WORLD,ierr) print*," myrank =",myrank," recvmsg =",recvmsg shut down MPI call MPI_FINALIZE(ierr) end program scatter & 2.2.4 Shromáždění informací stejné velikosti z jednotlivých procesů call MPI_GATHER(sendbuf,sendcount,send_MPI_data_type, & recvbuf,recvcount,recv_mpi_data_type,root,comm,ierr) Funkce příkazu je vysvětlena na obr. 2 a použití MPI GATHER demonstruje následující program. program gather implicit none include mpif.h preprocessor directive integer :: nprocs, & # of processes 8

myrank, & my process rank ierr real :: sendmsg, & send message recvmsg(4) recieve message start up MPI call MPI_INIT(ierr) find out how many processes are being used call MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) if(nprocs > 4) stop " gather: nprocs > 4" get my process rank call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) sendmsg=real(myrank+1) call MPI_GATHER(sendmsg,1,MPI_REAL,recvmsg,1,MPI_REAL,0, MPI_COMM_WORLD,ierr) if(myrank == 0) then print*," recvmsg:",recvmsg endif shut down MPI call MPI_FINALIZE(ierr) end program gather & 9

Obrázek 1: Schematický popis funkce příkazu MPI SCATTER. Obrázek 2: Schematický popis funkce příkazu MPI GATHER. 10

Figure 128. MPI_SCATTER

Figure 130. MPI_GATHER