Parallellprogrammering med hjälp av MPI



Relevanta dokument
Strategier för att utnytja parallella system. Peter Kjellström NSC Upplysning

Objektorienterad programmering

UMEÅ UNIVERSITET 26 april 2002 Instutionen för datavetenskap. Grafproblem. Laboration 4, Datastrukturer och Algoritmer VT02

Introduktion till arv

Övningar Dag 2 En första klass

Synkronisering. Föreläsning 8

Editering, Kompilering och Exekvering av Javaprogram

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Programmeringsteknik med C och Matlab

19. Skriva ut statistik

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Att använda pekare i. C-kod

Föreläsning 6: Introduktion av listor

Föreläsning 1 & 2 INTRODUKTION

HI1025 Operativsystem, KTH Haninge, VT2012

Datorsystem Laboration 2: Minnesmappade bussar

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

Sätt att skriva ut binärträd

1 Funktioner och procedurell abstraktion

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Matematisk Modellering

Parallellprogrammering i C++ 17 EDT621 Datorarkitekturer med Operativsystem Viktor Lindgren

Brädspelet Mulan. Håkan Berggren, Magnus Ellisson, Lars Kristiansson, Cheng-Huei Kuo, Eva Ljunggren, Joakim Viker. Göteborg 1999.

Grunderna i stegkodsprogrammering

Laboration 2: Ett kommunikationssystem

Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Institutionen för datavetenskap 2014/15

Lunds Tekniska Högskola Datorarkitektur med operativsystem EITF60. Superscalar vs VLIW. Cornelia Kloth IDA2. Inlämningsdatum:

HF0010. Introduktionskurs i datateknik 1,5 hp

Tentamen i Realtidsprogrammering

Objektorienterad programmering D2

e-sense move dali Manual

Objektorienterad programmering i Java

Objektsamlingar i Java

SMD 134 Objektorienterad programmering

IP routinghierarkier. Robert Löfman Institutionen för informationsbehandling Åbo Akademi, FIN Åbo, Finland e post: robert.lofman@abo.nospam.

Ajax TruClient. Erfarenheter, tips och trix från Swedbank IT. Christian Gerdes Performance Engineer, LIGHTS IN LINE AB

5 Grundläggande in- och utmatning

FileCentral Desktop. Användarhandledning Version

Systemkonstruktion SERIEKOMMUNIKATION

Tentamen OOP

Föreläsning 2: Avlusning och antilustekniker

Uppgift 1 ( Betyg 3 uppgift )

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

TDDI02. Programmeringsprojekt. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Proaktivt forum för Elmätare. Från elmätare till energiserviceenhet, din ingång till smarta nät, en branschrekommendation

Föreläsning 2. Operativsystem och programmering

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

Agenda. Introducera det individuella projekt Multipla C-filer H-filer Introducera uppgifterna

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Digitalt lärande och programmering i klassrummet. Introduktionsworkshop - Bygg ett akvarium i Scratch

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

Programmering A. Johan Eliasson

Wkassa Handledning för administratörer

LW053 Sweex Wireless LAN USB 2.0 Adapter 54 Mbps

Webbstudieplatsen Moodle

Allt om datalogging och datakommunikation!

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Beskrivning av hur du ansluter en E-terminal från Beijer Electronics till HC900 via Ethernet så att denna kan visa och manipulera data i HC900.

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Teknikprogrammet, inriktning informations- och medieteknik

ANVÄNDARMANUAL. handdatorer i ängs- och betesmarksinventeringen. för

Operativsystem. Informationsteknologi sommarkurs 5p, Agenda. Slideset 7. Exempel på operativsystem. Operativsystem

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Handbok för nätverk. För säker och korrekt användning, läs igenom säkerhetsinformationen i "Handbok för kopiator" innan du använder maskinen.

Kundportal. Kundportal - Användarhandledning

C++ Slumptalsfunktioner + switch-satsen

Instruktioner för dig som ska söka till Mattekollo 2016

Tentamen i Introduktion till programmering

SVAR TILL TENTAMEN I DATORSYSTEM, VT2013

Nät med flera länkar. Vägval. Enklaste formen av kommunikation:

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

Bildslinga Användarguide

Trådar. Aktiva objekt

Senaste version kan hämtas från Internet i PDF 1 format

DATORER OCH PROGRAM. Datorn är en symbolmaskin

Planering Programmering grundkurs HI1024 HT TIDAA

Typkonvertering. Java versus C

Optimering. Optimering av transportproblem. Linköpings universitet SL. Campusveckan VT2013

DATORER OCH PROGRAM. Programmerade maskiner Program beteendeplan och beteendegenerator Generalitet och portabilitet Datorn är en symbolmaskin

Åtkomst och användarhandledning

Tentamen i Programmering grundkurs och Programmering C

Planering av egen cup - Steg 4: Under cupdagarna

QlikView - Lathund för Flödesmodellen bas

Grundläggande programmering med C# 7,5 högskolepoäng

Testning. 1. Inledning

Allmänt om Modbus. Modbus

============================================================================

ANVÄNDARMANUAL. handdatorer i ängs- och betesmarksinventeringen. för

CAN ett kommunikationsprotokoll för realtidssystem MOP 12/13 1

VHDL och laborationer i digitalteknik

Projektrapport EDA095

Tentamen den 18 mars svar Datorteknik, EIT070

Transkript:

Parallellprogrammering med hjälp av MPI Anders Gustafsson Institutionen för informationsbehandling Åbo Akademi, FIN-20520 Åbo, Finland e-post: agustafs@abo.fi URL: http://www.abo.fi/~agustafs Abstrakt Denna text utreder grunderna i parallellprogrammering och orsakerna till att parallellprogrammering i vissa situationer är nödvändig. I texten genomgås bakgrunden till Message Passing Interface (MPI) och de funktioner som en programmerare kan behöva. Dessutom genomgås källkoden i några exempel och visas hur denna källkod kompileras i praktiken. I texten genomgås också några exempel på datormiljöer där MPI används. I texten gås inte igenom installation eller konfigurering av någon MPI implementation. Klassificering ACM-klass: D.1.3 Concurrent Programming ACM SIG: SIGSIM Kort om multiprocessorsystem En vanlig fråga som man ofta stöter på då man diskuterar om parallellprogrammering är "Till vad behövs parallellism då vi redan har så kraftiga processorer." Men sanningen är att det existerar ett stort antal problem som kräver parallellism för att lösas inom en rimlig tid. Detta beror på att den mängd data och det antal beräkningar som behövs är så stora. Ta som exempel det klassiska problemet med att göra en väderleksrapport. En väderleksrapport görs genom att det aktuella området delas upp i ett nät av ett lämpligt antal kuber och beräkningar görs i nätets varje nod. Vi vill göra en två-dygns väderprognos av det europeiska vädret. Området är ca 10 miljoner kvadratkilometer stort och den övre höjden är 20 km. Då behövs det: 1,0 10 7 km 2 20km 10 3 kuber per km 3 = 2 10 11 noder. Det behövs ca. 100 beräkningar per nod, d.v.s. 2 10 13 beräkningar. Beräkningarna ska göras en gång i timmen under 48 timmars tid: 2 10 13 beräkningar 48 timmar = 9,6 10 14 totala beräkningar. Om vår datamaskin skulle kunna utföra 10 9 beräkningar per sekund så skulle det ta över 11 dygn att beräkna två-dygns prognosen. Om maskinen däremot klarar av 10 10 beräkningar per sekund blir vi klara efter ca. ett dygn. [1] De vanligaste användningsområdena för parallella datamaskiner är olika typer av simuleringar och numerisk modellering som t.ex. simuleringar av väder, molekyler, atomer, design av bilar och flygplan m.m. Det som eftersträvas av parallella maskiner är att n maskiner utför samma uppgift n gånger snabbare än en data maskin, men detta går aldrig att uppnå i praktiken eftersom en del av maskinens kapacitet går åt att dela upp problemet i mindre bitar.

Det existerar ett antal olika typer av parallella datamaskiner som t.ex. Delade minnes system (Shared memory systems), Meddelande överförings system (MÖS) (Message-passing multicomputers) och Distribuerade delade minnes system (DDMS) (Distributed shared memory systems). Men i denna text kommer vi att koncentrera oss på meddelande överförings system En delad minnes system maskin är en konventionell datamaskin med flera processorer av vilka alla processorer kan accessera allt minne gemensamt. En övre gräns för antalet processorer i den här typens maskin med PChårdvara ligger kring 8. En meddelande överförings datamaskin består av ett antal skilda datorer, med antingen en eller flera processorer, kopplade ihop med varandra genom ett datanät. En maskin av den här typen är mycket nära besläktad med ett datorkluster, skillnaden mellan dessa är egentligen bara avståndet mellan noderna och typen av nätverket. Distribuerade delade minnes system liknar mycket meddelande överförings maskiner, den största skillnaden är att DDMS har en delad minnesrymd. Minne Minne En datamaskin Nätverk (SAN) Processor Vanlig datamaskin med en processor. Processorer En multiprocessordatamaskin. Nätverk (LAN) Processor Nätverk (LAN) Processor En datamaskin Delad minnes rymd Minne Meddelande överförnings datamaskin Delat minnes multiprosessor datamaskin Figur 1. Fyra olika datamaskin typer. [7]

Datamaskiner kan också klassificeras enligt Flynn:s (1966) klassificerings system. Här kan maskinerna delas in i singel instruktions - flöde singel data flöde (SISD)(single instruction stream - single data stream) och multipel instruktions flöde - multipel data flöde (MIMD) (multiple instruction - stream multiple data stream). Till SISD klassen hör datamaskiner med en processor och till MIMD klassen både MÖS och DDMS. MIMD klassen kan ännu delas i multipel program multipel data (MPMD) och singel program multipel data (SPMD) system. I MPMD system kör herren och slaven olika program, medan i SPMD kör båda två samma program. Det går att programmera både MPMD och SPMD med MPI, men denna text koncentrerar sig på SPMD typen [7]. Superdatamaskiner, klusters och grids I Finland finns de kraftigaste datamaskinerna hos CSC - Tieteellinen laskenta Oy i Esbo. Deras snabbaste datamaskin, en IBM eserver Cluster 1600 som ligger på 91 platsen bland med de 500 snabbaste datamaskinerna i värden, kan bl.a. programmeras med MPI.[9][10] Trenden inom superdatorvärden i dag ligger i att bygga klusters d.v.s länka vanliga persondatorer ihop till multiprocessormaskiner. Dessa maskiner brukar ofta använda Linux som operativsystem eftersom det är mycket passligt för klusterbruk. Klusters kan man nuförtiden finna på de flesta universitet t.ex vid Åbo Akademi existerar det flera stycken. Det sker också forskning kring s.k. Grids (gitter) och grid computing. Grids är egentligen klusters som kopplats ihop via internet. Dessa grids kan täcka en stad, ett land eller hela jorden. Flera europeiska länder experimenterar med grids, bl.a. Finland. Finland är dessutom med i NorduGrid som är ett grid som täcker de nordiska länderna. Nätverk För att kunna överföra data mellan olika noder i klustret behövs ett effektivt datanätverk. Det existerar ett antal olika alternativ som t.ex. Gigabit Ethernet, Myrinet, HiPPI, FDDI och Fiber Channel. Vid valet av nätverk måste bl.a. följande aspekter beaktas: effektivitet, egenskaper och kostnad. Det existerar en rad olika nätverkstopologier. Nätverken kan antingen vara linjära räckor (bus), ringformade, nätformade, torusformade, fullständigt kopplat, hyperkuber m.m. Den effektivaste topologin är beroende av problemets karaktär, men vissa topologier går att inbädda i andra topologier. En räcka kan tillexempel inbäddas i en ring och denna kan i sin tur inbäddas i en torus. Räcka Ring Fullständigt kopplat nät

Binärt träd Stjärna Hyperkub 2-D nät 2-D torus Systolisk räcka Figur 2. Exempel på nät-topologier. [6] Det existerar olika sätt att mäta nätverkets effektivitet t.ex med bandbredd (bandwidth), nätverkets latens (network latency) och kommunikationslatens (communication latency). Bandbredden kan definieras som det maximala antalet bitar som kan överföras per tidsenthet t.ex 100 Mbps (100 miljoner bitar per sekund). Med nätverkets latens avses den tid det tar för meddelandet att passera genom det fysiska datanätet oberoende av trafikmängden. Kommunikationslatens är den totala tiden det tar att överföra ett meddelande från en nod till en annan. Med räknas tiden för att passera mjukvara, nätkablar, routning och övrig trafik på nätet. [6] Vad är MPI Message Passing Interface (MPI) är ett bibliotek som innehåller underprogram för kommunikation mellan olika noder i den parallella maskinen. MPI ger ett enkelt gränssnitt för att skicka meddelanden mellan olika noder utan att programmeraren behöver bry sig om datanätets egenskaper, topologi etc. Dessa gränssnittsfunktioner kan anropas från C, C++ eller Fortran. Program som utnyttjar MPI rutiner måste länkas med MPI bibliotek och köras i en MPI omgivning. Det som skiljer MPI från andra motsvarande system är dess portabilitet. Ett program skriven på en vanlig person dator (PC) kan utan att modifieras kompileras och köras på en superdator. Då kan en programmerare sitta vid en vanlig arbetsstation och programmera och testa programmet. När programmet är färdigt kan det köras på en maskin med tillräckliga resurser. Detta sparar både pengar och datorresurser. Dessutom har MPI gett en möjlighet att av billig PC-hårdvara bygga datorkluster som kan konkurrera med de stora datortillverkarnas superdatorer. Till exempel kan redan existerande datorklassers räknekapacitet användas nattetid till beräkningar. Litet historia De första parallella maskinerna tillverkades på mitten av 1960-talet i skuggan av kalla kriget. Initiativet togs av Atomic Energy Comission som önskade att datortillverkare skulle

utveckla en ny maskintyp med hög beräkningskapacitet och lågt pris. Till slutet av 1960-talet hade ett antal företag konstruerat parallella datamaskiner vars prestanda var enorm jämfört med den tidens maskiner. I början av 1980-talet experimenterade forskare vid California Institute of Technology (Caltech) med hyperkub multiprocessor maskiner och skrev också den första mjukvaran till dessa maskiner. Därmed var den första MÖS född. Många av dagens MÖS baserar sig direkt på det arbete som gjordes på Caltech och många andra har blivit påverkade av deras arbete. [2] Ett stort problem var att det saknades standarder, vilket ledde till att program skrivna för en maskin fungerade bara på den maskinen. Det försvårade programmerarnas arbete eftersom de måste programmera vid den maskin som ska köra programmet. [2] År 1992 samlades en grupp på ca 60 människor från 40 olika organisationer och kallade sig själva för The Message Passing Interface Forum (MPIF). Denna grupp bestod av bl.a. representanter för datortillverkare, universitet och forskningslaboratorier. Deras uppgift blev att utarbeta ett portabelt standardiserat gränssnitt för att skriva program för MÖS. I november 1993 var MPI-1-standarden klar och efter några korrigeringar publicerades MPI1.1. Den nyaste standarden är 2.0. [3] Det existerar flera implementationer av MPI, både kommersiella och gratis versioner. En av dessa gratis implementationer av MPI är MPICH (http://wwwunix.mcs.anl.gov/mpi/mpich/). Exempelprogrammet i denna text är kompilerad med denna kompilator. Grundläggande kommunikation MPI innehåller ett stort antal funktioner för olika typer av kommunikation. Dessa funktioner kan delas upp i två huvudkategorier blockerande (blocking) och icke blockerande (nonblocking). Blockerande kommunikation innebär att programmet väntar tills kommunikationen skett och icke-blockerande innebär att programmet fortsätter att exekvera medan kommunikationen pågår. Dessutom kan ett meddelande vara buffrat, vilket betyder att en kopia av meddelandet sparas i minne ifall mottagaren inte genast kan ta emot meddelandet. Då kan sändaren fortsätta att exekvera och mottagaren kan ta emot meddelandet då den har tid. Förutom kommunikation mellan två parter innehåller MPI också kollektiv kommunikation d.v.s. metoder för sända meddelanden till en grupp/ alla processer. Man kan nu fråga sig ifall det är någon skillnad vilken typ av kommunikation man väljer, men sanningen är att det är mycket viktigt ur prestandasynvinkel. Om man t.ex. använder blockerande kommunikation så kan ingen data gå förlorad men programmets effektivitet kan försämras avsevärt. Detta är möjligt ifall olika processer har olika tunga beräkningar att utföra. De flesta MPI metoder tar en kommunikator som parameter. Denna kommunikator definierar en grupp av processer. Det finns en global kommunikator som innehåller alla processer, nämligen MPI_COMM_WORLD.

MPI Primtitve Blockerande Ickeblockerande Standard Send MPI_Send MPI_Isend Synchroniserad Send MPI_Ssend MPI_Issend Buffrad Send MPI_Bsend MPI_Ibsend Färdig Send MPI_Rsend MPI_Irsend Receive MPI_Recv MPI_Irecv Slutförds prov MPI_Wait MPI_Test Tabell 1 Olika Send / Receive operationer i MPI. [6] Den vanligaste metoden som används för att sända ett meddelande är den blockerande send metoden: int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm ) där buf Adressen till sänd buffern count Antalet element i buffern datatype MPI datatypen för elementen dest Mottagarens adress, som är ekvivalent med rang (rank) värdet (ett heltal) tag En lapp m.h.a. en mottagare kan ignorera vissa meddelanden (ett heltal) comm Kommunikatorn (ofta MPI_COMM_WORLD) Det heltal som MPI_Send returnerar indikerar ifall operationen lyckades eller inte, om operationen misslyckades innehåller talet information om vad som gick fel. För att ta emot meddelanden kan t.ex en blockerand MPI_Recv användas: int MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status ) buf Adressen till mottagnings buffern count Antalet element i buffern (ett heltal) datatype MPI datatypen för elementen source sändarens adress, som är ekvivalent med rank värdet (ett heltal) tag En lapp m.h.a. en mottagare kan ignorera vissa meddelanden (ett heltal) comm Kommunikatorn (ofta MPI_COMM_WORLD) status Status objekt Heltalet som returneras fungerar på samma sätt som vid MPI_Send. [8] Kollektiv kommunikation I många fall är det önskvärt att en process skulle kunna sända data till ett större antal eller alla processer detta kallas för kollektiv kommunikation. Figur 3 visar idén bakom olika typer av kollektiv kommunikation. MPI ger möjlighet till en mycket flexibel kollektiv kommunikation och tabell 2 innehåller olika MPI metoder som kan utnyttjas.

X X X X X X X X X X Broadcast Multicast abcdef d abcdef d a b c e f a b c e f Scatter Gather Reduce Figur 3 Olika typer av kollektiv kommunikation. (fritt efter föreläsnings folierna i Parallel Programming 2002 Mats Aspnäs) Typ Metod Funktionalitet MPI_Bcast En till alla, identiska meddelanden MPI_Gather Alla till en, personaliserade meddelanden MPI_Gatherv Generalisering av MPI_Gather MPI_Allgather Generalisering av MPI_Gather Dataflyttning MPI_Allgatherv Generalisering av MPI_Allgather MPI_Scatter En till alla, personaliserade meddelanden MPI_Scatterv Generalisering av MPI_Scatter MPI_Alltoall Alla till Alla, personaliserade meddelanden MPI_Alltoallv Generalisering av MPI_Alltoall MPI_Reduce Alla till en reducering Aggregation MPI_Allreduce Generalisering av MPI_Reduce MPI_Reduce_scatter Generalisering av MPI_Reduce MPI_Scan Alla till alla parallell prefixoperation

Typ Metod Funktionalitet Synkronisering MPI_Barrier Barriär synkronisering Tabell 2 Metoder för kollektiv kommunikation i MPI. [6] MPI_Barrier är en metod som också räknas med till den kollektiva kommunikationen. Vid anrop av metoden blockerar processen och blir att vänta tills alla andra processer som tillhör kommunikatorn som angivits också nått anropet. Sedan fortsätter exekveringen normalt. MPI_Barrier kan användas till att synkronisera ett antal processer.[1] Det är vissa detaljer som måste beaktas vid kollektiv kommunikation. Alla processer tillhörande den aktuella kommunikatorn måste delta, d.v.s utföra anropet. Resultatet av att alla inte deltar i kommunikationen är odefinierad vilket betyder att vad som helst kan hända. Både värdet på variabeln count och datatypen måste vara samma hos alla processer vid kollektiv kommunikation. Då MPI_Bcast används kommer sändaren att skicka meddelandet till alla processer inkluderat sig själv d.v.s sändaren måste också ta emot meddelandet. Ett enkelt programexempel I detta kapitel presenteras ett komplett MPI program, skrivet i C, som genomgås rad för rad. Ett komplett fungerande MPI program kan skrivas med enbart sex MPI metoder. Programmet exekverar på två maskiner, herre (master) och slav (slave). Herren skickar två tal till slaven som adderar dessa två och därefter skickar resultatet tillbaka till herren. Programmet kompileras med kommandot mpicc -o simple simple.c och körs med kommandot mpirun -np 2 simple. Vid kompileringen tar mpicc emot vissa parametrar medan de övriga angivna parametrarna skickas vidare till c kompilatorn. Detta innebär att alla parametrar som c kompilatorn stöder kan användas t.ex parametrar för optimering (-O3). Då programmet startas för exekvering används shellskriptet mpirun. Detta skript är till för att gömma den process som krävs för att starta ett parallellt program. Skriptet tar som parameter bl.a antalet processorer (-np 2) som skall användas vid körningen, i detta fall alltså två.[8] Processorerna väljes ut i tur och ordning om inget annat specificeras. Vill man själv bestämma exakt på vilka maskiner och processorer programmet ska exekvera på kanman utnyttja -machine parametern i mpirun. Denna parameter anger en fil som innehåller namnen på de maskiner och antal processorer per maskin som ska användas. 1 #include <stdio.h> 2 #include "mpi.h" 3 4 int main(int argc, char* argv[]) { 5 int x, y, z, np, me; 6 int tag = 42; 7 8 MPI_Status status; 9 MPI_Init(&argc, &argv); 10 MPI_Comm_size(MPI_COMM_WORLD, &np); 11 MPI_Comm_rank(MPI_COMM_WORLD, &me); 12 13 14 if (np!= 2) { 15 if (me == 0) {

16 printf("you have to use exactly 2 processors to run this program\n"); 17 } 18 MPI_Finalize(); 19 exit(0); 20 } 21 22 if (me == 0) { 23 int length, source_id ; 24 x=6,y=7; 25 26 printf("\n This is a simple MPI test program\n"); 27 printf("starting to send data..."); 28 29 MPI_Send (&x, 1, MPI_INT, 1, tag, MPI_COMM_WORLD); 30 MPI_Send (&y, 1, MPI_INT, 1, tag, MPI_COMM_WORLD); 31 32 MPI_Recv (&z, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &status); 33 printf("ok\n"); 34 35 printf("\nwe sent a %d and a %d to be added and the resault we recieved was: %d\n", x, y,z); 36 37 } 38 else { /* me == 1 */ 39 40 MPI_Recv (&x, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); 41 MPI_Recv (&y, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status); 42 z=x+y; 43 MPI_Send (&z, 1, MPI_INT, 0, tag, MPI_COMM_WORLD); 44 45 } 46 47 48 MPI_Finalize(); 49 return 0; 50 } På rad 2 inkluderas header-filen för MPI nämligen mpi.h. Rad 8-11: MPI_Init initialiserar MPI omgivningen och tar bl.a. hand om eventuella parametrar till programmet ifall användaren har gett några. Detta anrop måste vara det första MPI anropet som görs, Dessutom får det göras endast en gång. Metoden MPI_Comm_size returnerar antalet noder som deltar. MPI_Rank returnerar den rank som processen har fått d.v.s rot noden har ranken 0 och de övriga noderna har värden upp till np-1. Båda metoderna tar två parametrar nämligen en kommunikator och en adress för ett heltal dit resultatet lagras. Rad 14-15: Ifall antalet processorer inte är två, så kan inte programmet fortsätta eftersom det är designat för att köras på två processorer. Ett sådant problem kan uppstå ifall np parametern har vid starten haft något annat värde än två. Den andra if-satsen har att göra med I/O vilket behandlas senare i texten. Rad 18 och 48: MPI_Finalize anropas då programmet ska avsluta. Efter detta anrop får inga andra MPI anrop mera göras inte ens MPI_Init. Rad 22: If-satsen på denna rad testar ifall den aktuella processen är roten (herren) d.v.s me=0. Den kod som ligger inom den aktuella if-satsen kommer endast att exekveras av roten. Detta är den ena grundprincipen med MPI d.v.s att samma program körs på alla noder men olika noder exekverar olika delar av programmet. Kodblocket efter else satsen på rad 38 exekveras på de övriga processorerna (slavarna), i detta fall på den andra processorn. Rad 29-30: Här anropas en blockerande MPI_Send för att skicka data till den andra

processen. Process 0, som är den som sender kommer att stanna vid denna rad ända tills mottagar processen har mottagit meddelandet. Rad 32-37: Efter att herren har sent datat så blir den och vänta på resultat från slaven m.h.a. MPI_Recv. När resultatet anlänt så fortsätter programmet med utskrift av resultatet. Rad 38: Det kodblock som kommer efter else satsen exekveras alltså på process 1 dvs. slaven. Först mottar slaven det data som herren skickar på rad 29 och 30. Efter det utförs en beräkning på rad 42 och sedan skickas resultatet till herren (rad 43) som sköter om utskriften. Rad 48-50 exekveras åter på både herren och slaven. På dessa rader avslutas programmet. [4][8] Datatyper i MPI I programkod exemplet ovan användes en intern MPI datatyp nämligen MPI_INT. Orsaken till att MPI har egna datatyper är att de dator klustret inte behöver vara homogent, tvärtom, klustret kan bestå av datorer av helt olika typ med olika processorer, ordlängder etc. MPI innehåller ett antal olika färdigt definierade datatyper och dessutom kan egna datatyper göras. MPI_BYTE MPI_CHAR MPI_DOUBLE MPI_FLOAT MPI_INT MPI_LONG MPI_LONG_DOUBLE MPI_PACKED MPI_SHORT MPI_UNSIGNED_CHAR MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_UNSIGNED_SHORT Tabell 3 Färdigt definierade datatyper i MPI. Ur prestandasynvinkel lönar det sig att i stället för flera meddelanden sända ett större meddelande med en större mängd data. Ur algortimens synvinkel är detta inte alltid möjligt men MPI innehåller tre olika sätt på vilket data kan grupperas ihop. Dessa är parametern count, härledda datatyper och MPI_Pack/MPI_Unpack. Det som måste observeras är att en C struktur (struct) inte kan skickas med MPI metoder. Count parametern är lättast att använda men men den kan endast datatyper av samma slag skickas. Denna parameter använd främst då man vill skicka räckor.[1] I/O med MPI Då man programmerar sekvensiella program är det sällan några problem med I/O, dvs. i det här fallet kommunikation med användaren. Men då det handlar om ett och samma program som exekverar på ett antal olika maskiner är det inte självklart vad som händer vid t.ex utskrift till skärmen. Vissa system stöder kommunikation till och från alla processer medan andra gör det inte. Det säkraste sättet att kommunicera med användaren är att göra det via process 0 och sedan sända data till och från andra processer med send och recv. Felsökning Då man implementerar en algoritm för att lösa ett problem är det lättare att först skriva en

linjär (serial) version av programmet och sedan ändra om den till en parallell version. Då undviker man att man har buggar i både algoritmen och koden för uppdelning och kommunikation. Denna teknik fungerar inte för alla problem men den kan anses vara en bra tumregel. De vanligaste felet som hittas i program skrivna med MPI är baklåsning (deadlock) som beror på att alla send inte har en matchande recv. Ett annat vanligt misstag är att en process sänder meddelande till fel process, och den riktiga mottagaren blir och vänta i all oändlighet. [1] En viktig detalj som man måste minnas är att MPI program kan bete sig ickedeterministiskt. Det finns inga garantier för hur länge det tar för ett meddelande att nå fram och om denna aspekt inte beaktas kan programmets resultat vara felaktigt. Skillnader mellan olika mjukvaru/hårdvaru system kan också leda till problem. Ett program som fungerat korrekt på en plattform kan krascha på en annan plattform. [1] MPE Tillsammans med MPI går det att använda MPE (Multi-Processing Environment) som är ett tillägsbibliotek. Detta bibliotek innehåller bl.a. Parallell X grafik Loggning Sekventiell exekvering av kodavsnitt Felhantering Den mest använda delen av MPE är X grafiken som går att t.ex använda till grafiska simuleringar. Det går mycket lätt att öppna ett fönster och rita och skriva text in i det. Dessutom stöds en viss interaktivitet med användaren via musen. Det går bl.a. att lyssna på mus drag och klickar. Men något mera avancerat som knappar och menyer stöds inte. Till skillnad från textbaserad I/O i MPI är MPE grafiken helt parallell.[12] MPI-2 Innehållet i denna text har behandlat version 1 av MPI d.v.s. MPI-1. År 1997 introducerade MPI-forumet en ny standard MPI-2 där de största nyheterna är dynamiska processer och ensidig kommunikation. Speciellt dynamiska processer är mycket användbara eftersom det ökar möjligheterna för att balansera belastningen (load balancing) på noderna. Detta kan göras genom att öka och minska antalet processorer under körningen. Detta bidrar också till bättre feltolerans (fault tolerance) d.v.s. processen som exekverar på en nod som strejkar kan flyttas över till en ny fungerande nod. [6] Källförteckning [1] Pacheco Peter S: Parallel programming with MPI, Morgan Kaufman Publishers,Inc, 1997 [2] Wilson Gregory V: Practical parallel programming, The MIT Press, 1995 [3] A High-Performance, Portable Implementation of the MPI Message Passing Interface Standard ftp://ftp.mcs.anl.gov/pub/mpi/mpich/papers/mpicharticle.ps

[4] MPI: A Message-Passing Interface Standard http://www.mpi-forum.org/docs/mpi-11.ps [5] MPI-2: Extensions to the Message-Passing Interface http://www.mpi-forum.org/docs/mpi-20.ps [6] K. Hwang, Z. Xu: Scalable Parallel Computing, WCB/McGraw-Hill, 1998 [7] B. Wilkinson, M. Allen: Parallel Programming: Techniques and Applications Using Networked Workststions and Parallel Computers, Prentice-Hall Inc, 1999 [8] MPICH manual sidor, http://www-unix.mcs.anl.gov/mpi/mpich/docs.html [9] www.csc.fi [10] www.top500.org [11] W. Gropp, E. Karrels, E. Lusk: MPE Graphics--Scalable X11 Graphics in MPI, http://www-fp.mcs.anl.gov/~lusk/papers/mpe/paper.html [12] W. Gropp, E. Lusk, N. Doss A. Skjellum: A High-Performance, Portable Implementation of the MPI Message Passing Interface Standard, http://wwwunix.mcs.anl.gov/mpi/mpich/papers/mpicharticle/paper.html