MPI Workshop @ SRCE · modeliranje lijekova geologija (istraživanje nalazišta nafte, predvi...
Transcript of MPI Workshop @ SRCE · modeliranje lijekova geologija (istraživanje nalazišta nafte, predvi...
MPI Workshop @ SRCE / radionica no.1 (1 od 258)
MPI Workshop @ SRCEMPI Workshop @ SRCE
radionica no.1Uvod u Message Passing Interface
Sveučilišni računski centar, Zagreb28. lipnja – 30. lipnja, 2005.
MPI Workshop @ SRCE / radionica no.1 (2 od 258)
InfoInfo--kutakkutak
� Predavači� Stjepan Buljat, apsolvent FER-a� mr.sc. Damir Danijel Žagar, SRCE – sektor za računalne sustave
� Trajanje radionice� 3 dana po 4 školska sata (45min)� Pauza izmeñu dva školska sata (15min)
� Info� Materijali : kopija PowerPoint prezentacije� Prva od dvije predviñene radionice na temu MPI modela PP-a� Uvodna radionica u message-passing model PP-a� Svi slajdovi se nalaze na http://www.srce.hr
MPI Workshop @ SRCE / radionica no.1 (3 od 258)
InfoInfo--kutakkutak
� Pitanja su dobrodošla ☺
� Tehničke informacije� Koristiti će se klaster ACER računala� 8 čvorova + frontend
• CPU– 2 x 1.13 GHz, Intel Pentium III
• RAM– 1 GB
• NIC– 100 MBit
MPI Workshop @ SRCE / radionica no.1 (4 od 258)
Pregled rada Pregled rada –– prvi danprvi dan
� Uvod u paralelni svijet– Kratki pregled paralelnog računanja
» Primjene– Arhitekture računala
» Jednoprocesorska arhitektura
» Višeprocesorska arhitektura» Flynn-ova taksonomija
» Što je klaster?
– Paralelni programski modeli
» Message-passing model– Paralelne programske paradigme
» Task farming / Master – Slave
» SPMD» Data pipelining
» Divide & Conquer
MPI Workshop @ SRCE / radionica no.1 (5 od 258)
Pregled rada Pregled rada –– prvi danprvi dan– Paralelne programske tehnologije
» MPI
» PVM
» Paralelizirajući prevoditelji» P-Threads
» OpenMP
» HPF
» Co-Array Fortran» POOMA and HPC++
» Komponentni modeli / Hibridi
» Pravila odabira tehnologije
� Metodologija dizajna paralelnih aplikacija– Uvod
– Uzroci paralelnog overhead-a– Coarse vs. Fine Grained parallelism
MPI Workshop @ SRCE / radionica no.1 (6 od 258)
Pregled rada Pregled rada –– prvi danprvi dan– Strategije razvoja paralelnih aplikacija– Metodološki dizajn paralelnih algoritama
– Primjer dizajna paralelnog algoritma – Atmosferski model
– Savjeti– Analiza performansi
» A priori analiza
» Ubrzanje
» Efikasnost» Amdahl-ov zakon
» Rad i dodatno opterećenje
» Skalabilnost
MPI Workshop @ SRCE / radionica no.1 (7 od 258)
Pregled rada Pregled rada –– drugi dandrugi dan
� Uvod u MPI– Što je to MPI?– Povijest MPI-a– Osnove MPI komunikacija– Svojstva MPI-a– Prevoñenje i pokretanje MPI aplikacija
� Prvi koraci – programiranje u MPI-u– Uvod– Inicijalizacija MPI– Terminiranje MPI
» “Hello World” aplikacija– Komunikatori, procesi,…– “[extended] Hello World” aplikacija– G6 – najosnovniji skup MPI funkcija
» “G6” aplikacija
MPI Workshop @ SRCE / radionica no.1 (8 od 258)
Pregled rada Pregled rada –– drugi dandrugi dan
� Point-2-Point komunikacija– Osnovni MPI tipovi podataka– Uvod u p2p komunikaciju– Komunikacijski mod – standard send– Komunikacijski mod – synchronous send– Komunikacijski mod – buffered send– Komunikacijski mod – ready send– Send-receive– Informacije o porukama– p2p aplikacija – mjerenje vremena– p2p aplikacija – numerička integracija
� Neblokirajuća komunikacija– Uvod u neblokirajuću aplikaciju– Neblokirajuće send funkcije
» neblokirajući standard-send» neblokirajući synchronous-send
MPI Workshop @ SRCE / radionica no.1 (9 od 258)
Pregled rada Pregled rada –– drugi dandrugi dan» Neblokirajući buffered-send» Neblokirajući ready-send
– Neblokirajuća receive funkcija
– Operacije za testiranje završtka komunikacije» Veći broj aktivnih komunikacija
» Ostale pomoćne funkcije
MPI Workshop @ SRCE / radionica no.1 (10 od 258)
Pregled rada Pregled rada –– treći dantreći dan
� Ponavljanje : MPI funkcije– C funkcije
– Fortran funkcije
� Zadatak 1 : Računanje broja pi– Uvod
– Upute– Rješenje
� Zadatak 2 : Množenje matrica– Uvod– Upute
– Rješenje
� Pregled : Obrañene teme� Pregled : Teme sljedeće radionice
MPI Workshop @ SRCE / radionica no.1 (11 od 258)
Predavači:
mr.sc. Damir Danijel Žagar
Stjepan Buljat
Poglavlje 1Poglavlje 1Uvod u paralelni svijetUvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (12 od 258)
1.1 Kratki pregled paralelnog računanja1.1 Kratki pregled paralelnog računanja
� Zašto paralelizam?� Apsolutna fizikalna ograničenja
• brzina svjetlosti, c = 299792458 m/s• brzina elektrona u bakru, v = 9 cm/ns
– problem kašnjenja
– manje komponente, bliže rasporeñene
• ograničenja minijaturizacije, CMOS @ 65-90µm• kvantni efekti• “heat dissipation” pri visokim frekvencijama
� Ekonomska ograničenja• procesori većeg radnog takta znatno skuplji
� Ograničenja performansi• 2x frekvencija � ne daje dvostruko ubrzanje
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (13 od 258)
1.1 Kratki pregled paralelnog računanja1.1 Kratki pregled paralelnog računanja
� Prednosti paralelizma� rješavanje većih problema u jednakom vremenskom periodu� rješavanje jednakih problema u kraćem periodu� manji troškovi (cluster)� iskorištavanje udaljenih računalnih resursa (grid)
� skalabilnost
� Tri velike prepreke paralelizmu:� Hardware� Software� Algoritmi
� “Computational Science”
Poglavlje 1 – Uvod u paralelni svijet
hardware
software
algoritmi
MPI Workshop @ SRCE / radionica no.1 (14 od 258)
1.1.1 Primjene1.1.1 Primjene
� atmosferske simulacije (predviñanje vremena, uragana,… )
� modeliranje lijekova� geologija (istraživanje nalazišta nafte, predviñanje potresa)
� računalna grafika (animacija, specijalni efekti, renderiranje,…)
� ekonomska modeliranja� itd.
Poglavlje 1 – Uvod u paralelni svijet
…
MPI Workshop @ SRCE / radionica no.1 (15 od 258)
1.1.1 Primjene 1.1.1 Primjene –– eksperimentalna matematikaeksperimentalna matematika
• svaka od ovih jednakosti je provjerena s preciznošću od nekoliko tisuća znamenki• dokaz još nije poznat!
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (16 od 258)
1.2 Arhitekture računala1.2 Arhitekture računala
� Jednoprocesorska arhitektura� Višeprocesorska arhitektura
� kontrolni mehanizmi im mogu biti:• centralizirani• distribuirani
� Paralelno vs. Distribuirano računarstvo� paralelno - više PE rade konkurentno na istom problemu� distribuirano – PE ne dijele memoriju i sistemski sat� distribuirano računarstvo je podskup paralelnog
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (17 od 258)
1.2.1 Jednoprocesorska arhitektura1.2.1 Jednoprocesorska arhitektura
� Jednoprocesorska arhitektura� poznavanje problema paralelnih arhitektura zahtijeva
poznavanje problema jednoprocesorske arhitekture!� glavne komponente jednoprocesorskog sustava
• CPU (Central Processing Unit)
– “Srce” računala
– izvodi sve proračune i nadgleda ostale dijelove računala
– važniji dijelovi CPU-a» ALU (Arithmetic Logic Unit)
» FPU (Floating Point Unit)
» L/SU (Load/Store Unit)
» registri» PC (Program Counter)
» memorijsko sučelje
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (18 od 258)
1.2.1 Jednoprocesorska arhitektura1.2.1 Jednoprocesorska arhitektura
– podjela s obzirom na instrukcijski set» CISC (Complex Instruction Set Computer)
» RISC (Reduced Instruction Set Computer)
• Memorijski sustav– jako kompleksan s mnoštvom faktora
» veličina memorije
» kašnjenje i memorijska hijerarhija
» protok» zaštita memorije
– kašnjenje je usko povezano s fizikalnim ograničenjima
– poluvodičke tehnologije» SRAM (Static Random Access Memory)
� brži od DRAM-a, ali znatno manje gustoće (manje bitova po čipu)
» DRAM (Dynamic Random Access Memory)
� sporiji, veće gustoće i manje se grije (heat dissipation)
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (19 od 258)
1.2.1 Jednoprocesorska arhitektura1.2.1 Jednoprocesorska arhitektura
– hijerarhijska memorija (cache memory)» djelomično rješenje problema kašnjenja
» nekoliko levela hijerarhije (L1, L2)
» L1 – najmanja i najbrža on-chip memorija (SRAM)
• I/O i mreže– I/O ima slične probleme kao i memorija
» porast gustoće i veličine, ali kašnjenje ostaje nepromijenjeno
» kašnjenje reda veličine 10-3 s (elektromehanički ureñaji)» rješenje – korištenje cache memorije (DRAM)
– Mreže su se manje mijenjale
» Ethernet uveden prije 22 godine!» u zadnjih nekoliko godina poboljšanja – 100Mb Ethernet, gigabitni
Ethernet – Infiniband,…; optičke tehnologije,…
» ograničenja usko povezana s brzinom svjetlosti� kašnjenje ne može nikad biti manje od 3 ns po metru!
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (20 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
� Višeprocesorske arhitekture� Memorijski paralelizam
• Raspodijeljena memorija (Distributed Memory)– najjednostavniji oblik paralelnog sustava (hardware’s point of view)
– odvojena računala spojena interkomunikacijskom mrežom– dva pristupa
» distributed shared memory model (DSM)� virtual DSM = shared-memory prog. model na distributed mem. HW
» shared-nothing model– niska cijena i relativno visoke performanse– umrežena osobna računala ili radne stanice
» NOW – Network of Workstations» Beowulf clusters (Thomas Sterling & Donald Becker)» Cluster vs/= MPP – Massively Parallel Processor
� MPP koristi proprietary i specijalizirani software & interconnect-e ??
» Cluster (single processor | SMP – Symmetric MultiProcessors)
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (21 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
• Dijeljena memorija (Shared Memory)
– složeniji pristup (računala su meñusobno “jače” povezana)– jedan fizikalni adresni prostor s podrškom za virtualne adresne prostore– pristup udaljenoj memoriji: manja memorijska kašnjenja i veći protok– problem skalabilnosti, max 128 CPU – cijena(switch) ~ broj(cpu)2
– problem s konzistencijom (consistency) i koherencijom (coherency)
– dva pristupa (sa stajališta cache coherency)» UMA (Uniform Memory Access)
� svaka memorija i cache memorija su spojeni na sve ostale� svaki dio promatra sve memorijske operacije i osigurava koherenciju� vrijeme pristupa bilo kojoj memorijskoj adresi je jednako – uniformno� ovaj pristup se još naziva Symmetric Multiprocessor (SMP)
� loša skalabilnost» NUMA (Nonuniform Memory Access)
� ne zahtijeva da je vrijeme pristupa svakoj mem. adresi uniformno� bolja skalabilnost� CC-NUMA = Cache Coherent NUMA
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (22 od 258)
........P
Memorija
P
P P
PMemorija
P
P P
Interconnect (bus)
periferija
cc-NUMA
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
� sva memorija je globalno organizirana pa je vrijeme pristupa fizički lokalnoj i udaljenoj memoriji različito
� CC-NUMA takoñer koristi second-level interconnect
� UMA/SMP unutar jednog sustva, NUMA preko svih sustava
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (23 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
Poglavlje 1 – Uvod u paralelni svijet
Interconnect (bus)
Memorija Memorija Memorija Memorija
CPU CPU CPU
shared memory model
UMA – shared memory model
Sabirnica (bus)
P1
Cache
P2
Cache
Pn
Cache
System memory
…..
MPI Workshop @ SRCE / radionica no.1 (24 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
Poglavlje 1 – Uvod u paralelni svijet
distributed memory model
Interconnect (neka vrsta)
CPU
Memorija NIC
CPU
Memorija NIC
CPU
Memorija NIC
MPI Workshop @ SRCE / radionica no.1 (25 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
• Ostali oblici memorijskog paralelizma– u ovim oblicima CPU je prilagoñen za rad s memorijskim sustavom– SIMD (Single-Instruction Multiple-Data)
» pojednostavljeni CPU-i spojeni na memoriju» svaki CPU izvršava istu instrukciju» pogodno za data parallel programski model» nije general purpose sustav
– Vector Computing» CPU ima malo eksplicitnog paralelizma, ali memorija je paralelizirana» operacije se izvode na vektorima» jedna instrukcija može obaviti više operacija (pipelined FPU)
» vektori spremljeni u vektorske registre» prijenos podataka iz memorije u vektorske registre koristi višestruke
memorijske spremnike (interleaved memory banks)
» visoki protok podataka izmeñu CPU-a i memorije – za red veličine više od ne-vektorskih računala
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (26 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
� CPU paralelizam• Superskalarno procesiranje
– može obaviti više od jedne operacije u jednom vremenskom ciklusu– performanse se ostvaruju na ne-vektorskom kôdu
– superskalarni procesor ima paralelizma koliko ima funkcionalnih jedinica
– npr. CPU se sastoji od dvije funkcionalne jedinice: FPU i ALU te dva tipa registara Floating-Point-Registers FPR i General-Purpose-Registers GPR.
» onda ovaj CPU može započeti istovremeno obavljanje dvaju operacija, jedne s floating-point brojevima, drugu s integer brojevima
– instruction-level parallelism (ILP)
» odvojene instrukcije se paralelno obavljaju– prednosti ILP-a se mogu iskoristiti preko:
» CPU-a; samostalno mijenja poredak obavljanja instrukcija
» prevoditelja; preporuka je da prevoditelj rasporeñuje poredak instrukcija
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (27 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
• Eksplicitno paralelne instrukcije– upotreba svakog dijela CPU-a je enkodirana unutar instrukcijskog seta
– svaka instrukcija sadrži eksplicitne pod-instrukcije za svaki funkcionalni dio procesora
– very long instruction word (VLIW) instruction set architecture (ISA)
– VLIW sustavi se oslanjaju na prevoditeljsko rasporeñivanje instrukcija
• SIMD i vektorska računala– obavljanje iste operacije na različitim podacima
» uz pomoć više funkcionalnih jedinica– SIMD
» s jednom instrukcijom može se obaviti više operacija
» npr. zbrajanje 3 broja s druga 3 broja koristeći 3 različita zbrajala
– Vektorska računala» ista operacija na skupu podataka – vektoru
» koristi pipelining i neke druge tehnologije (chaining)
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (28 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
• Višenitnost (multithreading)
– thread = skup instrukcija koji se izvodi u virtualnom adresnom prostoru
– thread model nije samo SW model nego je i HW model
– Simultaneous multithreading (SMT)
» dopušta da više niti izvršava svoje instrukcije u istom vremenskom ciklusu
» pruža maksimalno iskorištenje procesora
» prevoditelj | programer mora podijeliti aplikaciju na više odvojenih niti
– Fine-grained multithreading (FGMT)
» jedna nit u jednom vremenskom trenutku
» CPU može mijenjati izvršavanje niti u jednom vremenskom ciklusu» nit koja mora čekati na obavljanje neke spore operacije (npr. čitanje iz memorije) može se suspendirati� prednost: skrivanje memorijskog kašnjenja
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (29 od 258)
1.2.2 Višeprocesorska arhitektura1.2.2 Višeprocesorska arhitektura
� I/O i mreže• manje popularno područje od CPU-a i memorije• Redundant Arrays of Inexpensive Disks (RAID)
– Garth Gibson i Randy Katz 1988.
– početno 5 RAID levela, kasnije prošireno (danas oko 11 levela)
» različita uporaba većeg broja diskova kako bi se pružila veća otpornost na greške i bolje performanse
– HW RAID verzija
» upravljana hardware-om» izgled jednog diska, puno bržeg i/ili pouzdanijeg diska
– SW RAID verzija
» softverski upravljani odvojeni diskovi
• Multiple Path Paralellism
– svaka putanja (path) nosi dio prometa
– fizički odvojene žice za svaki bit
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (30 od 258)
1.2.3 Flynn1.2.3 Flynn--ova taksonomijaova taksonomija
� Prva klasifikacija računalnih arhitektura – Flynn- ova taksonomija iz 1966. god.� SISD (Single Instruction – Single Data)� MISD (Multiple Instruction – Single Data)� SIMD (Single Instruction – Multiple Data)� MIMD (Multiple Instruction – Multiple Data)
� Ovakva podjela se koristi i dan danas uz neke dodatne podjele MIMD modela – u nastavku…
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (31 od 258)
1.2.3 Flynn1.2.3 Flynn--ova taksonomijaova taksonomija
� SISD(Single Instruction – Single Data)� standardno računalo s jednim procesorom� poznato još kao i von Neumann-ov model
Poglavlje 1 – Uvod u paralelni svijet
podatak
PROCESOR
MEMORIJA
instrukcija
MPI Workshop @ SRCE / radionica no.1 (32 od 258)
1.2.3 Flynn1.2.3 Flynn--ova taksonomijaova taksonomija
� SIMD(Single Instruction – Multiple Data)� jednostavni za programiranje� specijalizirana računala: prognoza vremena, procesiranje slike,...
Poglavlje 1 – Uvod u paralelni svijet
podaci
instrukcija
Programska memorija
Upravljanje
procesor
procesor
procesor
Memorija podataka
MPI Workshop @ SRCE / radionica no.1 (33 od 258)
1.2.3 Flynn1.2.3 Flynn--ova taksonomijaova taksonomija
� MISD(Multiple Instruction – Single Data)� više istovremenih operacija na istom podatku� nije previše koristan model
Poglavlje 1 – Uvod u paralelni svijet
PROCESOR
podatak
MEMORIJA
instrukcije
MPI Workshop @ SRCE / radionica no.1 (34 od 258)
1.2.3 Flynn1.2.3 Flynn--ova taksonomijaova taksonomija
� MIMD(Multiple Instruction – Multiple Data)� Dijele se na shared-memory(SM) i distributed-memory(DM)
� SM model se dijeli na bus-based i switch-based arhitekturu� DM model se dijeli na statički i dinamički
Poglavlje 1 – Uvod u paralelni svijet
procesori
memorija
instrukcije
MPI Workshop @ SRCE / radionica no.1 (35 od 258)
1.2.4 Što je klaster?1.2.4 Što je klaster?
� Jedan oblik MIMD modela računala je KLASTER� “skup samostalnih računala meñusobno povezanih računalnom
mrežom koji djeluju kao jedinstveni, integrirani računalni resurs”
� “Poor man’s MPP”� Podjela no.1
� Beowulf klasteri� NOW (Network of Workstations)
� Podjela no.2� HPC (High Performance Computing)� HTC (High Throughput Computing)� HA (High Availability)
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (36 od 258)
1.2.4 Što je klaster?1.2.4 Što je klaster?
� Klaster se sastoji od:� Čvorova
• Frontend
• Compute
� Računalne mreže� Operativnog sustava� Cluster Middleware
• job management system
• monitoring
• file system
Poglavlje 1 – Uvod u paralelni svijet
compute čvorovi
privatna mreža
frontendsučelje privatne mreže
sučeljejavnemreže
korisnici
Beowulf klaster
MPI Workshop @ SRCE / radionica no.1 (37 od 258)
1.2.4 Što je klaster?1.2.4 Što je klaster?
� Beowulf klasteri imaju samo jednu namjenu� dodatna računalna snaga za rješenje nekog računalnog
problema
� Zbog toga, zahtjevi aplikacije trebaju diktirati odabir HW/SW konfiguracije klastera� rješenje dizajna klastera? = “Ovisi o vašoj aplikaciji!”� pri razvoju aplikacije za klaster treba poznavati karakteristike
klastera, njegova ograničenja:• komunikacijska propusnost• kašnjenje• količina slobodne memorije• ....
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (38 od 258)
1.3 Paralelni programski modeli1.3 Paralelni programski modeli
� Poželjna svojstva paralelnog modela:• Apstrakcija (abstraction)
– svojstvo serijskih programskih okruženja
• Modularnost (modularity)
– svojstvo serijskih programskih okruženja
• Konkurentnost (concurrency) i komunikacija (communication)
– osnovni preduvjet paralelizma!
• Skalabilnost (scalability)
• Lokalnost (locality)
• Potreba za visokim performansama (high performance)
• Heterogenost arhitektura (diversity of architecture)
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (39 od 258)
1.3 Paralelni programski modeli1.3 Paralelni programski modeli
� Data Parallelism vs. Task Parallelism
� data parallelism
• konkurentno izvršavanje istih operacija nad različitim podacima
� task parallelism
• konkurentno izvršavanje razl. operacija nad istim | različitim podacima
� većina problema u većem postotku sadrži podatkovni paralelizam nego task paralelizam!
� Explicit vs. Implicit Parallelism
� eksplicitni paralelizam• programer mora eksplicitno specificirati aktivnosti svake konkurentne
niti koje čine paralelno računanje• primjer – Message Passing Interface (MPI)
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (40 od 258)
1.3 Paralelni programski modeli1.3 Paralelni programski modeli
� implicitni paralelizam• programiranje na višem nivou apstrakcije gdje je paralelizam
implicitan, skriven• prevoditelj | biblioteka mora implementirati paralelizam efikasno i
ispravno• primjer – High Performance Fortran (HPF)
– u osnovi data parallel jezik
– običan, sekvencijalni Fortran 90 kôd s dodatnim direktivama
� Shared Memory vs. Distributed Memory
� dijeljena memorija• programer mora definirati aktivnosti skupa procesora koji komuniciraju
putem čitanja/pisanja iz/u dijeljene memorije• prednost – programer se ne mora zamarati s distribucijom podataka
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (41 od 258)
1.3 Paralelni programski modeli1.3 Paralelni programski modeli
� raspodijeljena memorija• procesi imaju samo lokalnu memoriju pa programer mora koristiti
neke druge oblike komunikacije meñu procesima (message passing, remote procedure calls)
• prednost – programer ima eksplicitnu kontrolu nad razdiobom podataka i komunikacijom
– veće performanse na velikim DM paralelnim računalima
� Ostale programske paradigme� object-oriented programming (OOP)
• enkapsulacija, polimorfizam, nasljeñivanje i apstrakcija• izvorno sekvencijalna paradigma
– ali principi su relevantni i za paralelni svijet
• npr. prikladne apstrakcije mogu skriti paralelizam kad on komplicira programiranje
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (42 od 258)
1.3 Paralelni programski modeli1.3 Paralelni programski modeli
� single-program multiple-data (SPMD)• nije usko povezana paradigma s nekim programskim modelom• svi procesori izvršavaju istu aplikaciju• svaki procesor ima vlastitu kontrolnu nit (thread of control) pa može
krenuti drugim putanjama kroz aplikaciju nego ostali procesori• koriste se sinkronizacijski mehanizmi• jako intuitivan model• može se koristiti sa sustave s dijeljenom i raspodijeljenom memorijom• često se koristi u message passing modelu • postoje i primjene u eksplicitno paralelnim jezicima
– Co-Array Fortran
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (43 od 258)
1.3 Paralelni programski modeli1.3 Paralelni programski modeli
� Podjele PP modela su brojne, ali najčešći modeli su:� Podatkovni paralelizam (data parallelism)
� Kontrolni paralelizam (control parallelism)
� Model temeljen na izmjeni poruka (message passing - MP)
� Single Program – Multiple Data model (SPMD)� Pozivi udaljenih procedura (Remote Procedure Call - RPC)
� Aktivne Poruke (Active Messages - AM)
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (44 od 258)
1.3.1 Message Passing model1.3.1 Message Passing model
Poglavlje 1 – Uvod u paralelni svijet
MEMORIJA
PROCESOR
MEMORIJA
PROCESOR
MEMORIJA
PROCESOR…
komunikacijska mreža
MPI Workshop @ SRCE / radionica no.1 (45 od 258)
1.4 Paralelne programske paradigme1.4 Paralelne programske paradigme
� Postoji velik broj podjela paralelnih programskih paradigmi, a ovdje će biti prikazana podjela za koju se smatra da je najopćenitija i najčešća:� Task farming (master/slave)� Single Program – Multiple Data (SPMD)� Data pipelining� Divide and Conquer� Speculative Parallelism
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (46 od 258)
1.4.1 Task1.4.1 Task--Farming/MasterFarming/Master--SlaveSlave
Poglavlje 1 – Uvod u paralelni svijet
POSAO
OBAVLJEN!!
posao kojeg
treba
paralelizirati
podijeli poslove meñu task-ovima
0101001011
0101001011
0101001011
0101001011
0101001011
0101001011
0101001011
slaveČVOR
slaveČVOR
slaveČVOR
0101001011
masterČVOR
slaveČVOR
010101011111100000
slave-1 slave-2 slave-3 slave-4
MPI Workshop @ SRCE / radionica no.1 (47 od 258)
1.4.2 SPMD1.4.2 SPMD
Poglavlje 1 – Uvod u paralelni svijet
raspodijeli podatke
računajizmijeni podatke
računaj
računajizmijeni podatke
računaj
računajizmijeni podatke
računaj
računajizmijeni podatke
računaj
skupi podatke
MPI Workshop @ SRCE / radionica no.1 (48 od 258)
1.4.3 Data Pipelining1.4.3 Data Pipelining
� Neke od primjena:� instrukcijski cjevovod u CPU� vektorski procesori� procesiranje signala� grafika� shell programi u UNIX-u (cat file.txt | grep “hr”)
Poglavlje 1 – Uvod u paralelni svijet
dio-1 dio-2 dio-3ulaz izlaz
proces 0 proces 1 proces 2
MPI Workshop @ SRCE / radionica no.1 (49 od 258)
1.4.4 Divide & Conquer1.4.4 Divide & Conquer
Poglavlje 1 – Uvod u paralelni svijet
podijeli
glavniproblem
spoji
pot-problemi
MPI Workshop @ SRCE / radionica no.1 (50 od 258)
1.5 Paralelne programske tehnologije1.5 Paralelne programske tehnologije
� Message Passing Interface (MPI)� Parallel Virtual Machine (PVM)� Paralelizirajući prevoditelji� P-Threads
� OpenMP
� High Performance Fortran
� Co-Array Fortran
� POOMA i HPC++
� Komponentni modeli� Hibridni modeli
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (51 od 258)
1.5.1 MPI1.5.1 MPI
� Specifikacija za skup funkcija koje upravljaju tokom podataka meñu skupom procesa koji meñusobno komuniciraju
� podrška za C, C++ i Fortran� MPI aplikacije se najčešće implementiraju SPMD modelom� prednosti
� skalabilnost i prenosivost
� mnoštvo biblioteka koje pružaju high-performance implementacije poznatih algoritama
� nedostatak� eksplicitni message-passing stil dodatno opterećuje programera
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (52 od 258)
1.5.2 PVM1.5.2 PVM
� prvi de-facto standard za implementaciju prenosivih message-passing aplikacija� prethodnik MPI-a
� cilj PVM- a� prenosivost, uz žrtvovanje optimalnih performansi� danas se koristi na NOW sustavima
� virtual machine� skup heterogenih umreženih host-ova koji se logički predstavljaju
kao jedno veliko paralelno računalo
� prednosti� izvršavanje aplikacije na umreženom skupu host-ova
• još bolje ako su host-ovi heterogeni
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (53 od 258)
1.5.2 PVM1.5.2 PVM
� funkcije za kontrolu procesa� fault tolerance
� nedostaci� slabe komunikacijske performanse� manji skup komunikacijskih funkcija od MPI-a
� MPI je uglavnom “bolje” rješenje jer se razvija na svim dijelovima gdje mu nedostaje funkcionalnosti koju ima PVM� ali PVM i dalje ima bolju funkcionalnost u nekim dijelovima
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (54 od 258)
1.5.3 Paralelizirajući prevoditelji1.5.3 Paralelizirajući prevoditelji
� najpoželjnija tehnologija� automatska ekstrakcija paralelizma iz sekvencijalnog kôda� korijeni iz nekih automatskih metoda u vekt. računalima� ova tehnologija još nije usporediva s autom. vektorizacijom
� osim na shared-memory sustavima s malim brojem CPU-a
� perfomance gain� ovisi o aplikaciji, ali jako malen
� prednosti� zar ih treba navoditi ☺
� nedostaci� performanse, izvedivost, …
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (55 od 258)
1.5.4 P1.5.4 P--ThreadsThreads
� POSIX standard threads package
� koristi se u shared-memory modelu� višestruke niti kontrole (thread of control) se izvršavaju u jednom
memorijskom prostoru
� low-level implementacija� funkcije za kreiranje/uništavanje niti i njihovu koordinaciju
� preporuka� ne preporuča se koristiti kao general-purpose tehnologija
paralelnog programiranja� samo za iskusne programere
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (56 od 258)
1.5.5 OpenMP1.5.5 OpenMP
� alternativni pristup shared-mem programiranja� veća strukturiranost� iskorištavanje paralelizma u petljama
� podrška za Fortran i C/C++� coarse-grained i fine-grained paralelizam� prednosti
� zadržava sekvencijalnu semantiku – direktive se odbacuju• isto tako se sekvencijalna aplikacija lako pretvara u paralelnu!
� jednostavno ostvarenje osrednjeg paralelizma
� nedostaci� nedostatak podrške za korisničko upravljanje razdiobom podataka
• vjerojatno neće biti skalabilne implementacije OpenMP-a
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (57 od 258)
1.5.6 HPF1.5.6 HPF
� proširenje sekvencijalnog jezika – Fortran 90� s kombinacijama direktiva i funkcija
� data-parallel implicitni paralelni programski model� HPF se razlikuje od OpenMP- a po…
� HPF ima korisničko upravljanje razdiobom podataka� podržava prenosivo, high-perfomance izvršavanje na skalabilnim
sustavima, posebno na distributed-mem sustavima
� prednosti� kompleksni paralelni algoritmi se mogu jednostavno ostvariti, kao
Fortran 90 kôd� jako je dobar za dekompoziciju podataka – machine independent
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (58 od 258)
1.5.6 HPF1.5.6 HPF
� nedostaci� današnje HPF implementacije su efikasne za odreñeni skup
alogoritama• dense linear algebra
• regular grids
� nije primjenjiv na irregular computation probleme• HPF-2 standard propisuje ekstenzije jezika za ovakve probleme, ali
postoji jako malo prevoditelja koji to i implementiraju
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (59 od 258)
1.5.7 Co1.5.7 Co--Array FortranArray Fortran
� jezik namijenjen SPMD programskom modelu� više niti izvršava isti program s meñusobnom
komunikacijom� samo jedna nit, u razmjeni podataka, treba specificirati
komunikaciju� to se radi s deklaracijom pristupnih polja s dodatnom “ko-
dimenzijom” (co-dimension) i indeksirajući tu ko-dimenziju s identifikatorom niti
� prednosti� puno potencijala: low-level manipulacije za poboljšavanje
performansi, nije usko povezan s hardverskim modelima
� nedostaci� nema dobru podršku, novi standard,…
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (60 od 258)
1.5.8 POOMA i HPC++1.5.8 POOMA i HPC++
� alternativan pristup implementaciji implicitnog podatkovnog paralelizma� definiranje biblioteka koje koriste tehnike OOP
� POOMA i HPC++ su biblioteke koje koriste standardne OOP tehnike za definiranje klasa koje enkapsuliraju paralelizam
� prednost� OOP pristup nudi jednostavnost i razumljivost
� nedostatak� kompleksne biblioteke
• debugging and performance problems
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (61 od 258)
1.5.9 Komponentni modeli / Hibridi1.5.9 Komponentni modeli / Hibridi
� Komponentni modeli� omogućuju modularnu konstrukciju kompleksnih algoritama
• CORBA, .COM, Java Beans� u eksperimentalnoj fazi
• trenutno nedostatak podrške za paralelizaciju• ali u budućnosti…
� Hibridi� često se dokazuju kao efektivna i popularna rješenja
• npr. aplikacije razvijene kao distributed-mem framework (MPI) preko shared-mem paralelizma (OpenMP)
� motivacija• pisati aplikacije čija struktura odgovara strukturi današnjih paralelnih
računala (više umreženih shared-mem računala)� ostale hibridne mogućnosti: MPI&p-threads, CORBA&HPF,…
Poglavlje 1 – Uvod u paralelni svijet
MPI Workshop @ SRCE / radionica no.1 (62 od 258)
1.5.10 Pravila odabira tehnologije1.5.10 Pravila odabira tehnologije
Poglavlje 1 – Uvod u paralelni svijet
ako…koristi…
…skalabilnost nije bitna…aplikacija uključuje fine-grained operacije nad dijeljenim podacima…je aplikacija load imbalanced
…ako OpenMP nije dostupan ili prihvatljiv
Threads
…postoji implementacija…se zahtijeva osrednje ulaganje u programiranje (manje od MPI-a)…je SPMD stil programiranja prihvatljiv
Co-Array Fortran
…je aplikacija regularna (regular) i data parallel
…je jednostavno programiranje u Fortran 90 stilu poželjno…je eksplicitna razdioba podataka nužna za bolje performanse…visoka razina kontrole nad paralelizmom nije toliko važna
HPF
…su potrebni svi MPI zahtjevi plus fault tolerancePVM
…je skalabilnost bitna…se aplikacija mora izvršavati na message-passing platformama…je prenosivost bitna…je zahtjevno programiranje prihvatljivo da bi se ostvarili neki ciljevi (visoke perfomanse,…)
MPI
…je cilj ostvariti osrednji paralelizam [O(10)] iz postojećeg kôda…postoji dobra implementacija za ciljanu platformu…prenosivost na distributed-memory sustave nije glavni zahtjev
OpenMP
…je cilj ostvariti osrednji paralelizam [O(4-10)] iz postojećeg kôda…ciljana platforma im dobar paralelizirajući prevoditelj…prenosivost nije glavni zahtjev
Prevoditelj
MPI Workshop @ SRCE / radionica no.1 (63 od 258)
1.5.10 Pravila odabira tehnologije1.5.10 Pravila odabira tehnologije
Poglavlje 1 – Uvod u paralelni svijet
ako…koristi…
…imate specifičan problem…je biblioteka dostupna na ciljanoj platformi
High-level libs
…aplikacija ima task parallel formulaciju…se želi izvršavati aplikaciju na network-based sustavu…performanse nisu bitne
CORBA, RMI
MPI Workshop @ SRCE / radionica no.1 (64 od 258)
Poglavlje 2Poglavlje 2Metodologija dizajna Metodologija dizajna paralelnih aplikacijaparalelnih aplikacija
Predavač:
Stjepan Buljat
MPI Workshop @ SRCE / radionica no.1 (65 od 258)
2.1 Uvod2.1 Uvod
� Paralelizacija � samo još jedna optimizacijska tehnika za brže dobivanje rezultata� pritom se koristi više od jednog procesora za rješenje problema� protečeno vrijeme (wallclock time) se obično smanji, ali ukupno
CPU vrijeme se povećava!
� Kad ćemo paralelizirati problem?� predugo računanje� prevelik problem (memorijski zahtjevan)� uvoñenje skalabilnosti
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (66 od 258)
2.1 Uvod2.1 Uvod
� “Nešto” je paralelno ako postoji odreñeni stupanj nezavisnosti u poretku operacija
� to “nešto” može biti:� skup programskih izraza� algoritam� dio programa� problem koji se pokušava riješiti
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
GR
AN
UL
AR
NO
ST
MPI Workshop @ SRCE / radionica no.1 (67 od 258)
2.2 Uzroci paralelnog 2.2 Uzroci paralelnog overheadoverhead--aa
� Vrijeme potrebno za koordinaciju paralelnih poslova� Sinkronizacija
• eksplicitna– globalna
» utječe na sve poslove (velik utjecaj na performanse)– zaštićeni pristup
» korištenje semafora za pristup varijablama u dijeljenoj memoriji
• implicitna– sinkrone komunikacije (p2p, kolektivna)
� komunikacija meñu poslovima (procesima)� inicijalizacija i terminiranje paralelnih poslova� runtime software overhead (prevoditelj, OS, biblioteke)
• baferiranje• prekidi
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (68 od 258)
2.2 Uzroci paralelnog 2.2 Uzroci paralelnog overheadoverhead--aa
� Parallel overhead
� neminovan dodatak paralelizaciji� nema “besplatne” paralelizacije� vrijedi pravilo da povećanjem broja konkuretnih dijelova
aplikacije raste i paralelni overhead!
� Efikasna paralelizacija se svodi na minimizaciju komunikacijskog overhead- a� zbog dodatne komunikacije ukupno CPU vrijeme u paralelnoj
aplikaciji raste
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (69 od 258)
2.3 Coarse vs. Fine grained parallelism2.3 Coarse vs. Fine grained parallelism
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
coarse grained fine grained
komunikacija
računanje
vrijeme
� Coarse grained
� paralelizam na višem nivou• teško se ostvaruje dobar load balancing
• maleni komunikacijski zahtjevi• ograničena skalabilnost
� Fine grained
� paralelizam na nižem nivou• lakše je ostvariti dobar load balancing
• veći komunikacijski zahtjevi• neograničena skalabilnost
MPI Workshop @ SRCE / radionica no.1 (70 od 258)
2.3 Coarse vs. Fine grained parallelism2.3 Coarse vs. Fine grained parallelism
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
� Load balancing� Veliki problem za aplikacije koje nisu simetrične
• “nezavisni” dijelovi aplikacije se ne izvršavaju jednakom brzinom
� uzrokuje povećanje ukupnog vremena izvršavanja� problem skalabilnosti� na load balancing se može utjecati promjenom zrnatosti
paralelizacije• viñeno na prethodnom slajdu...
MPI Workshop @ SRCE / radionica no.1 (71 od 258)
2.4 Strategije razvoja paralelnih aplikacija2.4 Strategije razvoja paralelnih aplikacija
� Postoje tri općeprihvaćene strategije razvoja paralelnih aplikacija:� (strategija 1) Korištenje paralelnih biblioteka
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Postojeći izvorni
kôd
Pronañi i zamijeni
procedure
Ponovno linkaj (relink)
Paralelna aplikacija
Razvij paralelnu biblioteku
MPI Workshop @ SRCE / radionica no.1 (72 od 258)
2.4 Strategije razvoja paralelnih aplikacija2.4 Strategije razvoja paralelnih aplikacija
� (strategija 2) Automatska paralelizacija• znatno bi se olakšao posao programera• daleko od stvarnosti• još pod istraživanjem
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Postojeći izvorni
kôd
Sitne modifikacije
izvornog kôda
Automatska paralelizacija
Paralelna aplikacija
MPI Workshop @ SRCE / radionica no.1 (73 od 258)
2.4 Strategije razvoja paralelnih aplikacija2.4 Strategije razvoja paralelnih aplikacija
� (strategija 3) Ponovno pisanje aplikacije• preformulacija algoritma s ciljem paralelizacije• minimizirati sekvencijalnost• iskoristiti sekvencijalni kôd ako je prijeko potreban
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Postojeći izvorni
kôd
Pisanje izvornog kôda
iznova
Paralelizacija uz pomoć
prevoditelja
Paralelna aplikacija
MPI Workshop @ SRCE / radionica no.1 (74 od 258)
2.5 Metodološki dizajn paralelnih algoritama2.5 Metodološki dizajn paralelnih algoritama
� Dekompozicija problema je najveći problem paralelizacije
� “Writing good parallel code is actually more of an art than a science; practitioners must be able to think about algorithms in novel ways.”
• Forrest Hoffman
– Linux Magazine – Extreme Linux: An Introduction to PP
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (75 od 258)
2.5 Metodološki dizajn paralelnih algoritama2.5 Metodološki dizajn paralelnih algoritama
� Ian Foster @ Argonne National Laboratory� Uvoñenje istraživačkog pristupa dizajnu aplikacija� Metodologija je strukturirana� Postupak je podijeljen na četiri dijela:
� Particioniranje (partitioning)
� Komunikacija (communication)
� Aglomeracija (agglomeration)
� Mapiranje (mapping)
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (76 od 258)
2.5 Metodološki dizajn paralelnih algoritama2.5 Metodološki dizajn paralelnih algoritama
� Particioniranje� razotkrivanje mogućih paralelnih dijelova algoritma� razdjeljivanje algoritma na manje poslove
• Podatkovna dekompozicija (domain/data decomposition)
• Funkcionalna dekompozicija (functional decomposition)
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Atmosferski model
Oceanskimodel
Hidrološkimodel
Površinski model
Functional decompositionDomain decomposition
nema podjele geometrijska podjelau jednoj dimenziji
geometrijska podjelau dvije dimenzije
MPI Workshop @ SRCE / radionica no.1 (77 od 258)
2.5 Metodološki dizajn paralelnih algoritama2.5 Metodološki dizajn paralelnih algoritama
� Komunikacija � odreñivanje komunikacijskih zahtjeva algoritma� postoje 4 komunikacijska uzorka:
• lokalna/globalna• strukturirana/nestrukturirana• statička/dinamička• sinkrona/asinkrona
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Primjer nestrukturirane komunikacijeFinite Element Mesh – svaki vertex je grid
point, rubovi su komunikacijski putevi
MPI Workshop @ SRCE / radionica no.1 (78 od 258)
Povećavanje veličine task-ova, smanjivanjem dimenzije
geometrijska podjelau jednoj dimenziji
geometrijska podjelau dvije dimenzije
2.5 Metodološki dizajn paralelnih algoritama2.5 Metodološki dizajn paralelnih algoritama
� Aglomeracija� preispitivanje prethodna dva koraka� uvodi praktična ograničenja paralelizacije� postoje tri cilja ovog koraka koja mogu biti konfliktna:
• smanjivanje komunikacijskih troškova povećanjem računske i komunikacijske granularnosti
• zadržavanje fleksibilnosti s obzirom na skalabilnost• smanjivanje troškova softverskog inženjerstva
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Povećavanje veličine task-ova, spajanjem čvorova
MPI Workshop @ SRCE / radionica no.1 (79 od 258)
2.5 Metodološki dizajn paralelnih algoritama2.5 Metodološki dizajn paralelnih algoritama
� Mapiranje� odreñuje mjesto izvršavanja svakog task-a
� NP-complete problem – nema algoritma za efikasno rješenje� cilj = smanjivanje ukupnog vremena izvršavanja� koriste se dvije strategije:
• mapiranje poslova na različite procesore – povećanje konkurentnosti– samo ako se ti poslovi mogu izvoditi konkurentno na različitim CPU
• mapiranje poslova na isti procesor – povećanje lokalnosti– samo ako ti poslovi meñusobno često komuniciraju
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Simulacija supravodljivostiRecursive Bisection
3D strukturaRecursive Graph Bisection
Vremenski modelDynamic, local load balancing
MPI Workshop @ SRCE / radionica no.1 (80 od 258)
2.5 Metodološki dizajn paralelnih algoritama2.5 Metodološki dizajn paralelnih algoritama
� PCAM postupak
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
mapiranje
aglomeracija
komunikacija
particioniranjePROBLEM
MPI Workshop @ SRCE / radionica no.1 (81 od 258)
2.6 Primjer dizajna paralelnog 2.6 Primjer dizajna paralelnog algoritma algoritma –– Atmosferski modelAtmosferski model
� Računalni program koji simulira atmosferske procese (kiša, vjetar, tlak,…) koji utječu na vrijeme ili klimu
� Sve je uvjetovano fizikalnim silama pa se može napraviti matematički model � kompleksno
� Upotreba:� predviñanje sutrašnjeg vremena� utjecaj povišene koncentracije CO2 na klimu, itd.
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (82 od 258)
2.6 Primjer dizajna paralelnog 2.6 Primjer dizajna paralelnog algoritma algoritma –– Atmosferski modelAtmosferski model
� Osnovna fluidna, dinamička, ponašanja atmosfere se opisuju parcijalno diferencijalnim jednadžbama
� Prostor se aproksimira konačnim skupom točaka; prostor je dimenzija Nx x Ny x NZ
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
NZ NY
NX
MPI Workshop @ SRCE / radionica no.1 (83 od 258)
2.6 Primjer dizajna paralelnog 2.6 Primjer dizajna paralelnog algoritma algoritma –– Atmosferski modelAtmosferski model
� Svaka točka tog prostora sadrži vektor s vrijednostima:� tlak� temperatura� brzina vjetra� vlažnost
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Jednadžbe koje se koriste za predviñanje vremena
MPI Workshop @ SRCE / radionica no.1 (84 od 258)
2.6 Primjer dizajna paralelnog 2.6 Primjer dizajna paralelnog algoritma algoritma –– Atmosferski modelAtmosferski model
� Izvodi se vremenska integracija kako bi se odredilo buduće stanje atmosfere ovisno o početnom stanju
� Koristi se finite-difference metoda promjene vrijednosti točaka grida, gdje je stencil-horizontal 9, a stencil-
vertical 3
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (85 od 258)
2.6 Primjer dizajna paralelnog 2.6 Primjer dizajna paralelnog algoritma algoritma –– Atmosferski modelAtmosferski model
� PCAM – Particioniranje� Podatkovna dekompozicija po x,y i z – osi
� Svaka točka grida zasebni task (Nx*Ny*Nz task-ova)
� PCAM – Komunikacija� Postoje tri tipa komunikacije:
• finite-difference stencil – svaki task komunicira s 10 susjeda• globalne operacije – periodički se računa ukupna masa atmosfere
• fizikalni proračuni – računanje fizikalnih komponenti svakog task-a
(npr. TotalClearSky), računski najzahtjevnija i najproblematičnija
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
∑ ∑∑−
=
−
=
−
=
=1
0
1
0
1
0
,,
X Y ZN
i
N
j
N
k
kjiMUkupnaMasa
MPI Workshop @ SRCE / radionica no.1 (86 od 258)
2.6 Primjer dizajna paralelnog 2.6 Primjer dizajna paralelnog algoritma algoritma –– Atmosferski modelAtmosferski model
� PCAM – Aglomeracija� Prevelik broj task-ova previše opterećuje sustav, radi se
postupak grupiranja task-ova u dva koraka:• Aglomeracija s 1 � 4 točke smanjuje komunikacijske zahtjeve s
8 na 4 poruke u horizontalnoj ravnini• U vertikalnoj ravnini su veći komunikacijski zahtjevi (30ak
poruka) zbog fizikalnih proračuna pa se radi stupčana aglomeracija
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (87 od 258)
2.6 Primjer dizajna paralelnog 2.6 Primjer dizajna paralelnog algoritma algoritma –– Atmosferski modelAtmosferski model
� PCAM – Mapiranje� Koristi se jednostavna tehnika mapiranja task-ova na procese
jer je proračun modela ravnomjerno rasporeñen meñu task-
ovima
� Istraživanja su pokazala da load imbalance uzrokuje pad efikasnosti aplikacije do 20%
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (88 od 258)
2.7 Savjeti2.7 Savjeti
� William J. Camp @ Sandia National Laboratories� Director of Computers, Computation and Mathematics
� http://www.cs.sandia.gov
� Aksiomi:� AKSIOM 14
• “first find coarse-grained, then medium-grained, then fine-grained parallelism”
� AKSIOM 15• “done correctly, the gain from these is multiplicative”
� AKSIOM 16• “Life’s balancing act; so’s MPP computing”
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (89 od 258)
2.7 Savjeti2.7 Savjeti
� AKSIOM 17• “be an introvert; never communicate needlessly”
� AKSIOM 18• “be independent; never synchronize needlessly”
� AKSIOM 19• “parallel computing is a cold world, bundle up well”
� AKSIOM 20• “I/O should only be done under medical supervision”
� AKSIOM 21• “if MPP computin’ is easy, it ain’t cheap”
� AKSIOM 22• “if MPP computin’ is cheap, it ain’t easy”
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (90 od 258)
2.7 Savjeti2.7 Savjeti
� AKSIOM 23• “the difficulty of programming an MPP effectively is directly
proportional to latency”
� AKSIOM 24• “the parallelism is in the problem, not in the code”
� AKSIOM 25• “there are an infinite number of parallel algorithms”
� AKSIOM 26• “there are no parallel algorithms (Simon’s theorem); it’s almost true”
� AKSIOM 27• “the best parallel algorithm is almost always a parallel
implementation of the best serial algorithm”
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (91 od 258)
2.7 Savjeti2.7 Savjeti
� AKSIOM 28• “Amdahl’s Law DOES limit vector speedup”
� AKSIOM 18’• “work in teams (sometimes SIMD constructs are just what the
doctor ordered)!”
� Savjeti� SAVJET 1
• Any amount of serialism is death, so…– make the problem large
– look everywhere for serialism and purge it from your code
– never, ever, ever add serial statements
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (92 od 258)
2.7 Savjeti2.7 Savjeti
� SAVJET 2• Keep communications in the noise! So…
– don’t do little problems on big computers– change algorithms when profitable
– bundle up! Avoid small messages on high latency interconnects
– don’t waste memory; using all the memory on a node minimizes theratio of communications to useful work
� SAVJET 3• The parallelism is in the problem! So…
– look first at the problem
– look second at algorithms
– look at data structures in the code– don’t waste cycles on line-by-line parallelism
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (93 od 258)
2.7 Savjeti2.7 Savjeti
� SAVJET 4• Look at the problem, identify the kinds of parallelism it contains…
– multi-program– multi-task
– data parallelism
– inner-loop parallelism (e.g. vectors)
� SAVJET 7• Synchronization is expensive. So…
– don’t do it unless you have to– never, ever put in synchronization just to get rid of a bug else you’ll be
stuck with it for the life of the code!
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
Time into effort
MPI Workshop @ SRCE / radionica no.1 (94 od 258)
2.8 Analiza performansi2.8 Analiza performansi
� Postoji nekoliko mogućih metoda analize performansi paralelnih aplikacija:� a priori analiza� ubrzanje� efikasnost� Amdahl-ov zakon� rad i dodatno opterećenje� skalabilnost
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (95 od 258)
2.8.1 2.8.1 A priori A priori analizaanaliza
� procjena vremena izvoñenja aplikacije� neovisno o računalu� neovisno o programskom jeziku� neovisno o prevoditelju (compiler)
� za procjenu se koristi O- notacija� O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < … < O(2n)
� ili T- notacija� T(n) = 1, T(n) = n2, …
� T(n) � T(n,p)� n – ulazna veličina� p – broj procesa
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (96 od 258)
2.8.1 2.8.1 A priori A priori analizaanaliza
� procjena izvoñenja zajedno s I/O operacijama� T(n,p) = Tcalc(n,p) + Ti/o(n,p)
� procjena izvoñenja zajedno s komunikacijom� T(n,p) = Tcalc(n,p) + Ti/o(n,p) + Tcomm(n,p)
� komunikacijske operacije se opisuju s dva parametra:� ts – vrijeme postavljanja poruke na komunikacijski kanal� tc – vrijeme prijenosa jedne jedinice podataka preko kanala
� tcomm = ts + k*tc
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
ts
vrije
me
broj jedinica podataka (k)
MPI Workshop @ SRCE / radionica no.1 (97 od 258)
2.8.2 Ubrzanje2.8.2 Ubrzanje
� omjer vremena izvoñenja serijske aplikacije (runtime) i vremena izvoñenja paralelne aplikacije �
� linearno ubrzanje� ubrzanje je jednako broju procesa � S(n,p) = p
� usporenje (slowdown)
� ako se paralelna aplikacija izvodi puno sporije od serijske
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
),(
)(),(
pnT
nTpnS
π
σ=
MPI Workshop @ SRCE / radionica no.1 (98 od 258)
2.8.3 Efikasnost2.8.3 Efikasnost
� Mjera iskorištenosti (utilization) procesa u paralelnoj aplikaciji
� Definira se kao �
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
p
pnSpnE
),(),( =
MPI Workshop @ SRCE / radionica no.1 (99 od 258)
2.8.4 Amdahl2.8.4 Amdahl--ov zakonov zakon
� Pretpostavke:� odreñenoj aplikaciji treba Tσ vremena da se izvede koristeći
jedan proces� aplikacija sadrži odreñeni postotak kôda koji se može savršeno
paralelizirati, označava se s r, 0 ≤ r ≤ 1• ovaj dio kôda ima linearno ubrzanje i izvodi se r*Tσ/p vremena
� ostatak kôda, 1 – r, je inherentno serijski• vrijeme izvoñenja je (1 – r)Tσ
� zakon kaže da ubrzanje paralelizirane aplikacije s p procesa iznosi �
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
P
rr
p
TrTr
TpS
+−
=⋅
+⋅−
=
1
1
)1(
)(σ
σ
σ
MPI Workshop @ SRCE / radionica no.1 (100 od 258)
2.8.4 Amdahl2.8.4 Amdahl--ov zakonov zakon
� dS/dp ≥ 0 � funkcija je rastuća po varijabli p� ako p ���� ∞ onda vrijedi �
� postoji gornje ograničenje ubrzanja koje direktno ovisi o dijelu aplikacije koji se može savršeno paralelizirati
� slabe točke zakona� ne uzima se u obzir veličina problema� što je s komunikacijskim overhead-om?� problem nije skalabilan pri većem broju procesora
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
rpS
−→
1
1)(
MPI Workshop @ SRCE / radionica no.1 (101 od 258)
2.8.4 Amdahl2.8.4 Amdahl--ov zakonov zakon
� Ovisnost ubrzanja o količini paralelnog kôda
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
1
3
5
7
9
11
13
15
17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Broj procesora
Ub
rzan
je
r = 1.0 r = 0.99 r = 0.9 r = 0.8 r = 0.7 r = 0.5 r = 0.2
MPI Workshop @ SRCE / radionica no.1 (102 od 258)
2.8.4 Amdahl2.8.4 Amdahl--ov zakonov zakon
� Ovisnost ubrzanja o broju procesora
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
1
2
3
4
5
6
7
8
9
10
11
r
Ub
rzan
je
P = 1 P = 10 P = 100 P = 1000 P = 10000
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
MPI Workshop @ SRCE / radionica no.1 (103 od 258)
2.8.5 Rad i dodatno opterećenje2.8.5 Rad i dodatno opterećenje
� Dva načina kojima se inherentno serijski dio aplikacije može paralelizirati:� jedan proces izvodi naredbe tog segmenta, dok drugi čekaju (idle)
� svi procesi izvode iste naredbe tog segmenta
� Količina rada serijske aplikacije je vrijeme izvoñenja te aplikacije � Wσ(n) = Tσ(n)
� Količina rada paralelne aplikacije je zbroj količina rada svih procesa �
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
∑−
=
=1
0
),(),(p
q
q pnWpnWπ
MPI Workshop @ SRCE / radionica no.1 (104 od 258)
2.8.5 Rad i dodatno opterećenje2.8.5 Rad i dodatno opterećenje
� …odakle vrijedi � Wπ(n,p) = pTπ(n,p)� Redefiniranje definicije efikasnosti ����
� Overhead je količina rada koju paralelna aplikacija izvodi, a serijska ne izvodi �
To(n,p) = Wπ(n,p) - Wσ(n) = pTπ(n,p) - Tσ(n)
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
),(
)(
),(
)(),(
pnW
nW
pnTp
nTpnE
π
σ
π
σ =⋅
=
MPI Workshop @ SRCE / radionica no.1 (105 od 258)
2.8.5 Rad i dodatno opterećenje2.8.5 Rad i dodatno opterećenje
� Tri glavna uzroka overhead- a:� komunikacija� idle vrijeme� dodatno računanje
� paralelizacija � parallel overhead
� nema besplatne paralelizacije!
� efikasno paraleliziranje?� svodi se na minimizaciju komunikacijskih zahtjeva!
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
MPI Workshop @ SRCE / radionica no.1 (106 od 258)
2.8.5 Rad i dodatno opterećenje2.8.5 Rad i dodatno opterećenje
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
wal
lclo
ck t
ime
serijsko izvršavanje paralelno izvršavanje>>bez komunikacije
paralelno izvršavanje>>s komunikacijom
-idealna paralelizacija
-wallclock time je 4puta manji od vremenaizvršavanja serijskeaplikacije
-dodatna komunikacija
-nije 4x puta brži
-ukupno CPU vrijemese povećava!
MPI Workshop @ SRCE / radionica no.1 (107 od 258)
2.8.6 Skalabilnost2.8.6 Skalabilnost
� Paralelna aplikacija je skalabilna ako; kako se broj procesa (p) povećava, možemo pronaći ratu povećavanja veličine problema (n) tako da efikasnost ostaje konstantna
� Funkciju efikasnosti promatramo u okvirima overhead- a, tako da ona u ovisnosti o (n) i (p) iznosi �
� Kako riješiti?
Poglavlje 2 – Metodologija dizajna paralelnih aplikacija
1)(
),(
1
)(),(
)(
),(
)(),(
+
=+
=⋅
=
nT
pnTnTpnT
nT
pnTp
nTpnE
OO
σ
σ
σ
π
σ
MPI Workshop @ SRCE / radionica no.1 (108 od 258)
…… kraj prvog dana …kraj prvog dana …
MPI Workshop @ SRCE / radionica no.1 (109 od 258)
MPI Workshop @ SRCEMPI Workshop @ SRCE
radionica no.1Uvod u Message Passing Interface
Sveučilišni računski centar, Zagreb28. lipnja – 30. lipnja, 2005.
MPI Workshop @ SRCE / radionica no.1 (110 od 258)
Poglavlje 3Poglavlje 3Uvod u MPI Uvod u MPI –– Message Passing Interface Message Passing Interface ––
Predavač:
Stjepan Buljat
MPI Workshop @ SRCE / radionica no.1 (111 od 258)
3.1 Što je to MPI?3.1 Što je to MPI?
� de facto standard za programiranje paralelnih računala s distribuiranom memorijom� biblioteka funkcija koje omogućuju message passing model� specifikacija, a ne implementacija
� MPI ostvaruje sljedeća svojstva modela PP-a:� efikasnost� prenosivost� funkcionalnost� heterogenost
� MPI standard sadrži oko 125 različitih funkcija� Sa samo 6 MPI funkcija može se napraviti paralelna aplikacija
� Pruža podršku za C, C++ i Fortran� u ovoj radionici se koriste samo biblioteke za jezik C
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (112 od 258)
3.1 Što je to MPI?3.1 Što je to MPI?
� Zašto koristiti MPI?� performance-oriented standard� prenosivost� skalabilnost� eksplicitni paralelizam
• programer se bavi paralelizacijom tokom razvoja aplikacije
� Poteškoće s MPI programiranjem� potrebno vrijeme pretvorbe serijskog kôda u paralelni� kompliciranije od serijskog programiranja� gubici pri sinkronizaciji
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (113 od 258)
3.2 Povijest MPI3.2 Povijest MPI--aa
� 1993.� skupina znanstvenika, programera i kompanija (IBM, Cray, Intel,
Convex,..) započinju rad na standardu MPI-a� Danas ta skupina djeluje pod imenom MPI Forum
• www.mpi-forum.org
� 1994., svibanj� izlazi prva verzija standarda – MPI 1.0� osnovne komunikacije� podrška za Fortran 77 i C
� 1995., lipanj� verzija – MPI 1.1� ispravke prethodnog standarda
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (114 od 258)
3.2 Povijest MPI3.2 Povijest MPI--aa
� 1997.� izlazi najnovija verzija – MPI 2.0� podrška za Fortran 90 i C++� nadograñeni MPI 1.2 standard� proširuje standard s dodatnih 30-ak funkcija� sačuvan forward compatibility
� Postoje brojne implementacije MPI standarda od kojih su najpoznatije: MPICH, LAM, CHIMP,…
� Prije MPI su postojale brojne biblioteke za različite tipove računala…danas izumrlo ☺� CMMD (Thinking Machines CM5)� NX (Intel Paragon,…)
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (115 od 258)
3.3 Osnove MPI komunikacija3.3 Osnove MPI komunikacija
� MPI model se temelji na dvije primitive:� primitiva slanja poruka – MPI_Send()
� primitiva primanja poruka – MPI_Recv()
� Koji argumenti su dovoljni za uspješnu komunikaciju?� Opis spremnika poruke
• address• count
• datatype
� Odvajanje poruka• tag (context)
� Imenovanje procesa• rank (odredišni/izvorišni proces)
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (116 od 258)
3.3 Osnove MPI komunikacija3.3 Osnove MPI komunikacija
� Komunikator• comm
� Nakon razmatranja dobivene su sljedeće funkcije� MPI_Send(address, count, datatype, dest, tag, comm)� MPI_Recv(address, count, datatype, src, tag, comm, status)
• status – dodatni argument za spremanje informacija o komunikaciji
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (117 od 258)
3.4 Svojstva MPI3.4 Svojstva MPI--aa
� MPI-1 standard uključuje sljedeća svojstva:� point-2-point komunikacija� kolektivne operacije� grupe procesa� komunikatori� virtualne topologije� upravljanje okolinom� debagiranje i profiliranje� podrška za C i Fortran� komunikacijski modovi� podrška za biblioteke� podrška za heterogene mreže
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (118 od 258)
3.4 Svojstva MPI3.4 Svojstva MPI--aa
� procesi i procesori
� Svojstva koja su nedorañena u MPI-1 standardu, a uključena su u MPI-2 standard:� dinamičko upravljanje procesima� paralelni I/O� jednostrane operacije� podrška za C++
� Većina implementacija ugrañuje svojstva MPI standarda kako im odgovara, ne rade cjelokupne implementacije standarda
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (119 od 258)
3.5 3.5 PrevoPrevoññenje i pokretanje MPI aplikacijaenje i pokretanje MPI aplikacija
� Koristiti će se MPICH 1.2.6 implementacija MPI-a� Intel prevoditelj� http://www-unix.mcs.anl.gov/mpi/mpich/� MPI-1 verzija standarda� Argonne National Laboratory
• http://www.anl.gov/
� Sustav za upravljanje poslovima (JMS)� Sun Grid Engine – SGE
• http://gridengine.sunsource.net/
• U radnom direktoriju se nalazi primjer SGE skripte za pokretanjeposlova
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (120 od 258)
3.5 3.5 PrevoPrevoññenje i pokretanje MPI aplikacijaenje i pokretanje MPI aplikacija
� Predložak SGE skripte� #$ -N <ime-aplikacije>
� #$ -o <ime-output-datoteke>
� #$ -e <ime-error-datoteke>
� #$ -pe mpi <broj-procesa>
� #$ -v P4_GLOBMEMSIZE = <kolicina-shmem>
� #$ -cwd
� mpirun –np $NSLOTS –machinefile $TMPDIR/machines ./<ime-aplikacije>
� Pokretanje poslova� $ qsub <ime-sge-skripte>
� Provjeravanje statusa čvorova� $ qstat -f
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (121 od 258)
3.5 3.5 PrevoPrevoññenje i pokretanje MPI aplikacijaenje i pokretanje MPI aplikacija
� Prevoñenje i povezivanje – C verzija� $ mpicc <source-file> -o <binary-output-file>
� Pokretanje aplikacije – C verzija� $ mpirun –np <# of processes> -machinefile
<listofhosts> ./<app-name>
Poglavlje 3 – Uvod u MPI – Message Passing Interface
MPI Workshop @ SRCE / radionica no.1 (122 od 258)
Poglavlje 4Poglavlje 4Prvi koraciPrvi koraci–– programiranje u MPIprogramiranje u MPI--u u ––
Predavač:
Stjepan Buljat
MPI Workshop @ SRCE / radionica no.1 (123 od 258)
4.1 Uvod 4.1 Uvod
� Osnovni preduvjet� treba uključiti MPI header (biblioteku) u korisnički kôd� biblioteka sadrži definicije konstanti i prototipova
� Predložak MPI funkcija – C verzija� error = MPI_Xxxxx(argument, …);� svaka funkcija vraća kôd pogreške (error)� ime svake funkcije započinje s MPI_ , a nastavlja se sa
znakovnim nizom čije je prvo slovo veliko, a ostala su mala� sve konstante se pišu velikim slovima
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
#include “mpi.h” // za C
#include “mpif.h” // za Fortran
MPI Workshop @ SRCE / radionica no.1 (124 od 258)
4.1 Uvod4.1 Uvod
� Predložak MPI funkcija – Fortran verzija� MPI_XXXXX(argument, …);� ime svake funkcije započinje s MPI_ , a nastavlja se sa
znakovnim nizom čija su sva slova velika• Fortran je case-insensitive pa se ne treba pridržavati navedenog
pravila
� svaka funkcija vraća kôd pogreške preko posljednjeg argumenta• MPI_SUCCES se vraća kad je funkcija uspješno obavljena• svaka funkcija posjeduje skup kôdova koje može vratiti
� svi ostali argumenti su jednaki onima u C verziji MPI funkcija� svi argumenti su tipa INTEGER
• status varijabla je polje INTEGER-a, veličine MPI_STATUS_SIZE
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
MPI Workshop @ SRCE / radionica no.1 (125 od 258)
4.2 Inicijalizacija MPI4.2 Inicijalizacija MPI
� Inicijalizacija MPI komunikacijskih mehanizama� funkcija MPI_Init() se poziva prije svih MPI funkcija kako bi se
inicijaliziralo MPI okruženje (enviroment)
� C verzija
– argc, argv � argumenti koje prima main() funkcija
– ne preporuča ih se koristiti zbog prenosivosti aplikacije
� Fortran verzija
– INTEGER IERROR
– ne prima nikakve argumente osim kôda za pogrešku
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
int MPI_Init(int *argc, char ***argv);
MPI_INIT( IERROR )
MPI Workshop @ SRCE / radionica no.1 (126 od 258)
4.3 Terminiranje MPI4.3 Terminiranje MPI
� Terminiranje MPI komunikacijskih mehanizama� nakon svih MPI funkcija poziva se funkcija MPI_Finalize() koja
briše sve postavljene parametre� C verzija
� Fortran verzija
– INTEGER IERROR
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
int MPI_Finalize(void);
MPI_FINALIZE( IERROR)
MPI Workshop @ SRCE / radionica no.1 (127 od 258)
4.3 Terminiranje MPI4.3 Terminiranje MPI
� Postoji i alternativna funkcija za terminiranje koja se koristi kad se “uhvati” pogreška koju se ne može popraviti
• obrada grešaka će se raditi u sljedećoj MPI radionici (no.2)• C verzija
– IN comm komunikator– IN errorcode kôd pogreške koji vraćamo
• Fortran verzija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
int MPI_Abort(MPI_Comm comm, int errorcode);
MPI_ABORT(COMM, ERRORCODE, IERROR)
MPI Workshop @ SRCE / radionica no.1 (128 od 258)
4.3.1 “Hello World” aplikacija4.3.1 “Hello World” aplikacija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
#include <stdio.h>#include <mpi.h>
int main(int argc, char **argv) {
MPI_Init(&argc, &argv); /* inicijalizacija MPI-a */
printf(“Hello World!\n”);
MPI_Finalize();return 0;
}
1/1
MPI Workshop @ SRCE / radionica no.1 (129 od 258)
4.3.1.1 “Hello World” 4.3.1.1 “Hello World” –– output output
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
sbuljat@cgi-sge sbuljat]$ ssh compute-0-5
Rocks Compute Node
[sbuljat@compute-0-5 sbuljat]$ cd workshop/no.1/example.1
[sbuljat@compute-0-5 example.1]$ mpicc helloWorld.c -o helloWorld
[sbuljat@compute-0-5 example.1]$ mpiexec -n 4 ./helloWorld
Hello World!
Hello World!
Hello World!
Hello World!
[sbuljat@compute-0-5 example.1]$ mpiexec -n 8 ./helloWorld
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
[sbuljat@compute-0-5 example.1]$
1/1
MPI Workshop @ SRCE / radionica no.1 (130 od 258)
4.4 Komunikatori, procesi, … 4.4 Komunikatori, procesi, …
� Komunikator� lokalni objekt koji predstavlja komunikacijsku domenu� komunikacijska domena je globalna, distribuirana struktura koja
omogućuje procesima u grupi da meñusobno komuniciraju� intrakomunikator
• meñu-procesna komunikacija unutar iste grupe procesa
� interkomunikator• meñu-procesna komunikacija iz različitih grupa procesa
� komunikator sadrži poredanu listu procesa• ta lista je konstanta (osim u MPI 2.0 standardu)
� svi procesi formiraju komunikator MPI_COMM_WORLD� korisnici mogu kreirati vlastite komunikatore
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
MPI Workshop @ SRCE / radionica no.1 (131 od 258)
4.4 Komunikatori, procesi, …4.4 Komunikatori, procesi, …
� Rank� identifikator procesa unutar komunikatora� procesi unutar komunikatora su slijedno poredani
• počevši od 0 pa do p – 1; gdje je p ukupan broj procesa
� svrha rank-a je adresiranje procesa• slanje i primanje poruka
� jedan proces može istovremeno pripadati većem broju komunikatora
• unutar svakog komunikatora ima svoj rank
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
MPI Workshop @ SRCE / radionica no.1 (132 od 258)
4.4 Komunikatori, procesi, …4.4 Komunikatori, procesi, …
� Shematski prikaz procesa unutar komunikatora
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
6/0
1
2
4
5/1
3
8/2
7/30
MPI_COMM_WORLD
NEW_COMM
MPI Workshop @ SRCE / radionica no.1 (133 od 258)
4.4 Komunikatori, procesi, …4.4 Komunikatori, procesi, …
� Ukupan broj procesa� C verzija
– IN comm ���� komunikator
– OUT size ���� broj procesa u grupi komunikatora comm
� Fortran verzija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
int MPI_Comm_size(MPI_Comm comm, int *size);
MPI_COMM_SIZE(COMM, SIZE, IERROR)
MPI Workshop @ SRCE / radionica no.1 (134 od 258)
4.4 Komunikatori, procesi, …4.4 Komunikatori, procesi, …
� Rank pojedinog procesa� proces unutar komunikatora ima svoj rank, on se odreñuje preko:� C verzija
– IN comm ���� komunikator
– OUT rank ���� rank pozivajućeg procesa
� Fortran verzija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
int MPI_Comm_rank(MPI_Comm comm, int *rank);
MPI_COMM_RANK(COMM, RANK, IERROR)
MPI Workshop @ SRCE / radionica no.1 (135 od 258)
4.4 Komunikatori, procesi, …4.4 Komunikatori, procesi, …
� Ime čvora� postoji mogućnost odreñivanja imena (hostname) čvora na kojem
se proces izvodi, to se radi preko funkcije:� C verzija
– OUT name ���� naziv čvora na kojem se proces izvodi
– OUT resultlen ���� veličina znakovnog polja name
� Fortran verzija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
int MPI_Get_processor_name(char *name, int *resultlen);
MPI_GET_PROCESSOR_NAME(NAME, RESULTLEN, IERROR)
MPI Workshop @ SRCE / radionica no.1 (136 od 258)
4.5 “[extended] Hello World” aplikacija4.5 “[extended] Hello World” aplikacija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
#include <stdio.h>#include <mpi.h>
int main(int argc, char **argv) {int myrank; /* rank procesa */int poolsize; /* ukupan broj procesa */int length; /* duljina zn. niza procName */char procName[BUFSIZ]; /* ime čvora */
MPI_Init(&argc, &argv); /* inicijalizacija MPI-a */
MPI_Comm_size(MPI_COMM_WORLD, &poolsize);MPI_Comm_rank(MPI_COMM_WORLD, &myrank);MPI_Get_processor_name(procName, &length);printf(“Hello from processor %s\n”, procName);printf(“My rank is %d, pool size is %d\n”, myrank, poolsize);
MPI_Finalize();return 0;
}
1/1
MPI Workshop @ SRCE / radionica no.1 (137 od 258)
4.5.1 “[extended] Hello World” 4.5.1 “[extended] Hello World” –– output output
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
[sbuljat@cgi-sge sbuljat]$ ssh c0-5
Rocks Compute Node
[sbuljat@compute-0-5 sbuljat]$ cd workshop/no.1/example.2
[sbuljat@compute-0-5 example.2]$ mpiicc simpleMPI.c -o simpleMPI
[sbuljat@compute-0-5 example.2]$ mpiexec -n 2 ./simpleMPI
Hello from processor compute-0-5.local
My rank is 0, pool size is 2
Hello from processor compute-0-5.local
My rank is 1, pool size is 2
[sbuljat@compute-0-5 example.2]$ mpiexec -n 4 ./simpleMPI
Hello from processor compute-0-5.local
My rank is 0, pool size is 4
Hello from processor compute-0-5.local
My rank is 1, pool size is 4
Hello from processor compute-0-5.local
My rank is 2, pool size is 4
Hello from processor compute-0-5.local
My rank is 3, pool size is 4
[sbuljat@compute-0-5 example.2]$
1/1
MPI Workshop @ SRCE / radionica no.1 (138 od 258)
4.6 G6 4.6 G6 –– najosnovniji skup MPI funkcijanajosnovniji skup MPI funkcija
� Većina paralelnih algoritama se može isprogramirati koristeći 6 osnovnih MPI funkcija:� MPI_Init()� MPI_Comm_size()� MPI_Comm_rank()� MPI_Send()� MPI_Recv()� MPI_Finalize()
� Uz prethodno definirane funkcije koriste se još prijeko potrebne funkcije za slanje i primanje poruka…nastavak…
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
MPI Workshop @ SRCE / radionica no.1 (139 od 258)
4.6 G6 4.6 G6 –– najosnovniji skup MPI funkcijanajosnovniji skup MPI funkcija
� C verzija
– IN buf početna adresa buffer-a– IN count broj elemenata u buffer-u– IN datatype tip podataka koji se šalje– IN dest/src rank odredišta/izvorišta poruke– IN tag tag poruke– IN comm komunikator– OUT status status poruke
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
int MPI_Send(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm);
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src,int tag, MPI_Comm comm, MPI_Status *status);
MPI Workshop @ SRCE / radionica no.1 (140 od 258)
4.6 G6 4.6 G6 –– najosnovniji skup MPI funkcijanajosnovniji skup MPI funkcija
� Fortran verzija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
MPI_SEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, IERROR)
MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR)
MPI Workshop @ SRCE / radionica no.1 (141 od 258)
4.6.1 “G6” aplikacija4.6.1 “G6” aplikacija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
#include <stdio.h>#include "mpi.h"
#define MASTER_RANK 0#define TRUE 1#define FALSE 0
int main(int argc, char **argv) {int myrank, poolsize, length, i, recv_rank;int i_am_the_master = FALSE;MPI_Status status;
MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &poolsize);MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
if(myrank == MASTER_RANK)i_am_the_master = TRUE;
1/2
MPI Workshop @ SRCE / radionica no.1 (142 od 258)
4.6.1 “G6” aplikacija4.6.1 “G6” aplikacija
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
if(i_am_the_master == TRUE) {for(i=1; i<poolsize; i++) {
MPI_Recv(&recv_rank, sizeof(recv_rank), MPI_INT, i, 0, MPI_COMM_WORLD, &status);
printf("Received rank %d from process with rank %d\n", recv_rank, i);
}}else {
MPI_Send(&myrank, sizeof(myrank), MPI_INT, MASTER_RANK, 0, MPI_COMM_WORLD);
}MPI_Finalize();return 0;
}
2/2
MPI Workshop @ SRCE / radionica no.1 (143 od 258)
4.6.1.1 “G6” 4.6.1.1 “G6” –– output output
Poglavlje 4 – Prvi koraci – programiranje u MPI-u
[sbuljat@cgi-sge sbuljat]$ ssh c0-5
Rocks Compute Node
[sbuljat@compute-0-5 sbuljat]$ cd workshop/no.1/example.3
[sbuljat@compute-0-5 example.3]$ mpiicc G6.c -o G6
[sbuljat@compute-0-5 example.3]$ mpiexec -n 2 ./G6
Received rank 1 from process with rank 1
[sbuljat@compute-0-5 example.3]$ mpiexec -n 8 ./G6
Received rank 1 from process with rank 1
Received rank 2 from process with rank 2
Received rank 3 from process with rank 3
Received rank 4 from process with rank 4
Received rank 5 from process with rank 5
Received rank 6 from process with rank 6
Received rank 7 from process with rank 7
[sbuljat@compute-0-5 example.3]$
1/1
MPI Workshop @ SRCE / radionica no.1 (144 od 258)
Poglavlje 5Poglavlje 5PointPoint--toto--point point komunikacijakomunikacija
Predavač:
Stjepan Buljat
MPI Workshop @ SRCE / radionica no.1 (145 od 258)
5.1 Osnovni MPI tipovi podataka5.1 Osnovni MPI tipovi podataka
� C verzija� skup predefiniranih tipova podataka� tipovi podataka koje možemo pronaći u C-u, osim posljednja dva
Poglavlje 5 – Point-to-point komunikacija
nema ga u C-uMPI_PACKED
nema ga u C-uMPI_BYTE
long doubleMPI_LONG_DOUBLE
doubleMPI_DOUBLE
floatMPI_FLOAT
unsigned long intMPI_UNSIGNED_LONG
unsigned intMPI_UNSIGNED
unsigned short intMPI_UNSIGNED_SHORT
unsigned charMPI_UNSIGNED_CHAR
signed long intMPI_LONG
signed intMPI_INT
signed short intMPI_SHORT
signed charMPI_CHAR
C ekvivalentMPI tip podataka
MPI Workshop @ SRCE / radionica no.1 (146 od 258)
5.1 Osnovni MPI tipovi podataka5.1 Osnovni MPI tipovi podataka
� Fortran verzija� tipovi podataka koje možemo pronaći u Fortran-u, osim posljednja dva
Poglavlje 5 – Point-to-point komunikacija
nema ga u Fortran-uMPI_PACKED
nema ga u Fortran-uMPI_BYTE
CHARACTER(1)MPI_CHARACTER
LOGICALMPI_LOGICAL
COMPLEXMPI_COMPLEX
DOUBLE PRECISIONMPI_DOUBLE_PRECISION
REALMPI_REAL
INTEGERMPI_INTEGER
Fortran ekvivalentMPI tip podataka
MPI Workshop @ SRCE / radionica no.1 (147 od 258)
5.2 Uvod u 5.2 Uvod u p2p p2p komunikacijukomunikaciju
� Komunikacija izmeñu samo dva procesa� Jedan šalje poruku, drugi prima poruku� Drugi oblici komunikacije : one-sided, collective
Poglavlje 5 – Point-to-point komunikacija
1
2
4
3komunikator
odredište
6
0
izvorište 5
PROCES 1 PROCES 2
send(podaci) receive(podaci)
podaci
kooperativni prijenos podataka
MPI Workshop @ SRCE / radionica no.1 (148 od 258)
5.2 Uvod u 5.2 Uvod u p2p p2p komunikacijukomunikaciju
� Osnovna svojstva:� očuvanje poretka poruka
• poredak poslanih poruka mora odgovarati poretku primljenih poruka
� nastavak rada• ako jedan proces šalje, a drugi prima poruku onda će jedan od ta
dva procesa sigurno obaviti svoju MPI operaciju• postoje dva scenarija
– odgovarajuću send operaciju će presresti neki treći proces s receive
operacijom» izvorišni proces obavlja svoju operaciju
– neki treći proces će pozvati send operaciju, a odredišni proces će presresti tu operaciju sa svojom receive operacijom
» odredišni proces obavlja svoju operaciju
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (149 od 258)
5.2 Uvod u 5.2 Uvod u p2p p2p komunikacijukomunikaciju
� Četiri načina slanja poruka� implementatorima nije strogo nametnuto koji način moraju
koristiti za pojedinu MPI funkciju
Poglavlje 5 – Point-to-point komunikacija
Završava kad se poruka primiReceive
Uvijek završava (osim ako ne doñe do neke greške), bez obzira da li je operacija primanja poruke završila
Ready send
Synchronous ili buffered modStandard send
Uvijek završava (osim ako ne doñe do neke greške), bez obzira da li je operacija primanja poruke završila
Buffered send
Završava samo onda kad završi i odgovarajuća operacija primanja porukeSynchronous send
UvjetKomunikacijski mod
MPI Workshop @ SRCE / radionica no.1 (150 od 258)
5.2 Uvod u 5.2 Uvod u p2p p2p komunikacijukomunikaciju
� Postoje dva oblika komunikacijskih operacija� blokirajući
• povratak iz poziva takve operacije podrazumijeva završetak te operacije
� neblokirajući• povratak iz poziva ovakve operacije je trenutan• stanje operacije se provjerava posebnim MPI funkcijama
� Blokirajući oblici razl. komunikacijskih modova� standard – MPI_Send()� synchronous – MPI_Ssend()� buffered – MPI_Bsend()� ready – MPI_Rsend()
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (151 od 258)
5.3 Komunikacijski mod 5.3 Komunikacijski mod –– standard sendstandard send
� Op. slanja poruke završava kad se poruka pošalje� može, ali ne mora značiti da je poruka stigla na odredište
� Pravila korištenja standard send operacije� ne smije se pretpostaviti da će se op. slanja obaviti prije nego
operacija primanja poruke započne• npr. blokirajući standard send se ne bi smio koristiti za izmjenu
poruka izmeñu dva procesa � deadlock
� ne smije se pretpostaviti da će se op. slanja završiti nakon štooperacija primanja započne
• ovaj mod može biti implementiran kao buffered ili synchronous
� procesi moraju biti eager readers
• svojstvo primanja svih poruka koje su njima poslane
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (152 od 258)
5.3 Komunikacijski mod 5.3 Komunikacijski mod –– standard sendstandard send
� Prototip standard send funkcije – C verzija
� Prototip standard send funkcije – Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
int MPI_Send(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm);
MPI_SEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, IERROR)
MPI Workshop @ SRCE / radionica no.1 (153 od 258)
5.4 Kom. mod 5.4 Kom. mod –– synchronous sendsynchronous send
� Sinkronizirano slanje i primanje poruka� Odredišni proces šalje potvrdu primitka poruke
izvorišnom procesu (handshake procedura)
� Sporiji mehanizam od standard send� Osigurana dostava poruke
� onemogućuje preopterećenje mreže
� Neblokirajuća vs. Blokirajuća� potpuni zastoj se može izbjeći korištenjem neblokirajuće op.
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (154 od 258)
5.4 Kom. mod 5.4 Kom. mod –– synchronous sendsynchronous send
� Prototip synchronous send operacije – C verzija
� Prototip synchronous send operacije – Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
int MPI_Ssend(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm);
MPI_SSEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, IERROR)
MPI Workshop @ SRCE / radionica no.1 (155 od 258)
5.5 Komunikacijski mod 5.5 Komunikacijski mod –– buffered sendbuffered send
� Koristi se buffer za spremanje poruka� Asinkroni mod
� poruka izvorišnog procesa se kopira u neki memorijski segment, a odredišni proces odatle kopira poruku u svoju memoriju
� Neblokirajuća vs. Blokirajuća� neblokirajuća operacija nema prednosti nad blokirajućom
� Mana � programer mora eksplicitno alocirati memoriju za buffer
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (156 od 258)
5.5 Komunikacijski mod 5.5 Komunikacijski mod –– buffered sendbuffered send
� Zauzimanje prostora za buffer
� C verzija
– IN buffer početna adresa buffer-a u memoriji
– IN size veličina buffer-a, u byte-ima
� Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
int MPI_Buffer_attach(void *buffer, int size);
MPI_BUFFER_ATTACH(BUFFER, SIZE, IERROR)
MPI Workshop @ SRCE / radionica no.1 (157 od 258)
5.5 Komunikacijski mod 5.5 Komunikacijski mod –– buffered sendbuffered send
� Otpuštanje prostora za buffer
� C verzija
– OUT buffer početna adresa buffer-a u memoriji
– OUT size veličina buffer-a, u byte-ima
� Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
int MPI_Buffer_detach(void *buffer, int size);
MPI_BUFFER_DETACH(BUFFER, SIZE, IERROR)
MPI Workshop @ SRCE / radionica no.1 (158 od 258)
5.5 Komunikacijski mod 5.5 Komunikacijski mod –– buffered sendbuffered send
� Što se dogodi kad se pozove detach buffer-a?� ako se izvode komunikacije koje koriste taj buffer onda će se
one svejedno izvesti do kraja
� Prototip buffered send operacije – C verzija
� Prototip buffered send operacije – Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
int MPI_Bsend(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm);
MPI_BSEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, IERROR)
MPI Workshop @ SRCE / radionica no.1 (159 od 258)
5.6 Komunikacijski mod 5.6 Komunikacijski mod –– ready sendready send
� Izvorišni proces šalje poruku nadajući se da je odredišni proces u ready (pripravnom) stanju
� Zahtjev� pripadajuća receive operacija mora biti pozvana prije send
operacije
� Što ako se ne ispoštuje zahtjev?� onda je uspješnost komunikacije upitna
� Svrha?� poboljšanje performansi izbacivanjem buffer-a i handshake
procedure
� Neblokirajuća vs. Blokirajuća� neblokirajući oblik nema prednosti nad blokirajućim oblikom
operacije
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (160 od 258)
5.6 Komunikacijski mod 5.6 Komunikacijski mod –– ready sendready send
� Ne preporučuje se korištenje ovog načina komunikacije� osim ako su nam performanse od velikog značaja
� Prototip ready send operacije – C verzija
� Prototip ready send operacije – Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
int MPI_Rsend(void *buf, int count, MPI_Datatype datatype,int dest, int tag, MPI_Comm comm);
MPI_RSEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, IERROR)
MPI Workshop @ SRCE / radionica no.1 (161 od 258)
5.7 Send5.7 Send--receivereceive
� MPI funkcija koja objedinjuje dvije operacije� slanje poruke� primanje poruke
� Pogodno za procese koji istovremeno primaju i šalju poruke
� Dva oblika funkcije� MPI_Sendrecv()
• izvršava blokirajući send poziv i receive poziv• koristi odvojene buffer-e za slanje i primanje poruka
� MPI_Sendrecv_replace()• koristi isti buffer za slanje i primanje poruke• poslana poruka se prebriše s primljenom porukom
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (162 od 258)
5.7 Send5.7 Send--receivereceive
� C verzija
– IN sendbuf početna adresa send buffer-a– IN sendcountbroj elemenata u send buffer-u– IN sendtype tip podataka koji se šalje– IN dest rank odredišnog procesa– IN sendtag tag poruke koja se šalje– OUT recvbuf početna adresa receive buffer-a– IN recvcount broj elemenata u receive buffer-u– IN recvtype tip podataka koji se prima– IN source rank izvorišnog procesa– IN recvtag tag poruke koja se prima– IN comm komunikator– OUT status status objekt
Poglavlje 5 – Point-to-point komunikacija
int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status);
MPI Workshop @ SRCE / radionica no.1 (163 od 258)
5.7 Send5.7 Send--receivereceive
� C verzija
– INOUT buf početna adresa buffer-a– IN count broj elemenata u buffer-u– IN datatype tip podataka koji se šalje/prima– IN dest rank odredišnog procesa– IN sendtag tag poruke koja se šalje– IN source rank izvorišnog procesa– IN recvtag tag poruke koja se prima– IN comm komunikator– OUT status status objekt
Poglavlje 5 – Point-to-point komunikacija
int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, int dest, int sendtag, int source, int recvtag, MPI_Comm comm, MPI_Status *status);
MPI Workshop @ SRCE / radionica no.1 (164 od 258)
5.7 Send5.7 Send--receivereceive
� Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVBUF, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, COMM, STATUS, IERROR)
MPI_SENDRECV_REPLACE(BUF, COUNT, DATATYPE, DEST, SENDTAG, SOURCE, RECVTAG, COMM, STATUS, IERROR)
MPI Workshop @ SRCE / radionica no.1 (165 od 258)
5.8 Informacije o porukama5.8 Informacije o porukama
� Svaka MPI poruka se “enkapsulira” u komunikacijsku omotnicu koja sadrži sve bitne informacije o poruci
� Korisno za procese koji primaju poruke� Informacije o primljenoj poruci se mogu dobiti iz
argumenta status
� Deklaracija varijable tipa MPI_Status
Poglavlje 5 – Point-to-point komunikacija
/* za C*/
MPI_Status status;
ccccc za Fortran
INTEGER status(MPI_STATUS_SIZE)
MPI Workshop @ SRCE / radionica no.1 (166 od 258)
5.8 Informacije o porukama5.8 Informacije o porukama
� MPI_Status je struktura koja sadrži tri polja� status.MPI_SOURCE � Fortran: status(MPI_SOURCE)
• rank procesa koji je poslao poruku
� status.MPI_TAG ���� Fortran: status(MPI_TAG) • tag poruke
� status.MPI_ERROR ���� Fortran: status(MPI_ERROR)• kôd pogreške primljene poruke
� Status argument vraća i informaciju o duljini poruke� ova informacija se ne nalazi u nekom dostupnom polju� njoj se pristupa preko posebne MPI funkcije� što nam argument count ne odaje tu informaciju?
• Ne! On predstavlja maksimalnu veličinu poruke koja se može primiti
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (167 od 258)
5.8 Informacije o porukama5.8 Informacije o porukama
� Prototip MPI funkcije za dohvat veličine primljene poruke
� C verzija
– IN status argument iz pripadajuće recv funkcije– IN datatype tip podataka elem. primljene poruke
– OUT count broj primljenih elemenata
� Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
int MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int *count);
MPI_GET_COUNT(STATUS, DATATYPE, COUNT, IERROR)
MPI Workshop @ SRCE / radionica no.1 (168 od 258)
5.8 Informacije o porukama5.8 Informacije o porukama
� Ponekad korištenje status varijable predstavlja dodatni overhead
� ako želimo izbjeći korištenje te varijable onda je dovoljno na mjestu status argumenta staviti konstantu MPI_STATUS_IGNORE
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (169 od 258)
5.9 5.9 p2pp2p aplikacija aplikacija –– mjerenje vremenamjerenje vremena
� Korištenje ugrañenih MPI funkcija za mjerenje trajanja izvoñenja pojedinih komunikacijskih modova/oblika� C verzija
– vraća broj sekundi (u dvostrukoj preciznosti) proteklih od neke fiksne točke u prošlosti
– MPI mehanizmi su obavezni osigurati konstantnost te fiksne točke tijekom “života” pojedinog procesa, ali nisu obavezni sinkronizirati tu točku meñu različitim procesima!
– vraća period povećanja vrijednosti MPI_Wtime() brojača– npr. ako MPI_Wtime() povećava brojač svake mikrosekunde onda će
MPI_Wtick() vratiti vrijednost 10-6
Poglavlje 5 – Point-to-point komunikacija
double MPI_Wtime(void);
double MPI_Wtick(void);
MPI Workshop @ SRCE / radionica no.1 (170 od 258)
5.9 5.9 p2pp2p aplikacija aplikacija –– mjerenje vremenamjerenje vremena
� Fortran verzija
Poglavlje 5 – Point-to-point komunikacija
DOUBLE PRECISION MPI_WTIME()
DOUBLE PRECISION MPI_WTICK()
MPI Workshop @ SRCE / radionica no.1 (171 od 258)
5.9 5.9 p2pp2p aplikacija aplikacija –– mjerenje vremenamjerenje vremena
Poglavlje 5 – Point-to-point komunikacija
#include <stdio.h>#include "mpi.h"#define MASTER_RANK 0#define TRUE 1#define FALSE 0#define MESSAGE_SIZE 10000#define MAX_BUF 100000
int main(int argc, char **argv){
int i, msgsiz;int my_rank, i_am_the_master = FALSE, pool_size;double start_time, finish_time, tick_time;double message[MESSAGE_SIZE];char buffer[MAX_BUF];int buffer_size = MAX_BUF;MPI_Status status;MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &pool_size);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
1/5
MPI Workshop @ SRCE / radionica no.1 (172 od 258)
5.9 5.9 p2pp2p aplikacija aplikacija –– mjerenje vremenamjerenje vremena
Poglavlje 5 – Point-to-point komunikacija
if(pool_size < 3){
printf("Pool size error...exiting!");MPI_Finalize();return 1;
}memset(message, 0, sizeof(double)*MESSAGE_SIZE);if(my_rank == MASTER_RANK){
i_am_the_master = TRUE;for(i=0; i<MESSAGE_SIZE; i++)
message[i] = 9999.9999;tick_time = MPI_Wtick();printf("Tick time = %f\n",tick_time);/* synchronized send */start_time = MPI_Wtime();MPI_Ssend(message, MESSAGE_SIZE, MPI_DOUBLE, 1, 1,
MPI_COMM_WORLD);finish_time = MPI_Wtime();printf("Time to send synchronized message of size %d is %f\n",
MESSAGE_SIZE, finish_time-start_time);
2/5
MPI Workshop @ SRCE / radionica no.1 (173 od 258)
5.9 5.9 p2pp2p aplikacija aplikacija –– mjerenje vremenamjerenje vremena
Poglavlje 5 – Point-to-point komunikacija
/* standard send */start_time = MPI_Wtime();MPI_Send(message, MESSAGE_SIZE, MPI_DOUBLE, 2, 2,
MPI_COMM_WORLD);finish_time = MPI_Wtime();printf("Time to send standard message of size %d is %f\n",
MESSAGE_SIZE, finish_time-start_time);/* buffered send */MPI_Buffer_attach(buffer,buffer_size);start_time = MPI_Wtime();MPI_Bsend(message,MESSAGE_SIZE,MPI_DOUBLE,2,2,
MPI_COMM_WORLD);finish_time = MPI_Wtime();printf("Time to send buffered message of size %d is %f\n",
MESSAGE_SIZE, finish_time-start_time);MPI_Buffer_detach(&buffer,&buffer_size);/* ready send */start_time = MPI_Wtime();MPI_Rsend(message,MESSAGE_SIZE,MPI_DOUBLE,2,2,
MPI_COMM_WORLD);
3/5
MPI Workshop @ SRCE / radionica no.1 (174 od 258)
5.9 5.9 p2pp2p aplikacija aplikacija –– mjerenje vremenamjerenje vremena
Poglavlje 5 – Point-to-point komunikacija
finish_time = MPI_Wtime();printf("Time to send ready message of size %d is %f\n", MESSAGE_SIZE, finish_time-start_time);
}else if(my_rank == 1){
MPI_Recv(message, MESSAGE_SIZE + 500, MPI_DOUBLE, MASTER_RANK, 1, MPI_COMM_WORLD, &status);
MPI_Get_count(&status, MPI_DOUBLE, &msgsiz);printf("Process with rank %d received message from rank %d with tag %d, message sizeis%d\n", my_rank,
status.MPI_SOURCE, status.MPI_TAG, msgsiz);}
else{
MPI_Recv(message, MESSAGE_SIZE, MPI_DOUBLE, MASTER_RANK, 2, MPI_COMM_WORLD, &status);
MPI_Recv(message, MESSAGE_SIZE, MPI_DOUBLE, MASTER_RANK, 2, MPI_COMM_WORLD, &status);
4/5
MPI Workshop @ SRCE / radionica no.1 (175 od 258)
5.9 5.9 p2pp2p aplikacija aplikacija –– mjerenje vremenamjerenje vremena
Poglavlje 5 – Point-to-point komunikacija
MPI_Recv(message, MESSAGE_SIZE, MPI_DOUBLE, MASTER_RANK, 2, MPI_COMM_WORLD, &status);
}
MPI_Finalize();return 0;
5/5
MPI Workshop @ SRCE / radionica no.1 (176 od 258)
5.9.1 “mjerenje vremena” 5.9.1 “mjerenje vremena” –– outputoutput
Poglavlje 5 – Point-to-point komunikacija
[sbuljat@cgi-sge example.4]$ mpicc -o PtoP PtoP.c
[sbuljat@cgi-sge example.4]$ mpiexec -n 3 ./PtoP
Tick time = 0.000001
Time to send synchronized message of size 10000 is 0.001790
Process with rank 1 received message from rank 0 with tag 1, message
size is 10000
Time to send standard message of size 10000 is 0.002131
Time to send buffered message of size 10000 is 0.000665
Time to send ready message of size 10000 is 0.000220
[sbuljat@cgi-sge example.4]$
1/1
MPI Workshop @ SRCE / radionica no.1 (177 od 258)
5.10 5.10 p2pp2p aplikacija aplikacija –– numerička integracijanumerička integracija
� Parallel Trapezoidal Rule Integration� jednostavni oblik numeričkog integriranja funkcije na odreñenom
intervalu [a, b]� funkcija mora biti nenegativna� taj odreñeni integral je površina koja je odozgo omeñena funkcijom
f(x), odozdo s x-osi, a sa strana pravcima x = a i x =b� trapezno pravilo
• podjela površine na pravilne geometrijske oblike – trapezoide• svaki trapezoid ima bazu na x-osi, vertikalne stranice, a gornja stranica
je linija koja spaja pripadajuće točke na krivulji f(x)• radi jednostavnosti odabrane su jednake duljine baza za sve trapezoide
Poglavlje 5 – Point-to-point komunikacija
MPI Workshop @ SRCE / radionica no.1 (178 od 258)
5.10 5.10 p2pp2p aplikacija aplikacija –– numerička integracijanumerička integracija
Poglavlje 5 – Point-to-point komunikacija
a b
y
x
Aproksimacija odreñenog integrala trapezoidimay
xxi-1 xi
f(x)f(xi-1)
f(xi)
h
� Ako imamo n trapezoida, baza � h = (b-a)/n� Interval i-tog trapezoida � [a + (i-1)*h, a + i*h]� Definiramo � a + i*h = xi� Duljina lijeve stranice trapezoida � f(xi-1)� Duljina desne stranice trapezoida � f(xi)
� Površina i-tog trapezoida �
� Površina svih trapezoida �
[ ])()(2
11 ii xfxfh +⋅ −
P =
+++++ − )(...)()(
2
)(
2
)(121
0
n
n xfxfxfxfxf
h
MPI Workshop @ SRCE / radionica no.1 (179 od 258)
5.10 5.10 p2pp2p aplikacija aplikacija –– numerička integracijanumerička integracija
Poglavlje 5 – Point-to-point komunikacija
#include <stdio.h>#include "mpi.h"#define MASTER_RANK 0#define TRUE 1#define FALSE 0
int main(int argc, char **argv){
int i;int i_am_the_master = FALSE, my_rank, pool_size, tag = 0;MPI_Status status;float a = 0.0; // left endpointfloat b = 1.0; // right endpointint n = 1024; // number of trapezoidsfloat h; // trapezoid base lengthfloat local_a; // left endpoint my processfloat local_b; // right endpoint my processint local_n; // number of trapezoids for my calculationfloat integral; // integral over my intervalfloat total; // total integral
1/4
MPI Workshop @ SRCE / radionica no.1 (180 od 258)
5.10 5.10 p2pp2p aplikacija aplikacija –– numerička integracijanumerička integracija
Poglavlje 5 – Point-to-point komunikacija
float Trap(float local_a, float local_b, int local_n, float h);MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &pool_size);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);if(my_rank == MASTER_RANK)
i_am_the_master = TRUE;// same for all processesh = (b-a)/n;local_n = n/pool_size;// process dependentlocal_a = a + my_rank*local_n*h;local_b = local_a + local_n*h;integral = Trap(local_a, local_b, local_n, h);if(i_am_the_master){
total = integral;for(i=1; i<pool_size; i++){
MPI_Recv(&integral,1,MPI_FLOAT, i, tag, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
2/4
MPI Workshop @ SRCE / radionica no.1 (181 od 258)
5.10 5.10 p2pp2p aplikacija aplikacija –– numerička integracijanumerička integracija
Poglavlje 5 – Point-to-point komunikacija
total += integral;}printf("With n = %d trapezoids, our estimate\n",n);printf("of the integral from %f to %f is %f\n",a,b,total);
} else{
MPI_Send(&integral, 1, MPI_FLOAT, MASTER_RANK, tag, MPI_COMM_WORLD);
}MPI_Finalize();return 0;
}float Trap(float local_a, float local_b, int local_n, float h){
float integral;float x;int i;float f(float x); // function to integrate
integral = (f(local_a) + f(local_b))/2.0;
3/4
MPI Workshop @ SRCE / radionica no.1 (182 od 258)
5.10 5.10 p2pp2p aplikacija aplikacija –– numerička integracijanumerička integracija
Poglavlje 5 – Point-to-point komunikacija
x = local_a;for(i=1; i<=local_n-1; i++){
x += h;integral += f(x);
}integral *= h;return integral;
}float f(float x){
return x*x;}
4/4
MPI Workshop @ SRCE / radionica no.1 (183 od 258)
5.10.1 “numerička integracija” 5.10.1 “numerička integracija” –– outputoutput
Poglavlje 5 – Point-to-point komunikacija
[sbuljat@cgi-sge example.5]$ mpicc -o trapezoidal trapezoidal.c
[sbuljat@cgi-sge example.5]$ mpiexec -n 4 ./trapezoidal
With n = 1024 trapezoids, our estimate
of the integral from 0.000000 to 1.000000 is 0.333333
[sbuljat@cgi-sge example.5]$
1/1
MPI Workshop @ SRCE / radionica no.1 (184 od 258)
Poglavlje 6Poglavlje 6Neblokirajuća komunikacijaNeblokirajuća komunikacija
Predavač:
Stjepan Buljat
MPI Workshop @ SRCE / radionica no.1 (185 od 258)
6.1 Uvod u neblokirajuću komunikaciju6.1 Uvod u neblokirajuću komunikaciju
� Kako poboljšati performanse paralelne aplikacije?� preklapanjem računskih operacija i komunikacijskih operacija
� Kako to postići?� višenitnost (multithreading)
� neblokirajuća komunikacija• post-send vs. complete-send• post-receive vs. complete-receive
• posebne funkcije za testiranje završetka komunikacije
� Kompatibilnost neblokirajućih i blokirajućih operacija?� poruke se mogu slati blokirajućim operacijama,a primati
neblokirajućim� vrijedi i obrnuto
Poglavlje 6 – Neblokirajuća komunikacija
MPI Workshop @ SRCE / radionica no.1 (186 od 258)
6.1 Uvod u neblokirajuću komunikaciju6.1 Uvod u neblokirajuću komunikaciju
� Identificiranje komunikacijskih operacija� koriste se request objekti
• oni povezuju podnesene operacije i završetak te operacije
� request objekte alocira MPI� nalaze se u “sistemskoj” memoriji MPI� struktura objekta je skrivena od korisnika (opaque object)
� pristupa im se preko rukovatelja (handle)
� sve MPI funkcije za testiranje stanja komunikacije koriste request objekte
� kad se handle request objekta postavi na vrijednost MPI_REQUEST_NULL onda objekt postaje neispravan
• koriste ga funkcije za dealociranje request objekata
Poglavlje 6 – Neblokirajuća komunikacija
MPI Workshop @ SRCE / radionica no.1 (187 od 258)
6.1 Uvod u neblokirajuću komunikaciju6.1 Uvod u neblokirajuću komunikaciju
• pozove se odgovarajuća funkcija za slanje poruke• izvorišni proces se odmah vraća iz tog poziva
• izvorišni proces ne smije dirati send buffer dok ga ne pročita odredišni proces � koriste se funkcije za testiranje završetka komunikacije
Poglavlje 6 – Neblokirajuća komunikacija
Neblokirajuća operacija slanja poruke
komunikator
3
1 0
4
send buffer
MESSAGE
5
receive buffer
2
MPI Workshop @ SRCE / radionica no.1 (188 od 258)
6.2 Neblokirajuće 6.2 Neblokirajuće send send funkcijefunkcije
� Imaju gotovo identične argumente kao i blokirajuće funkcije, razlika je u dodatnom argumentu� handle request objekta
� Takoñer se dijele na četiri vrste� standard� synchronous� buffered� ready
Poglavlje 6 – Neblokirajuća komunikacija
MPI Workshop @ SRCE / radionica no.1 (189 od 258)
6.2.1 Neblokirajući 6.2.1 Neblokirajući standardstandard--sendsend
� C verzija
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request);
MPI_ISEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, REQUEST, IERROR)
MPI Workshop @ SRCE / radionica no.1 (190 od 258)
6.2.2 Neblokirajući 6.2.2 Neblokirajući synchronoussynchronous--sendsend
� C verzija
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Issend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request);
MPI_ISSEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, REQUEST, IERROR)
MPI Workshop @ SRCE / radionica no.1 (191 od 258)
6.2.3 Neblokirajući 6.2.3 Neblokirajući bufferedbuffered--sendsend
� C verzija
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Ibsend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request);
MPI_IBSEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, REQUEST, IERROR)
MPI Workshop @ SRCE / radionica no.1 (192 od 258)
6.2.4 Neblokirajući 6.2.4 Neblokirajući readyready--sendsend
� C verzija
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Irsend(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request);
MPI_IRSEND(BUF, COUNT, DATATYPE, DESTINATION, TAG, COMM, REQUEST, IERROR)
MPI Workshop @ SRCE / radionica no.1 (193 od 258)
6.3 Neblokirajuća 6.3 Neblokirajuća receive receive funkcijafunkcija
� Neblokirajuća operacija primanja poruke se koristi kad želimo da odredišni proces istovremeno čeka na primanje poruke i radi nešto korisno
Poglavlje 6 – Neblokirajuća komunikacija
komunikator
3
1 0
4
send buffer5
receive buffer
MESSAGE
2
Neblokirajuća operacija primanje poruke
MPI Workshop @ SRCE / radionica no.1 (194 od 258)
6.3 Neblokirajuća 6.3 Neblokirajuća receive receive funkcijafunkcija
� C verzija
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src,int tag, MPI_Comm comm, MPI_Request *request);
MPI_IRECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, REQUEST, IERROR)
MPI Workshop @ SRCE / radionica no.1 (195 od 258)
6.4 Operacije za testiranje završetka 6.4 Operacije za testiranje završetka komunikacijekomunikacije
� Dijele se na dva dijela s obzirom na blokirajuće ili neblokirajuće svojstvo:� WAIT
• blokirajuća operacija testiranja• blokira sve dok testirana komunikacija ne završi
� TEST• neblokirajuća operacija testiranja• vraća true ili false; ovisno o statusu komunikacije
� Komunikacija se testira preko request objekta� Kad se komunikacija obavi onda ove operacije i
dealociraju request objekt
Poglavlje 6 – Neblokirajuća komunikacija
MPI Workshop @ SRCE / radionica no.1 (196 od 258)
6.4 Operacije za testiranje završetka 6.4 Operacije za testiranje završetka komunikacijekomunikacije
� MPI_Wait( ) : C verzija
– INOUT request rukovatelj request objekta– OUT status status objekt
� MPI_Wait( ) : Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Wait(MPI_Request *request, MPI_Status *status);
MPI_WAIT(REQUEST, STATUS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (197 od 258)
6.4 Operacije za testiranje završetka 6.4 Operacije za testiranje završetka komunikacijekomunikacije
� MPI_Test( ) : C verzija
– INOUT request rukovatelj request objekta– OUT flag TRUE ako je komunikacija završila
– OUT status status objekt
� MPI_Test( ) : Fortran verzija
– LOGICAL FLAG
– INTEGER REQUEST, STATUS(MPI_STATUS_SIZE), IERROR
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Test(MPI_Request *request, int *flag, MPI_Status*status);
MPI_TEST(REQUEST, FLAG, STATUS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (198 od 258)
6.4 Operacije za testiranje završetka 6.4 Operacije za testiranje završetka komunikacijekomunikacije
� Obje operacije dealociraju request objekt� kad se komunikacija obavi
• kôd MPI_Test() : kad je flag = TRUE
� postavljaju ga na vrijednost MPI_REQUEST_NULL� “ručna” dealokacija request objekta
• C verzija
– INOUT request rukovatelj request objekta
• Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Request_free(MPI_Request *request);
MPI_REQUEST_FREE(REQUEST, IERROR);
MPI Workshop @ SRCE / radionica no.1 (199 od 258)
6.4 Operacije za testiranje završetka 6.4 Operacije za testiranje završetka komunikacijekomunikacije
� Obje operacije vraćaju i informacije o komunikaciji preko status objekta
� Kako pogledati status aktivne komunikacije, a da se pritom ne dealocira request objekt?� C verzija
– IN request rukovatelj request objekta– OUT flag boolean zastavica, analogno MPI_Test– OUT status ako je flag=TRUE
� Status objektu možemo pristupiti ako je komunikacija završila, a da pritom ne dealociramo request objekt
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Request_get_status(MPI_Request *request, int *flag, MPI_Status *status);
MPI Workshop @ SRCE / radionica no.1 (200 od 258)
6.4 Operacije za testiranje završetka 6.4 Operacije za testiranje završetka komunikacijekomunikacije
� Fortran verzija
– INTEGER REQUEST, STATUS(MPI_STATUS_SIZE), IERROR– LOGICAL FLAG
Poglavlje 6 – Neblokirajuća komunikacija
MPI_REQUEST_GET_STATUS(REQUEST, FLAG, STATUS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (201 od 258)
6.4.1 Veći broj aktivnih komunikacija6.4.1 Veći broj aktivnih komunikacija
� Moguće je testirati stanje većeg broja aktivnih komunikacija preko posebnih MPI funkcija
� S obzirom na broj komunikacija koje se testiraju ove operacije se dijele na:� ALL
• testiranje završetka svih neblokirajućih komunikacija
� ANY• testiranje završetka bilo koje komunikacije, ali samo jedne
� SOME• testiranje završetka barem jedne komunikacije, ali vraća sve one
komunikacije koje su završile
Poglavlje 6 – Neblokirajuća komunikacija
MPI Workshop @ SRCE / radionica no.1 (202 od 258)
6.4.1.1 Testiranje završetka svih komunikacija6.4.1.1 Testiranje završetka svih komunikacija
� MPI_Waitall( ) : C verzija
– IN count broj aktivnih komunikacija– INOUT array_of_reqs polje rukovatelja req objekata– OUT array_of_stats polje status objektata
� MPI_Waitall( ) : Fortran verzija
– INTEGER COUNT, ARRAY_OF_REQUESTS(*)– INTEGER ARRAY_OF_STATS(MPI_STATUS_SIZE, *), IERROR
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses);
MPI_WAITALL(COUNT, ARRAY_OF_REQUESTS, ARRAY_OF_STATUSES, IERROR);
MPI Workshop @ SRCE / radionica no.1 (203 od 258)
6.4.1.1 Testiranje završetka svih komunikacija6.4.1.1 Testiranje završetka svih komunikacija
� MPI_Testall( ) : C verzija
– IN count broj aktivnih komunikacija– INOUT array_of_reqs polje rukovatelja req objekata
– OUT flag TRUE ako su svi završili
– OUT array_of_stats polje status objekata
� MPI_Testall( ) : Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses);
MPI_TESTALL(COUNT, ARRAY_OF_REQS, FLAG, ARRAY_OF_STATS);
MPI Workshop @ SRCE / radionica no.1 (204 od 258)
6.4.1.2 Testiranje završetka bilo koje 6.4.1.2 Testiranje završetka bilo koje komunikacijekomunikacije
� MPI_Waitany( ) : C verzija
– IN count broj aktivnih komunikacija– INOUT array_of_reqs polje rukovatelja req objekata
– OUT index indeks komunikacije koja je završila
– OUT status status objekt
� MPI_Waitany( ) : Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Waitany(int count, MPI_Request *array_of_requests, int *index, MPI_Status *status);
MPI_WAITANY(COUNT, ARRAY_OF_REQUESTS, INDEX, STATUS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (205 od 258)
6.4.1.2 Testiranje završetka bilo koje 6.4.1.2 Testiranje završetka bilo koje komunikacijekomunikacije
� MPI_Testany( ) : C verzija
– IN count broj aktivnih komunikacija– INOUT array_of_reqs polje rukovatelja req objekata
– OUT index indeks komunikacije koja je završila
– OUT flag TRUE ako je netko završio– OUT status status objekt
� MPI_Testany( ) : Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Testany(int count, MPI_Request *array_of_reqs, int *index, int *flag, MPI_Status *status);
MPI_TESTANY(COUNT, ARRAY_OF_REQS, INDEX, FLAG, STATUS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (206 od 258)
6.4.1.3 Testiranje završetka nekog broja 6.4.1.3 Testiranje završetka nekog broja komunikacijakomunikacija
� MPI_Waitsome( ) : C verzija
– IN incount veličina polja array_of_reqs
– INOUT array_of_reqs polje rukovatelja req objekata
– OUT outcount broj završenih komunikacija– OUT array_of_inds polje dovršenih komunikacija
– OUT array_of_stats polje status objekata
� MPI_Waitsome( ) : Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Waitsome(int incount, MPI_Request *array_of_reqs, int *outcount, int *array_of_indices, MPI_Status *array_of_stats);
MPI_WAITSOME(INCOUNT, ARRAY_OF_REQS, OUTCOUNT, ARRAY_OF_INDS, ARRAY_OF_STATS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (207 od 258)
6.4.1.3 Testiranje završetka nekog broja 6.4.1.3 Testiranje završetka nekog broja komunikacijakomunikacija
� MPI_Testsome( ) : C verzija
� MPI_Testsome( ) : Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Testsome(int incount, MPI_Request *array_of_reqs, int *outcount, int *array_of_indices, MPI_Status *array_of_stats);
MPI_TESTSOME(INCOUNT, ARRAY_OF_REQS, OUTCOUNT, ARRAY_OF_INDICES, ARRAY_OF_STATS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (208 od 258)
6.4.2 Ostale pomoćne funkcije6.4.2 Ostale pomoćne funkcije
� Probe� provjerava stanje nadolazeće poruke bez da je se primi� informacija o poruci se dobiva preko status objekta� postoje dva oblika
• neblokirajući• blokirajući
� prednost• alociranje receive buffer-a ovisno o veličini poruke
� Cancel� prekida “viseću” komunikaciju, ona koja još nije obavljena� potrebno je “ručno” dealocirati request objekt
• preko status objekta kojeg vrati dealokacija se mogu saznati informacije o prekinutoj komunikaciji
Poglavlje 6 – Neblokirajuća komunikacija
MPI Workshop @ SRCE / radionica no.1 (209 od 258)
6.4.2 Ostale pomoćne funkcije6.4.2 Ostale pomoćne funkcije
� Send-init & Receive-init (persistent communication request)� pozivanje većeg broja funkcija za slanje/primanje poruka s istom
listom argumenata� može se smanjiti komunikacijski overhead� povežu se potrebni argumenti s trajnim komunikacijskim zahtjevom i
onda je samo potrebno preko request objekta iniciratikomunikacijske pozive
� pozivi MPI_Send_init() i MPI_Recv_init() služe za inicijalizaciju trajnog komunikacijskog poziva neblokirajućih send/receive funkcija
• nakon tog poziva komunikacija je i dalje neaktivna
� aktivacija komunikacije se postiže pozivima • MPI_Start()
• MPI_Startall()
Poglavlje 6 – Neblokirajuća komunikacija
MPI Workshop @ SRCE / radionica no.1 (210 od 258)
6.4.2.1 Probe6.4.2.1 Probe
� Blokirajući oblik: C verzija
– IN source rank izvorišnog procesa– IN tag tag poruke
– IN comm komunikator
– OUT status status objekt
� Blokirajući oblik: Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *status);
MPI_PROBE(SOURCE, TAG, COMM, STATUS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (211 od 258)
6.4.2.1 Probe6.4.2.1 Probe
� Neblokirajući oblik: C verzija
– IN source rank izvorišnog procesa– IN tag tag poruke
– IN comm komunikator
– OUT flag TRUE ako je pronañena odg. poruka– OUT status status objekt
� Neblokirajući oblik: Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Iprobe(int source, int tag, MPI_Comm comm, int *flag, MPI_Status *status);
MPI_IPROBE(SRC, TAG, COMM, FLAG, STATUS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (212 od 258)
6.4.2.2 Cancel6.4.2.2 Cancel
� C verzija
– IN request rukovatelj request objekta
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Cancel(MPI_Request *request);
MPI_CANCEL(REQUEST, IERROR);
MPI Workshop @ SRCE / radionica no.1 (213 od 258)
6.4.2.2.1 Test6.4.2.2.1 Test--canceledcanceled
� C verzija
– IN status status objekt– OUT flag TRUE ako je komunikacija prekinuta
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Test_canceled(MPI_Status *status, int *flag);
MPI_TEST_CANCELED(STATUS, FLAG, IERROR);
MPI Workshop @ SRCE / radionica no.1 (214 od 258)
6.4.2.3 Send6.4.2.3 Send--init & Receiveinit & Receive--initinit
� C verzija
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Send_init(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request);
int MPI_Recv_init(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request);
MPI Workshop @ SRCE / radionica no.1 (215 od 258)
6.4.2.3 Send6.4.2.3 Send--init & Receiveinit & Receive--initinit
� Fortran verzija
Poglavlje 6 – Neblokirajuća komunikacija
MPI_SEND_INIT(BUF, COUNT, DATATYPE, DEST, TAG, COMM, REQUEST, IERROR);
MPI_RECV_INIT(BUF, COUNT, DATATYPE, SRC, TAG, COMM, REQUEST, IERROR);
MPI Workshop @ SRCE / radionica no.1 (216 od 258)
� Aktivacija komunikacije: C verzija� jedan request objekt
� polje request objekata
6.4.2.3 Send6.4.2.3 Send--init & Receiveinit & Receive--initinit
Poglavlje 6 – Neblokirajuća komunikacija
int MPI_Start(MPI_Request *request);
int MPI_Startall(int count, MPI_Request *array_of_reqs);
MPI Workshop @ SRCE / radionica no.1 (217 od 258)
� Aktivacija komunikacije: Fortran verzija� jedan request objekt
� polje request objekata
6.4.2.3 Send6.4.2.3 Send--init & Receiveinit & Receive--initinit
Poglavlje 6 – Neblokirajuća komunikacija
MPI_START(REQUEST, IERROR);
MPI_STARTALL(COUNT, ARRAY_OF_REQS, IERROR);
MPI Workshop @ SRCE / radionica no.1 (218 od 258)
…… kraj drugog dana …kraj drugog dana …
MPI Workshop @ SRCE / radionica no.1 (219 od 258)
MPI Workshop @ SRCEMPI Workshop @ SRCE
radionica no.1Uvod u Message Passing Interface
Sveučilišni računski centar, Zagreb28. lipnja – 30. lipnja, 2005.
MPI Workshop @ SRCE / radionica no.1 (220 od 258)
PonavljanjePonavljanjeMPI funkcijeMPI funkcije
Predavač:
Stjepan Buljat
MPI Workshop @ SRCE / radionica no.1 (221 od 258)
1.1 C funkcije1.1 C funkcije
Ponavljanje – MPI funkcije
int MPI_Comm_size(MPI_Comm comm, int *size)Determines the size of the group associated with a communicator
int MPI_Comm_rank(MPI_Comm comm, int *rank)Determines the rank of the calling process in the communicator
int MPI_Cancel(MPI_Request *request)Cancels a communication request
int MPI_Buffer_detach(void *buffer, int *size)Removes an existing buffer
int MPI_Buffer_attach(void *buffer, int size)Attaches a user-defined buffer for sending
int MPI_Bsend_init(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Builds a handle for a buffered send
int MPI_Bsend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm)Basic send with user-specified buffering
int MPI_Abort(MPI_Comm comm, int errorcode)Terminates MPI execution environment
MPI Workshop @ SRCE / radionica no.1 (222 od 258)
1.1 C funkcije1.1 C funkcije
Ponavljanje – MPI funkcije
int MPI_Get_count(MPI_Status *status, MPI_Datatype dtype, int *count)Gets the number of “top-level” elements
int MPI_Iprobe(int src, int tag, MPI_Comm comm, int *flag, MPI_Status *status)Nonblocking test for a message
int MPI_Initialized(int *flag)Indicates whether MPI_Init has been called
int MPI_Init(int *argc, char ***argv)Initializes the MPI execution enviroment
int MPI_Ibsend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Starts a nonblocking buffered send
int MPI_Get_version(int *version, int *subversion)Returns the version of MPI
int MPI_Get_processor_name(char *name, int *resultlen)Gets the name of the processor
int MPI_Finalize(void)Terminates MPI execution enviroment
MPI Workshop @ SRCE / radionica no.1 (223 od 258)
1.1 C funkcije1.1 C funkcije
Ponavljanje – MPI funkcije
int MPI_Irecv(void *buf, int count, MPI_Datatype dtype, int src, int tag, MPI_Comm comm, MPI_Request *request)
Begins a nonblocking receive
int MPI_Recv_init(void *buf, int count, MPI_Datatype dtype, int src, int tag, MPI_Comm comm, MPI_Request *request)
Creates a handle for receive
int MPI_Recv(void *buf, int count, MPI_Datatype dtype, int src, int tag, MPI_Comm comm, MPI_Status *status)
Basic receive
int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status *status)Blocking test for a message
int MPI_Issend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Starts a nonblocking synchronous send
int MPI_Isend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Starts a nonblocking send
int MPI_Irsend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Starts a nonblocking ready send
MPI Workshop @ SRCE / radionica no.1 (224 od 258)
1.1 C funkcije1.1 C funkcije
Ponavljanje – MPI funkcije
int MPI_Request_free(MPI_Request *request)Frees a communication request object
int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype dtype, int dest, int sendtag, int source, int recvtag, MPI_Comm comm, MPI_Status *status)
Sends and receives a message using a single buffer
int MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status)
Sends and receives a message
int MPI_Send_init(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Builds a handle for standard send
int MPI_Send(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm)Basic send
int MPI_Rsend_init(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Builds a handle for ready send
int MPI_Rsend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm)Basic ready send
MPI Workshop @ SRCE / radionica no.1 (225 od 258)
1.1 C funkcije1.1 C funkcije
Ponavljanje – MPI funkcije
int MPI_Testany(int count, MPI_Request *array_of_requests, int *index, int *flag, MPI_Status *status)
Tests for the completion of any previously initiated communication
int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses)
Tests for the completion of all previously initiated communication
int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status)Tests for the completion of a send or receive
int MPI_Startall(int count, MPI_Request *array_of_requests)Starts a collection of requests
int MPI_Start(MPI_Request *request)Initiates a communication with a persistent request handle
int MPI_Ssend_init(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm, MPI_Request *request)
Builds a handle for a synchronous send
int MPI_Ssend(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm)Basic synchronous send
MPI Workshop @ SRCE / radionica no.1 (226 od 258)
1.1 C funkcije1.1 C funkcije
Ponavljanje – MPI funkcije
double MPI_Wtime(void)Returns an elapsed time on the calling processor
double MPI_Wtick(void)Returns the resolution of MPI_Wtime
int MPI_Waitsome(int incount, MPI_Request *array_of_requests, int *outcount, int *array_of_indices, MPI_Status *array_of_statuses)
Waits for some given communications to complete
int MPI_Waitany(int count, MPI_Request *array_of_requests, int *indeks, MPI_Status *status)Waits for any specified send or receive to complete
int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses)Waits for all given communications to complete
int MPI_Wait(MPI_Request *request, MPI_Status *status)Waits for an MPI send or receive to complete
int MPI_Test_cancelled(MPI_Status *status, int *flag)Tests to see whether a request was cancelled
int MPI_Testsome(int incount, MPI_Request *array_of_requests, int *outcount, int *array_of_indices, MPI_Status *array_of_statuses)
Tests for some given communications to complete
MPI Workshop @ SRCE / radionica no.1 (227 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
MPI_Cancel(request, ierror)integer request, ierror
MPI_Buffer_detach(buffer, size, ierror)<type> buffer(*)integer size, ierror
MPI_Buffer_attach(buffer, size, ierror)<type> buffer(*)integer size, ierror
MPI_Bsend_init(buf, count, dtype, dest, tag, comm, request, ierror)<type> buffer(*)integer count, dtype, dest, tag, comm, request, ierror
MPI_Bsend(buf, count, dtype, dest, tag, comm, ierror)<type> buffer(*)integer count, dtype, dest, tag, comm, ierror
MPI_Abort(comm, errorcode, ierror)integer comm, errorcode, ierror
MPI Workshop @ SRCE / radionica no.1 (228 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
MPI_Get_processor_name(name, resultlen, ierror)character*(MPI_MAX_PROCESSOR_NAME) nameinteger resultlen, ierror
MPI_Init(ierror)integer ierror
MPI_Ibsend(buf, count, dtype, dest, tag, comm, request, ierror)<type> buf(*)integer count, dtype, dest, tag, comm, request, ierror
MPI_Get_version(version, subversion, ierror)integer version, subversion, ierror
MPI_Get_count(status, dtype, count, ierror)integer status(*), dtype, count, ierror
MPI_Finalize(ierror)integer ierror
MPI_Comm_size(comm, size, ierror)integer comm, size, ierror
MPI_Comm_rank(comm, rank, ierror)integer comm, rank, ierror
MPI Workshop @ SRCE / radionica no.1 (229 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
MPI_Issend(buf, count, dtype, dest, tag, comm, request, ierror)<type> buf(*)integer count, dtype, dest, tag, comm, request, ierror
MPI_Isend(buf, count, dtype, dest, tag, comm, request, ierror)<type> buf(*)integer count, dtype, dest, tag, comm, request, ierror
MPI_Irsend(buf, count, dtype, dest, tag, comm, request, ierror)<type> buf(*)integer count, dtype, dest, tag, comm, request, ierror
MPI_Irecv(buf, count, dtype, source, tag, comm, request, ierror)<type> buf(*)integer count, dtype, source, tag, comm, request, ierror
MPI_Iprobe(source, tag, comm, flag, status, ierror)integer source, tag, comm, status(*), ierrorlogical flag
MPI_Initialized(flag, ierror)logical flaginteger ierror
MPI Workshop @ SRCE / radionica no.1 (230 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
MPI_ Rsend(buf, count, dtype, dest, tag, comm, ierror)<type> buf(*)integer count, dtype, dest, tag, comm, ierror
MPI_Request_free(request, ierror)integer request, ierror
MPI_Recv_init(buf, count, dtype, source, tag, comm, request, ierror)<type> buf(*)integer count, dtype, source, tag, comm, request, ierror
MPI_Recv(buf, count, dtype, source, tag, comm, status, ierror)<type> buf(*)integer count, dtype, source, tag, comm, status(*), ierror
MPI_Recv(buf, count, dtype, source, tag, comm, status, ierror)<type> buf(*)integer count, dtype, source, tag, comm, status(*), ierror
MPI_Probe(source, tag, comm, status, ierror)integer source, tag, comm, status(*), ierror
MPI Workshop @ SRCE / radionica no.1 (231 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
MPI_Sendrecv_replace(buf, count, dtype, dest, sendtag, source, recvtag, comm, status, ierror)<type> buf(*) integer count, type, dest, sendtag, source, recvtag, comm, status(*), ierror
MPI_Sendrecv(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm, status, ierror)
<type> sendbuf(*), recvbuf(*)integer sendcount, sendtype, dest, sendtag, recvcount, recvtype, source, recvtag, comm, status(*),
ierror
MPI_Send_init(buf, count, dtype, dest, tag, comm, request, ierror)<type> buf(*)integer count, dytpe, dest, tag, comm, request, ierror
MPI_Send(buf, count, dtype, dest, tag, comm, ierror)<type> buf(*)integer count, dytpe, dest, tag, comm, ierror
MPI_Rsend_init(buf, count, dtype, dest, tag, comm, request, ierror)<type> buf(*)integer count, dtype, dest, tag, comm, request, ierror
MPI Workshop @ SRCE / radionica no.1 (232 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
MPI_Testall(count, array_of_requests, flag, array_of_statuses, ierror)integer count, array_of_requests(*), array_of_statuses(MPI_STATUS_SIZE,*), ierrorlogical flag
MPI_Test(request, flag, status, ierror)integer request, status(*), ierrorlogical flag
MPI_Startall(count, array_of_requests, ierror)integer count, array_of_requests(*), ierror
MPI_Start(request, ierror)integer request, ierror
MPI_Ssend_init(buf, count, dtype, dest, tag, comm, request, ierror)<type> buf(*)integer count, dytpe, dest, tag, comm, request, ierror
MPI_Ssend(buf, count, dtype, dest, tag, comm, ierror)<type> buf(*)integer count, dytpe, dest, tag, comm, ierror
MPI Workshop @ SRCE / radionica no.1 (233 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
MPI_Waitany(count, array_of_requests, index, status, ierror)integer count, array_of_requests(*), index, status(*), ierror
MPI_Waitall(count, array_of_requests, array_of_statuses, ierror)integer count, array_of_requests(*), array_of_statuses(MPI_STATUS_SIZE,*), ierror
MPI_Wait(request, status, ierror)integer request, status(*), ierror
MPI_Test_cancelled(status, flag, ierror)integer status(*), ierrorlogical flag
MPI_Testsome(incount, array_of_requests, outcount, array_of_indices, array_of_statuses, ierror)
integer incount, array_of_requests(*), outcount, array_of_indices(*), array_of_statuses(MPI_STATUS_SIZE,*), ierror
MPI_Testany(count, array_of_requests, index, flag, status, ierror)integer count, array_of_requests(*), index, status(*), ierrorlogical flag
MPI Workshop @ SRCE / radionica no.1 (234 od 258)
1.2 Fortran funkcije1.2 Fortran funkcije
Ponavljanje – MPI funkcije
double precision MPI_Wtime()
double precision MPI_Wtick()
MPI_Waitsome(incount, array_of_requests, outcount, array_of_indices, array_of_statuses, ierror)
integer incount, array_of_requests(*), outcount, array_of_indices(*), array_of_statuses(MPI_STATUS_SIZE,*), ierror
MPI Workshop @ SRCE / radionica no.1 (235 od 258)
Zadatak 1Zadatak 1Računanje broja Računanje broja ππ (pi)(pi)
MPI Workshop @ SRCE / radionica no.1 (236 od 258)
1.1 Uvod1.1 Uvod
� Jedna od metoda računanja broja π� numerička integracija integrala
� numerička integracija preko pravokutnog pravila• integracijska krivulja se aproksimira pravokutnikom u svakom podintervalu
� interval [0, 1] se dijeli na n intervala, duljine h = 1.0/n
� svaki podinterval se aproksimira konstantnom vrijednošću f(xi) u sredini podintervala xi
Zadatak 1 – Računanje broja PI
∫ =+
1
0 2 41
1 πdx
x
MPI Workshop @ SRCE / radionica no.1 (237 od 258)
1.1 Uvod1.1 Uvod
� Pravokutno (step) pravilo� jednadžba integrala
Zadatak 1 – Računanje broja PI
x4 x5x3x2x1 ba
y
x
f(x)
[ ]∫ ++++==b
axfxfxfxfxfhdxxfI )()()()()()( 54321
MPI Workshop @ SRCE / radionica no.1 (238 od 258)
1.2 Upute1.2 Upute
� master/slave model� master proces takoñer treba obavljati koristan rad
� Pseudo-kôd� master proces iz datoteke “čita” broj intervala na koje želimo
raspodijeliti interval integracione krivulje� master proces odašilje taj broj svim slave procesima� nakon što slave proces sazna broj intervala, on računa površinu
ispod funkcije za komad intervala num_interval/pool_size
� slave proces nakon izračuna šalje tu vrijednost master procesu� zbroj svih tih parcijalnih suma predstavlja aproksimaciju broja pi
Zadatak 1 – Računanje broja PI
MPI Workshop @ SRCE / radionica no.1 (239 od 258)
1.3 Rješenje1.3 Rješenje
Zadatak 1 – Računanje broja PI
#include "mpi.h"#define MASTER_RANK 0#define TRUE 1#define FALSE 0
int main(int argc, char **argv){
double PI25 = 3.141592653589793238462643;int my_rank, pool_size, i;int i_am_the_master = FALSE, num_interval;double mypi, pi, h, sum, x, a;FILE *f;
MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &pool_size);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);if(my_rank == MASTER_RANK)
i_am_the_master = TRUE;
1/3
MPI Workshop @ SRCE / radionica no.1 (240 od 258)
1.3 Rješenje1.3 Rješenje
Zadatak 1 – Računanje broja PI
if(i_am_the_master){
f = fopen("ulaz.txt","r");fscanf(f,"%d",&num_interval);fclose(f);if(num_interval == 0)
MPI_Finalize();for(i=1; i<pool_size; i++)
MPI_Send(&num_interval,1,MPI_INT,i,i,MPI_COMM_WORLD);}elseMPI_Recv(&num_interval,1,MPI_INT,MASTER_RANK,my_rank,
MPI_COMM_WORLD, MPI_STATUS_IGNORE);h = 1.0/(double)num_interval;sum = 0.0;for(i=my_rank + 1; i<=num_interval; i+=pool_size){
x = h*((double)i - 0.5);sum += 4.0/(1.0 + x*x);
}
2/3
MPI Workshop @ SRCE / radionica no.1 (241 od 258)
1.3 Rješenje1.3 Rješenje
Zadatak 1 – Računanje broja PI
mypi = h * sum;if(!i_am_the_master)MPI_Send(&mypi,1,MPI_DOUBLE,MASTER_RANK,my_rank,
MPI_COMM_WORLD);else{
pi = mypi;for(i=1; i<pool_size; i++){
MPI_Recv(&mypi, 1, MPI_DOUBLE, i, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
pi += mypi;}printf("PI je aproksimirano %.16f, greska je %.16f\n", pi, fabs(pi-PI25));
}MPI_Finalize();
}
3/3
MPI Workshop @ SRCE / radionica no.1 (242 od 258)
Zadatak 2Zadatak 2Množenje matricaMnoženje matrica
MPI Workshop @ SRCE / radionica no.1 (243 od 258)
2.1 Uvod2.1 Uvod
� Bank queue model� varijanta master/slave modela� treba imati veći broj neovisnih poslova� master proces sadrži taj red poslova
• šalje poslove slave procesima po potrebi
� svaki od slave procesa obavlja svoj dio posla, a po završetku posla rezultat šalje master procesu
• ako ima još poslova u redu poslova onda taj proces dobiva novi posao– na ovaj način se nastoji što optimalnije raspodijeliti posao meñu procesima
� problem ove metode• pravilno odrediti veličinu posla
– communication/computation ratio
Zadatak 2 – Množenje matrica
MPI Workshop @ SRCE / radionica no.1 (244 od 258)
2.1 Uvod2.1 Uvod
� Zadatak� pomnožiti (paralelno) matricu A s vektor-stupcem b� obje matrice su proizvoljne veličine� obje matrice treba inicijalizirati na neke početne veličine� master proces ne treba obavljati koristan rad
=
×
mkmkmm
k
k
c
c
c
b
b
b
aaa
aaa
aaa
......
...
............
...
...
2
1
2
1
21
22221
11211
Zadatak 2 – Množenje matrica
kjikjiji
k
l
ljil babababacij ⋅++⋅+⋅=⋅=∑=
...2211
1
MPI Workshop @ SRCE / radionica no.1 (245 od 258)
2.2 Upute2.2 Upute
� Pseudo-kôd� master proces treba inicijalizirati matricu A i vektor-stupac b na
proizvoljne vrijednosti• veličine matrica su proizvoljne
– matrice moraju biti ulančane, tj . matrica A mora imati onoliko stupaca koliko b ima redaka
� master proces svakom slave procesu šalje kopiju vektora b� master proces u red poslova stavlja retke matrice A
• počinje odašiljanje poslova slave procesima
� slave procesi vraćaju rezultat master procesu• master proces rezultat sprema u posebnu matricu• ako postoji još poslova onda šalje posao tom procesu, inače vraća
terminacijsku poruku
Zadatak 2 – Množenje matrica
MPI Workshop @ SRCE / radionica no.1 (246 od 258)
2.3 Rješenje2.3 Rješenje
Zadatak 2 – Množenje matrica
#include <stdio.h>#include <mpi.h>#define COLS 10#define ROWS 10#define TRUE 1#define FALSE 0#define MASTER_RANK 0
int main(int argc, char **argv){
int pool_size, my_rank, destination;int i_am_the_master = FALSE;int a[ROWS][COLS], b[ROWS], c[ROWS], i, j;int int_buffer[BUFSIZ];MPI_Status status;
MPI_Init(&argc, &argv);MPI_Comm_size(MPI_COMM_WORLD, &pool_size);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);if(my_rank == MASTER_RANK) i_am_the_master = TRUE;
1/5
MPI Workshop @ SRCE / radionica no.1 (247 od 258)
2.3 Rješenje2.3 Rješenje
Zadatak 2 – Množenje matrica
if(i_am_the_master) {int row, count, sender;for(i=0; i<COLS; i++) {
b[i] = 5;for(j=0; j<ROWS; j++) a[i][j] = i;
}for(i=0; i<pool_size; i++)
if(i != my_rank)MPI_Send(b,ROWS,MPI_INT,i,i,MPI_COMM_WORLD);
count = 0;for(destination=0; destination<pool_size; destination++) {
if(destination != my_rank) {for(j=0; j<COLS; j++) int_buffer[j] = a[count][j];
MPI_Send(int_buffer, COLS, MPI_INT, destination, count, MPI_COMM_WORLD);
printf("Sent row %d from %d\n",count,destination);count++;
}}
2/5
MPI Workshop @ SRCE / radionica no.1 (248 od 258)
2.3 Rješenje2.3 Rješenje
Zadatak 2 – Množenje matrica
for(i=0; i<ROWS; i++){ MPI_Recv(int_buffer, BUFSIZ, MPI_INT, MPI_ANY_SOURCE,
MPI_ANY_TAG, MPI_COMM_WORLD, &status);sender = status.MPI_SOURCE;row = status.MPI_TAG;c[row] = int_buffer[0];printf("\treceived row %d from %d\n",row,sender);if(count < ROWS) {
for(j=0; j<COLS; j++) int_buffer[j] = a[count][j];MPI_Send(int_buffer, COLS, MPI_INT, sender, count,
MPI_COMM_WORLD);printf("Sent row %d from %d\n",count,sender);count++;
}else {
MPI_Send(NULL, 0, MPI_INT, sender, ROWS, MPI_COMM_WORLD);
printf("Terminated process %d with tag %d\n", sender,ROWS);
}} }
3/5
MPI Workshop @ SRCE / radionica no.1 (249 od 258)
2.3 Rješenje2.3 Rješenje
Zadatak 2 – Množenje matrica
else // i_am_not_master{
int sum, row;MPI_Recv(b, COLS, MPI_INT, MASTER_RANK, my_rank, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(int_buffer, COLS, MPI_INT, MASTER_RANK,MPI_ANY_TAG, MPI_COMM_WORLD,&status);while(status.MPI_TAG != ROWS){
row = status.MPI_TAG;sum = 0;for (i=0; i<COLS; i++) sum += int_buffer[i]*b[i];int_buffer[0] = sum;MPI_Send(int_buffer, 1, MPI_INT, MASTER_RANK, row,
MPI_COMM_WORLD);MPI_Recv(int_buffer, COLS, MPI_INT, MASTER_RANK, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
}}
4/5
MPI Workshop @ SRCE / radionica no.1 (250 od 258)
2.3 Rješenje2.3 Rješenje
Zadatak 2 – Množenje matrica
if(i_am_the_master){
for(i=0; i<ROWS; i++)printf("\nRjesenje - %d ",c[i]);
printf("\n");}MPI_Finalize();return 0;
}
5/5
MPI Workshop @ SRCE / radionica no.1 (251 od 258)
PregledPregledObraObraññene temeene teme
MPI Workshop @ SRCE / radionica no.1 (252 od 258)
4.1 Sažetak4.1 Sažetak
� modeli paralelnih računala� paralelna programska okruženja� paradigme paralelnog programiranja� strategije razvoja paralelnih aplikacija� metodološki dizajn paralelnih algoritama� analiza performansi� prevoñenje-pokretanje MPI aplikacija� osnove MPI komunikacija� osnovne MPI primitive (skup G6)� p2p komunikacija
Pregled – Obrañene teme
MPI Workshop @ SRCE / radionica no.1 (253 od 258)
4.1 Sažetak4.1 Sažetak
� osnovni MPI tipovi podataka� komunikacijski modovi (p2p)� neblokirajuće operacije� operacije za mjerenje vremena� informacije o porukama (status objekt)
Pregled – Obrañene teme
MPI Workshop @ SRCE / radionica no.1 (254 od 258)
PregledPregledTeme sljedeće radioniceTeme sljedeće radionice
MPI Workshop @ SRCE / radionica no.1 (255 od 258)
5.1 Uvod5.1 Uvod
� Sljedeća radionica � Intermediate-Advanced MPI @ Srce� predviñeno okvirno održavanje
• na jesen 2005. godine
� uvodi naprednije mogućnosti koje MPI pruža� preporuča se upoznati s materijalima ove radionice prije nego se
krene slušati napredna radionica� nastojat će se uvesti najnovije mogućnosti MPI-2 standarda
Pregled – Teme sljedeće radionice
MPI Workshop @ SRCE / radionica no.1 (256 od 258)
5.2 Teme5.2 Teme
� kolektivna komunikacija� jednostrana komunikacija (MPI-2)� user-defined tipovi podatka� komunikatori
� intrakomunikatori� interkomunikatori
� grupe� topologije� paralelni I/O (MPI-2)� rukovanje greškama� debugging
Pregled – Teme sljedeće radionice
MPI Workshop @ SRCE / radionica no.1 (257 od 258)
5.2 Teme5.2 Teme
� MPI Profiling
� C++ binding (MPI-2)� dinamičko kreiranje procesa (MPI-2)� …
Pregled – Teme sljedeće radionice
MPI Workshop @ SRCE / radionica no.1 (258 od 258)
…… kraj …kraj …
…… hvala na dolasku hvala na dolasku ☺☺
MPI Workshop @ SRCE / radionica no.1 (259 od 258)
Neblokirajuća vs. Blokirajuća komunikacijaNeblokirajuća vs. Blokirajuća komunikacija
� Blokirajuća komunikacija� blokiraj izvršavanje procesa dok se lokalne operacije ne izvrše
• ne znači da je komunikacija obavljena� nije nužno sinkrona komunikacija
� Neblokirajuća komunikacija� nastavi izvršavanje procesa, a komunikaciju prepusti “nekom”
drugom (npr. komunikacijskom procesoru)� nije nužno asinkrona komunikacija
• nekad su se ova dva pojma koristila u jednakom smislu• uspješna blokirajuća asinkrona komunikacija brzo vraća kontrolu
programu i send buffer se može ponovno koristiti• svaki neblokirajući poziv odmah vraća kontrolu programu, ali buffer se
ne smije “dirati” sve dok se komunikacija ne obavi– to provjeravamo s posebnim funkcijama (MPI_Wait,…)
Dodatak – A
MPI Workshop @ SRCE / radionica no.1 (260 od 258)
Dodatak – A
proces 0 proces 1
MPI_Isend
MPI_Recv
vrije
me
odmah se nastavljarad procesa
neblokirajuća komunikacija
neblokirajuća
komunikacijathread ofexecution
buffering mehanizam���� kom. procesor ?
slanje poruke
proces 0 proces 1
MPI_Send
{MPI_Recv
vrije
me
zaustavi proces
blokirajuća komunikacija
slanje poruke
blokirajućakomunikacijasinkroni
ilibuffered
MPI Workshop @ SRCE / radionica no.1 (261 od 258)
Sinkrona vs. Asinkrona komunikacijaSinkrona vs. Asinkrona komunikacija
� Sinkrona komunikacija� nije nužno blokirajuća komunikacija� handshake protokol
• pošiljatelj obavješćuje primatelja da želi slati podatke• primatelj šalje pošiljaocu potvrdu primitka poruke i time mu dopušta
slanje podataka• pošiljatelj šalje podatke, tj. poruku
� osigurana dostava podataka
� Asinkrona komunikacija� nije nužno neblokirajuća komunikacija� Buffered send je oblik asinkrone komunikacije
• pošiljatelj obavijesti primatelja da će spremiti poruku u neki buffer
• pošiljatelj nastavlja s radom, smatra da je komunikacija gotova • kad je primatelj spreman onda on prebaci tu poruku u svoju memoriju
Dodatak – A
MPI Workshop @ SRCE / radionica no.1 (262 od 258)
Dodatak – A
proces 0 proces 1
MPI_Ssend
{ MPI_Recv
zahtjev za slanje
dopuštenje (ack)
slanje poruke
vrije
me
zaustaviproces
obaprocesa
nastavljaju
MPI_Ssend( ) pozvan prije MPI_Recv( )
proces 0 proces 1
MPI_Ssend
MPI_Recv
}zahtjev za slanje dopuštenje (ack) slanje poruke
vrije
me
zaustaviproces
obaprocesa
nastavljaju
MPI_Recv( ) pozvan prije MPI_Ssend( )
Blokirajućasinkrona
komunikacija
MPI Workshop @ SRCE / radionica no.1 (263 od 258)
StandardStandard--send operacijasend operacija
� Može se implementirati na dva načina� buffered send� synchronous send
� Najčešće se male poruke šalju s buffered-send, a velike poruke sa synchronous-send� tko odlučuje kad je poruka malena, a kada velika?
• implementacija• može se i ručno podešavati preko posebnih varijabli okruženja??
� za buffered-send se koristi interni buffer (sistemski)• MPI_Bsend() takoñer može koristiti taj isti interni buffer, ali nema
garancije da će komunikacija uspjeti ako nema user-specified buffer-a
Dodatak – A
MPI Workshop @ SRCE / radionica no.1 (264 od 258)
Safe programmingSafe programming
� “SAFE” program se ne oslanja na “baferiranje”� “UNSAFE” program se može oslanjati na “baferiranje”, ali
onda nije prenosiv� može se dogoditi da je na nekom drugom sustavu MPI_Send()
ostvaren kao sinkroni send � može doći do deadlock-a!
Dodatak – A
--proces 0--memorija
--proces 1--memorija
A
B
A
B
MPI_Send(A,…);MPI_Recv(B,…);
MPI_Send(A,…);MPI_Recv(B,…);zahtijeva se
buffering daop. uspije
MPI Workshop @ SRCE / radionica no.1 (265 od 258)
Safe programmingSafe programming
� MPI_Ssend() može uzrokovati potpuni zastoj
Dodatak – A
0
1
2
34
kôd u svakom procesu:
MPI_Ssend(…, right_rank,…);MPI_Recv(…, left_rank,…);
Deadlock around the ring
MPI_Ssend( ) će uzrokovatideadlock jer se MPI_Recv
ne može pozvati!
�isto bi bilo i s MPI_Send( )za velike poruke
MPI Workshop @ SRCE / radionica no.1 (266 od 258)
Safe programmingSafe programming
� Koristeći neblokirajuću komunikaciju mogu se izbjeći situacije s mogućim potpunim zastojem� da se koristila neblokirajuća komunikacija kod problema “deadlock
around the ring” onda bi nakon send operacije mogli pozvati receive operaciju i tako izbjeći potpuni zastoj
• jer neblokirajuća komunikacija odmah vraća kontrolu programu (thread
of execution)
� Oprez!• sve dok se komunikacija zapravo ne obavi ne smiju se koristiti varijble
preko kojih šaljemo poruke � inače bi mogli poslati krive podatke!
• to ne vrijedi za blokirajuću komunikaciju…
Dodatak – A
MPI Workshop @ SRCE / radionica no.1 (267 od 258)
Safe programmingSafe programming
� Neblokirajuća komunikacija nije 100% otporna na deadlock� ako koristimo neblokirajuće operacije slanja i primanja poruke, a
pozivamo MPI_Wait() tada komunikacija opet poprima blokirajući karakter…rješenje
• treba preklapati neblokirajući send sa blokirajućim receive
• ili, obrnuto
� neblokirajući pozivi su uvijek ispred blokirajućih
Dodatak – A