INF2440 Uke 10, v2014 : Arne Maus OMS, Inst. for informatikk

Like dokumenter
INF2440 Uke 10, v2015 : Arne Maus PSE, Inst. for informatikk

INF2440 Uke 10, v2016 : Arne Maus PSE, Inst. for informatikk

INF2440 Uke 10, v2017 : Arne Maus PSE, Inst. for informatikk

INF2440 Uke 10, v2018 : Arne Maus PSE, Inst. for informatikk

Java PRP brukermanual

INF2440 Uke 9, v2014 : Arne Maus OMS, Inst. for informatikk

INF2440 Uke 8, v2017. Arne Maus PSE, Inst. for informatikk

INF2440 Uke 9, v2015 : Arne Maus PSE, Inst. for informatikk

INF NOV PARALLELL SORTERING. Arne Maus, PSE, Ifi

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

INF2440 Uke 13, v2015. Arne Maus PSE, Inst. for informatikk

INF2440 Uke 13, v2014. Arne Maus OMS, Inst. for informatikk

INF2440 Eksamen 2016 løsningsforslag. Arne Maus, PSE ifi, UiO

INF2440 Prøveeksamen, løsningsforslag, 20 mai Arne Maus PSE, Inst. for informatikk

UNIVERSITETET I OSLO

INF2440 Uke 11, v2014 om parallell debugging og Goldbachs problem, om Oblig 3. Arne Maus OMS, Inst. for informatikk

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Prøveeksamen INF2440 v Arne Maus PSE, Inst. for informatikk

UNIVERSITETET I OSLO

INF2440 Uke 12, v2014. Arne Maus OMS, Inst. for informatikk

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

UNIVERSITETET I OSLO

Arne Maus OMS, Inst. for informatikk

Fig1. Den konvekse innhyllinga av 100 tilfeldige punkter i planet (de samme som nyttes i oppgaven.)

INF2440 Uke 4, våren2014 Avsluttende om matrisemultiplikasjon og The Java Memory Model + bedre forklaring Radix. Arne Maus OMS, Inst.

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

INF3030, Uke 3, våren 2019 Regler for parallelle programmer, mer om cache og Matrise-multiplikasjon. Arne Maus / Eric Jul PSE, Inst.

INF2440 Uke 7, våren2015. Arne Maus PSE, Inst. for informatikk

Sortering med tråder - Quicksort

Løsnings forslag i java In115, Våren 1999

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Fra Python til Java, del 2

UNIVERSITETET I OSLO

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF2440 Uke 13, v2017. Arne Maus PSE, Inst. for informatikk

INF2440, Uke 3, våren2015 Regler for parallelle programmer, mer om cache og Radix-algoritmen. Arne Maus OMS, Inst. for informatikk

INF1000 : Forelesning 4

INF2440 Uke 7, våren2017. Arne Maus PSE, Inst. for informatikk

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

Innhold. Forord Det første programmet Variabler, tilordninger og uttrykk Innlesing og utskrift...49

Kap 19. Mer om parallelle programmer i Java og Kvikksort

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

UNIVERSITETET I OSLO

Rekursjon. Binærsøk. Hanois tårn.

Algoritmer og datastrukturer Løsningsforslag

INF2440 Uke 13, v2016. Arne Maus PSE, Inst. for informatikk

INF2440 Uke 11, v2017 om Goldbachs problem og Oblig 2,3. Arne Maus PSE, Inst. for informatikk

Løsnings forslag i java In115, Våren 1996

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Inf 1000 høst 2005 Løsningsforslag ordinær eksamen

INF2440 Uke 8, v2015 : Om Oblig 3, Ulike Threadpools, JIT-kompilering. Arne Maus PSE, Inst. for informatikk

UNIVERSITETET I OSLO

Binære trær: Noen algoritmer og anvendelser

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Algoritmer og datastrukturer Løsningsforslag

INF1010 Binære søketrær ++

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Løsningsforslag 2017 eksamen

EKSAMEN med løsningsforslag

Rekursiv programmering

Løsnings forslag i java In115, Våren 1998

Algoritmer og Datastrukturer

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

UNIVERSITETET I OSLO

INF 1000 høsten 2011 Uke september

INF1000: noen avsluttende ord

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF Notater. Veronika Heimsbakk 10. juni 2012

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF2440 Uke 5, våren2016. Arne Maus PSE, Inst. for informatikk

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF1000 Metoder. Marit Nybakken 16. februar 2004

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

UNIVERSITETET I OSLO

INF2220: Forelesning 1

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

INF1010 notat: Binærsøking og quicksort

UNIVERSITETET I OSLO

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF2440 Effektiv parallellprogrammering Uke 2 -, våren tidtaking. Arne Maus PSE, Inst. for informatikk

Logaritmiske sorteringsalgoritmer

INF2440, Uke 3, våren2014 Regler for parallelle programmer, mer om cache og Radix-algoritmen. Arne Maus OMS, Inst. for informatikk

INF2440 Uke 11, v2015 om parallell debugging og Goldbachs problem, om Oblig 2,3 og 4. Arne Maus PSE, Inst. for informatikk

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Transkript:

INF2440 Uke 10, v2014 : Arne Maus OMS, Inst. for informatikk 1

Hva så vi på i uke 9 Et sitat om tidsforbruk ved faktorisering En presisering av Oblig2. Om en feil i Java ved tidtaking (tid == 0??) Hvor lang tid de ulike mekanismene vi har i Java tar. Hvordan parallellisere rekursive algoritmer Gå IKKE i direkte oversettelses-fella eksemplifisert ved Kvikk-sort, 3 ulike løsninger 2

Hva skal vi se på i Uke10 En kommentar om Oblig2 Automatisk parallellisering av rekursjon PRP- Parallel Recursive Procedures Nåværende løsning (Java, multicore CPU, felles hukommelse) implementasjon: Peter L. Eidsvik Mange tidligere implementasjoner fra 1994 (C over nettet, C# på.net, Java over nettet,..) Demo av to kjøringer Hvordan ikke gå i fella: Et Rekursivt kall = En Tråd Halvautomatisk Hvordan kan vi bygge en kompilator (preprosessor) for automatisk parallellisering Prinsipper ( bredde-først og dybde-først traversering av r-treet) Datastruktur Eksekvering Krav til et program som skal bruke PRP 3

Generelt om rekursiv oppdeling av a[] i to deler void Rek (int [] a, int left, int right) { <del opp omradet a[left..right] > int deling = partition (a, left,right); if (deling - left > LIMIT ) Rek (a,left,deling-1); else <enkel løsning>; if (right - deling > LIMIT) Rek (a,deling, right); else <enkel løsning> void Rek(int [] a, int left, int right) { <del opp omradet a[left..right]> int deling = partition (a, left,right); Thread t1 = null, t2= null; if (deling - left > LIMIT ) t1 = new Thread (a,left,deling-1); else <enkel løsning>; if (right - deling > LIMIT) t2 = new Thread (a,deling, right); else <enkel løsning> try{ if (t1!=null)t1.join(); if (t2!=null)t2.join(); catch(exception e){; 4

Hvor mange kall gjør vi i en rekursiv løsning? Anta Quicksort av n =2 k tall (k= 10 n = 1000, k= 20 n= 1 mill) Kalltreet vil på første nivå ha 2 lengder av 2 19, på neste: 4 = 2 2 hver med 2 18 og helt ned til nivå 20, hvor vi vil ha 2 20 kall hver med 1 = 2 0 element. I hele kalltreet gjør vi altså 2 millioner -1 kall for å sortere 1 mill tall! Bruker vi innstikksortering for n < 32 = 2 5 så får vi bare 2 20-5 = 2 15 = 32 768 kall. Metodekall tar : 2-5 s og kan også optimaliseres bort (og gis speedup >1) Å lage en tråd og starte den opp tar: ca.1500 s, men ca. 180 s for de neste trådene (med start() ) nivå: 0 1 2 20 Vi kan IKKE bare erstatte rekursive kall med nye tråder i en rekursiv løsning! 5

Konklusjon om å parallellisere rekursjon Antall tråder må begrenses! I toppen av treet brukes tråder (til vi ikke har flere og kanskje litt mer) I resten av treet bruker vi sekvensiell løsning i hver tråd! Viktig også å kutte av nedre del av treet (her med insertsort) som å redusere treets størrelse drastisk (i antall noder) Vi har for n = 100 000 gått fra: n sekv.tid(ms) para.tid(ms) Speedup 100000 34.813 41310.276 0.0008 Ren trådbasert 100000 8.118 823.432 0.0099 Med insertsort 100000 7.682 5.198 1.4777 + Avkutting i toppen Speedup > 1 og ca. 10 000x fortere enn ren oversettelse. 6

Drømmen om lage automatisk parallelliseing Parallelliseing gir lang og vanskelig å lage kode Det finnes særlig to typer av sekvensielle programmer som tar lang tid: A) Med løkker (enkle, doble,..) B) Rekursive Drømmen er man bare helt automatisk, eller bare med noen få kommandoer kan oversette et sekvensielt program til et parallelt. Med løkker hadde vi bl.a HPFortran (Fortran90) som paralleliserte løkker (slo ikke helt an) Reursive metoder vi skal se på PRP (et system jeg har fått lager som hovedfagsoppgaver flere ganger siden ca. 1995) 7

PRP: Den grunnleggende ideen: Rekursjonstreet og treet av tråder er like, men Rekursjon Tråder 3 D 4 2 A 1 8 B C 5 E F G 6 7 3 D A 1 2 B C 4 5 6 E F G Dybde først Bredde først Tråder: - Kan ikke bruke svaret fra venstre-tråd til å lage parametere for høyre-tråd - Venter på trådene (og svaret ) først når begge trådene er sendt ut.. 8

Fra rekursjon til parallelle prosedyrer (metoder) Rekursjon Multikjerne CPU Kjerne 0 A Kjerne 1 A Kjerne 2 D B C E F G Kjerne3 D B C Kjerne 4 E F G 9

I Uke 9 så vi på å overføre Rekursjon til tråder - fra Peter Eidsviks (kommende) masteroppgave Vi skal nå automatisere det Vi lager en preprosessor: javaprp dvs. et Java-program som leser et annet Java-program og omformer det til et annet, gyldig Java-program (som er det parallelliserte programmet med tråder) For at JavaPRP skal kunne gjøre dette, må vi legge inn visse kommentarer i koden: Hvor er den rekursive metoden Hvor er de rekursive kallene Bare rekursive metoder med to eller flere kall, kan paralllelliseres. 10

Et eksempel før mer teori med en kjørbar sekvensiell Quicksort import java.util.random; import java.util.random; class QuicksortProg{ public static void main(string[] args){ class QuicksortProg{ public int static len = void Integer.parseInt(args[0]); main(string[] args){ int int len [] = tid Integer.parseInt(args[0]); = new int[11]; for(int i = 0; i < 11; i++){ for(int i = 0; i < 11; i++){ int[] arr new int[len]; Random int[] arr r = new new Random(); int[len]; for(int Random j = 0; r j = < new arr.length; Random(); j++){ for(int arr[j] = j = r.nextint(len-1); 0; j < arr.length; j++){ arr[j] = r.nextint(len-1); long start = System.nanoTime(); int[] k = long start = System.nanoTime(); new QuicksortCalc().quicksort (arr,0,arr.length-1); long int[] timetakenns k = = System.nanoTime() - start; System.out.println(timeTakenNS/100000.0); new QuicksortCalc().quicksort (arr,0,arr.length-1); long timetakenns = System.nanoTime() - start; tid[i] = (int) timetakenns/1000000; System.out.println(timeTakenNS/100000.0); tid = QuicksortCalc.insertSort(tid,0,10); System.out.println("Median sorteringstid for 11 gjennomlop:"+tid[5]+"ms. for n="+len); class QuicksortCalc{ int INSERT_LIM = 48; int[] quicksort (int[] a, int left, int right){ if (right-left < INSERT_LIM){ return insertsort(a,left,right); else{ int pivotvalue = a[(left + right) / 2]; swap(a, (left + right) / 2, right); int index = left; for (int i = left; i < right; i++) { if (a[i] <= pivotvalue) { swap(a, i, index); index++; swap(a, index, right); int index2 = index; while(index2 > left && a[index2] == pivotvalue){ index2--; a = quicksort (a, left, index2); a = quicksort (a, index + 1, right); return a; Nesten helt vanlig QuickSort vi har riktignok pakket den inn i en klasse Vi kompilerer og kjører den og tar tiden (11 ganger) 11

QuickSort av 10 mill tall (ca. 0.95 sek) sekvensielt M:\INF2440Para\PRP>java QuicksortProg 10000000 919.320237 948.897802 950.035171 946.001883 937.006513 940.43017 1027.33572 995.356381 1011.87974 934.688378 957.091764 Median sorteringstid for 11 gjennomlop:948ms. for n=10000000 12

Nå legger vi til tre kommentarer så den kan preprosessereres over i en parallell versjon (/*REC*/ og /*FUNC*/ ): import java.util.random; class QuicksortProg{ public static void main(string[] args){ int len = Integer.parseInt(args[0]); int [] tid = new int[11]; for(int i = 0; i < 11; i++){ for(int i = 0; i < 11; i++){ int[] arr = new int[len]; Random r = new Random(); for(int j = 0; j < arr.length; j++){ arr[j] = r.nextint(len-1); long start = System.nanoTime(); int[] k = new QuicksortCalc().quicksort(arr,0,arr.length-1); long timetakenns = System.nanoTime() - start; tid[i] = (int) timetakenns/1000000; System.out.println(timeTakenNS/100000.0); tid = QuicksortCalc.insertSort(tid,0,10); System.out.println("Median sorteringstid for 11 gjennomlop:"+tid[5]+"ms. for n="+len); class QuicksortCalc{ int INSERT_LIM = 48; /*FUNC*/ int[] quicksort(int[] a, int left, int right){ if (right-left < INSERT_LIM){ return insertsort(a,left,right); else{ int pivotvalue = a[(left + right) / 2]; swap(a, (left + right) / 2, right); int index = left; for (int i = left; i < right; i++) { if (a[i] <= pivotvalue) { swap(a, i, index); index++; swap(a, index, right); int index2 = index; while(index2 > left && a[index2] == pivotvalue){ index2--; /*REC*/ a = quicksort(a, left, index2); /*REC*/ a = quicksort(a, index + 1, right); return a; 13

Kompilér JavaPRP -systemet, så start det M:\INF2440Para\PRP>javac JavaPRP.java M:\INF2440Para\PRP>java JavaPRP Det starter et GUI-interface 14

15

Trykker: Choose a file 16

17

Trykket så Compile: - Kompilerte da den parallelliserte filen: QuicksortProgPara.java - Legger så inn parameter (10 mill) på kommandolinja og velger Execute. 18

Resultatet kommer i log-vinduet. -en OK speedup for den parallelle utførelsen: S=948/525= 1,80 19

Oversettelsen : Quicksort import java.util.random; class QuicksortProgPara{ public static void main(string[] args){ new Admin(args); class QuicksortProg{ public static void main(string[] args){ int len = Integer.parseInt(args[0]); for(int i = 0; i < 11; i++){ int[] arr = new int[len]; Random r = new Random(); for(int j = 0; j < arr.length; j++){ arr[j] = r.nextint(len-1); long start = System.nanoTime(); int[] k = new QuicksortCalc().quicksort (arr,0,arr.length-1); long timetakenns = System.nanoTime() - start; System.out.println(timeTakenNS/100000.0); Starten på brukerens kode (77 linjer) class Admin{ public Admin(String[] args){ initiateparallel(args); void initiateparallel(string[] args){ int len = Integer.parseInt(args[0]); for(int i = 0; i < 11; i++){ int[] arr = new int[len]; Random r = new Random(); for(int j = 0; j < arr.length; j++){ arr[j] = r.nextint(len-1); long start = System.nanoTime(); int[] k = startthreads (arr,0,arr.length-1); long timetakenns = System.nanoTime() - start System.out.println(timeTakenNS/100000.0); Starten på oversatt kode (245 linjer) 20

Dette kan også kjøres delvis linjeorientert Din sekvensielle rekursive løsning (som er annotert for PRP) heter MittProg.java 1) Hvis du ønsker det, kjør ditt egent program og notere eksekveringstiden. >javac MittProg.java >java MittProg 1000000 2) Kompilér PRP-systemet (hvis du ikke har gjort det tidligere) >java javaprp.java 3) Oversett ditt program (MittProg.java) til et parallelt program (MittProgPara.java) dette må gjøres via GUI >java javaprp velg da MittProg.java og trykk Compile 4) Kjør det genererte parallelle programmet (MittProgPara.java) > java MittProgPara 1000000 21

PRP kan også kan parallelliseres et fasedelt program Et fasedelt PRP-program har flere faser som hver består av først en parallell rekursiv del og så en sekvensiell del (kan sløyfes). Da må brukeren beskrive det i en egen ADMIN metode: /*ADMIN*/ public int minadminmetode(...){ int svar = rekursivmetode1(...); sekvensiellkode1(); svar = rekursivmetode2(...); sekvensiellkode2(...); svar = rekursivmetode3(...); sekvensiellkode3(...); svar = rekursivmetode4(...); sekvensiellkode4(...); return svar; Innfører da to nye Kommentarkoder: /*ADMIN*/ og /*FUNC 1*/, /*FUNC 2*/, osv 22

Og hver av disse rekursive metodene er i hver sin klasse. class MittFaseProgram{ public static void main(string[] args){ <returverdi> svar = new MittFaseProgram().minAdminMetode(...); /*ADMIN*/ <returverdi> minadminmetode(...){ <returverdi> svar1 = new Fase1().rekursivMetode(...); sekvensiellkode1(...); <returverdi> svar2 = new Fase2().rekursivMetode(...); sekvensiellkode2(...); return...; void sekvensiellkode1(...){ void sekvensiellkode2(...){ // end MittFaseProgram class Fase1{ /*FUNC 1*/ <returverdi> rekursivmetode(...){ /*REC*/ <returverdi> svar1 = rekursivmetode(...); /*REC*/ <returverdi> svar2 = rekursivmetode(...); return...; class Fase2{ /*FUNC 2*/ <returverdi> rekursivmetode(...){ /*REC*/ <returverdi> svar1 = rekursivmetode(...); /*REC*/ <returverdi> svar2 = rekursivmetode(...); /*REC*/ <returverdi> svar3 = rekursivmetode(...); return...; 23

Hvordan gjøres dette? Administrator arbeider modell Oppgaver legges ut i et fellesområde Arbeiderne tar oppgaver og legger svar tilbake i fellesområdet 24

Fra sekvensielt program til parallelt: Figur 5: Fra det sekvensielle programmet, gjennom Java PRP og til det parallelle resultatet. Det nye, parallelle programmet vil inneholde en klasse for main, Admin, Worker pluss eventuelt andre klasser fra det sekvensielle programmet, som ikke er en del av parallelliseringen. 25

Eksempel: Parallellisering med to tråder PRP: Toppen kjøres med tråder bredde-først, så går hver tråd over til dybde først og vanlige rekursive kall Figur 6: Visualisering av treet der vi ønsker å parallellisere med to tråder. Toppen av treet tilsvarer bredde først traversering til vi ender på, i dette tilfelle, to subtrær. Disse to subtrærne vil traverseres dybde først 26

Fra bredde først til dybde først og så vanlig rekursjon Trådene blir når de lages lagt i en LenkaListe (FIFO-kø) Så tas den første(a) i køen ut, og den lager to nye barne-tråder (B,C) som legges i lista. A legges i en stack (LIFO-kø) Neste på i Lista (B) tas ut og dens nye barne-tråder (D,E) legges inn i Lista B legges på stacken, osv. Bunnen av bredde-først ligger da på toppen av stacken Figur 7: Administratoren oppretter datastrukturen til arbeiderne. Figur 8: Datastrukturen etter at Figur 7 er ferdig. 27

Kjøring og retur av verdier Når trådene er brukt opp, pop-es stacken (f.eks øverst er E) og vanlige rekursive kall gjøres fra E, neste pop-es osv. til stacken er tom Svarene fra ethvert element som tas av stacken legges i en tabell og plukkes opp av den som kalte elementet. Den som kalte, kan så fortsette sin kode og selv returnere sitt svar,.. Figur 9: Arbeiderstacken beregner seg innover til roten. 28

Svarene genereres nederst stacken og svarene propaganderer oppover til første kall på den rekursive metoden 29

Hvorfor dette med bredde-og dybde-først? Kunne vi ikke bare startet trådene og latt de alle gå i parallell? NEI fordi: Vi har lovet rekursiv semantikk (virkemåte) i den parallelle. Vi skal derfor oversette det rekursive programmet slik at det gir alltid samme resultat parallelt. Eks Quicksort: Anta at vi parallelliserer ned til nivå 3 i treet Hvis nivå 2 og 3 går samtidig, vil dette gå galt fordi de prøver begge lagene og flytte på de samme elementene i a[]. 30

Hva gjøres teknisk vår program består av (minst) to klasser Klassen med main og en klasse som inneholder den rekursive metoden Er det flere rekursive metoder som skal parallelliseres, så skal de være inne i hver sin klasse Det genererte programmet består av minst følgende klasser: Admin Worker Kort og greit: Det oversatte programmet xxxxxpara.java skal vi egentlig ikke se på og spesielt ikke endre. Det bare virker og parallelliserer etter visse prinsipper. 31

Eksempel 2: Største tall i en array class Search{ int k = 5; /*FUNC*/ int findlargest(int[] arr, int start, int end){ class LargestNumber{ public static void main(string[] args){ int len = Integer.parseInt(args[0]); int cores = Runtime.getRuntime().availableProcessors(); int[] arr = new int[len]; Random r = new Random(); for(int i = 0; i < arr.length; i++){ arr[i] = r.nextint(len-1); long t = System.nanoTime(); /*CALL*/ int k = (new Search()).findLargest(arr,0,arr.length); Double t2 =(System.nanoTime()-t)/1000000.0; System.out.println("Largest number is " + k+ ", paa:"+t2+"ms."); if((end-start) < k){ return largest_basecase(arr,start,end); int half = (end-start) / 2; int mid = start + half; /*REC*/ int leftval = findlargest (arr,start,mid); /*REC*/ int rightval = findlargest (arr,mid+1,end); if(leftval > rightval) return leftval; return rightval; int largest_basecase(int[] arr, int start, int end){ int largest = 0; for(int i = start; i < end; i++){ if(arr[i] > largest){ largest = arr[i]; return largest; 32

NB. for å få kjøretiden riktig for det parallelle programmet N.B det som oppgis som «program execution time» er med overhead fra GUI løsningen. Fra GUI-en: Opening: LargestNumber.java Created: LargestNumberPara.java javac LargestNumberPara.java java LargestNumberPara 100000000 Largest number is 99999994, paa:152.171677ms. program execution time: 1511.89 ms Kjør det i linjemodus (n= 100 mill.): M:\INF2440Para\PRP>java LargestNumberPara 100000000 Largest number is 99999998, paa:135.922687ms. M:\INF2440Para\PRP>java LargestNumber 100000000 Largest number is 99999998, paa:417.98199ms. 33

Hva så vi på i Uke10 En kommentar om Oblig2 Automatisk parallellisering av rekursjon PRP- Parallel Recursive Procedures Nåværende løsning (Java, multicore CPU, felles hukommelse) implementasjon: Peter L. Eidsvik Demo av to eksempler kjøring Hvordan ikke gå i fella: Et Rekursivt kall = En Tråd Halvautomatisk oversettelse (hint/kommandoer fra kommentarer) Hvordan virker en kompilator (preprosessor) for automatisk parallellisering Prinsipper ( bredde-først og dybde-først traversering av r-treet) Datastruktur Eksekvering Krav til et program som skal bruke PRP Slik bruker du PRP Ukeoppgave neste uke. 34