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

Like dokumenter
UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

INF NOV PARALLELL SORTERING. Arne Maus, PSE, Ifi

UNIVERSITETET I OSLO

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

INF2440 Uke 4, v2017 Om å samle parallelle svar, matrisemultiplikasjon og The Java Memory Model + evt bedre forklaring Radix

INF2440 Uke 4, v2015 Om å samle parallelle svar, matrisemultiplikasjon og The Java Memory Model + evt bedre forklaring Radix

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

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

UNIVERSITETET I OSLO

Sortering med tråder - Quicksort

Arne Maus OMS, Inst. for informatikk

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

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

7) Radix-sortering sekvensielt kode og effekten av cache

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

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

INF1010 notat: Binærsøking og quicksort

Løsningsforslag 2017 eksamen

Tråder Repetisjon. 9. og 13. mai Tråder

Kap 19. Mer om parallelle programmer i Java og Kvikksort

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

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

UNIVERSITETET I OSLO

Tråder Repetisjon. 9. og 13. mai Tråder

INF2440 Uke 6, våren2014 Mer om oppdeling av et problem for parallellisering, mye om primtall + thread-safe. Arne Maus OMS, Inst.

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Quicksort. Fra idé til algoritme.

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

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

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

UNIVERSITETET I OSLO

INF1000 (Uke 12) Sortering

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

UNIVERSITETET I OSLO

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

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

INF1010 Tråder II 6. april 2016

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Parallellprogrammering og Sortering INF nov. 2015

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

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

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

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

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

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

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

UNIVERSITETET I OSLO

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

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

! " ##$ % 4 2, &/ ( & +, )-. &* &/ ),* 0, 1 1 ( &/ 2& &, & &/ &,, &/" 2 &/ 2 ) *

( & ( &/ 2& , )-. &* &/ ),* 0, &/ 2 ) *

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

UNIVERSITETET I OSLO

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

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

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

INF2220: Time 12 - Sortering

INF2440 Prøveeksamen, løsningsforslag, 26 mai Arne Maus OMS, Inst. for informatikk

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Side 1 av 11, prosesser, tråder, synkronisering, V. Holmstedt, HiO 2006

INF2440 Uke 5, våren2015 Om oppdeling av et problem for parallellisering, mye om primtall + thread-safe. Arne Maus PSE, Inst.

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Forelesning inf Java 4

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

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

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

Fra Python til Java, del 2

Hvor raskt klarer vi å sortere?

INF Uke 10. Ukesoppgaver oktober 2012

INF Ekstrainnlevering

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

2 Om statiske variable/konstanter og statiske metoder.

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

Kapittel 8: Sortering og søking

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

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

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000: noen avsluttende ord

Algoritmer og datastrukturer Løsningsforslag

Uke 8 - Oppramstyper, HashMap og Innstikksortering, litt javadoc. 17. oktober 2013, Arne Maus Inst. for informatikk, UiO

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

INF1000 : Forelesning 4

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Transkript:

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

Oppgave 1 (10 poeng) Forklar hva som skjer ved en synkronisering: a) Når to tråder synkroniserer på samme synkroniseringsobjekt (f.eks en ReentrentLock). b) Når to tråder synkroniserer på hvert sitt synkroniseringsobjekt (f.eks to ReentrentLock). a) En av trådene må vente hvis de to trådene samtidig prøver å synkronisere og den første tråden ikke er ferdig har sagt ls1.lock(); men enda ikke har sagt ls1.unlock(); b) Ingenting. De to trådene kan si lock() og unlock() men det medfører ingen venting fra den andre tråden. 2

Oppgave 2 (25 poeng) Anta at du har tre tråder som prøver å oppdatere to globale variable x1 og x2, deklarert i A-området Modell2-koden (vedlagt), begge initielt =0 i, slik: public void run( ) { for (int i =0; i < 2; i++){ x1++; x2++; System.out.println(" - tråd:"+ind+", x1:"+x1+", x2:"+x2 ); } System.out.println(" Tråd:"+ind+" terminerer"+", x1:"+x1+", x2:"+x2); } // end run: Like etter at man i metoden utfoer(..) har sagt join() på de tre trådene er følgende utskrifttssetning: System.out.println("Main-tråden TERMINERER"+", x1:"+x1+", x2:"+x2 ); 3

Hver gang man kjører dette programmet, får man nesten alltid veldig forskjellige utskrifter. Her er to: U1: - tråd:2, x1:2, x2:3 - tråd:1, x1:2, x2:3 - tråd:1, x1:4, x2:5 - tråd:0, x1:2, x2:3 Tråd:1 terminerer, x1:4, x2:5 - tråd:2, x1:3, x2:4 Tråd:2 terminerer, x1:5, x2:6 - tråd:0, x1:5, x2:6 Tråd:0 terminerer, x1:5, x2:6 Main-tråden TERMINERER, x1:6, x2:6 U2: - tråd:1, x1:2, x2:2 - tråd:2, x1:3, x2:3 - tråd:2, x1:5, x2:5 - tråd:0, x1:1, x2:1 Tråd:2 terminerer, x1:5, x2:5 - tråd:1, x1:4, x2:4 Tråd:1 terminerer, x1:6, x2:6 - tråd:0, x1:6, x2:6 Tråd:0 terminerer, x1:6, x2:6 Main-tråden TERMINERER, x1:6, x2:6 Oppgave: Forklar og begrunn kort svarene på følgende spørsmål: a) Hvorfor ser f.eks tråd:2 i første linje ulike verdier og x1 < x2 i U1? b) Hvorfor ser ingen av trådene x1 ==6, mens main-tråden ser x1== 6 til sist i U1. c) Hvorfor ser ingen av trådene i U1 verdien 1? d) Vil alltid main-tråden skrive ut x1 ogx2 med verdien 6? e) Hvorfor er utskriftene ulike (hvorfor aldri samme resultat på gjentatte kjøringer)? 4

Oppgave: Forklar og begrunn kort svarene på følgende spørsmål: a) Hvorfor ser f.eks tråd:2 i første linje ulike verdier og x1 < x2 i U1? Tråd:1 har startet og øket både x1 og x2 til 2, MEN verdien av x1==2 har ikke kommet fram til Tråd:2 (bare x1 == 1) derfor x1==2, x2 == 3. Husk at System.out.println(..) er ikke en synchronized metode. b) Hvorfor ser ingen av trådene x1 ==6, mens main-tråden ser x1== 6 til sist i U1. join() på trådene er en synkronisering, derfor ser main-tråden alle de siste verdiene. c) Hvorfor ser ingen av trådene i U1 verdien 1? Fordi minst to av Tråd:0-2 har startet før første utskriftssetning og de har økt både x1 og x2 med 1. d) Vil alltid main-tråden skrive ut x1 ogx2 med verdien 6? Nei vi kunne fått x++ feilen her, dvs. at en av oppdateringene av x1,x2 går ekte tapt. Vi må skille mellom at trådene ser gamle verdier og at oppdateringer går tapt selv etter synkronisering. e) Hvorfor er utskriftene ulike (hvorfor aldri samme resultat på gjentatte kjøringer)? Fordi System.out.println tar lang tid og ofte vil gi sikkert at disse trådene går samtidig, men med uforutsigbare tidsforsinkelser. 5

Oppgave 3 (25 poeng) Lag et parallelt program med to tråder og to CyclicBarrier hvor de to trådene vekselsvis sender en nummerert melding til den andre tråden 20 ganger (f.eks. «Tråd0 sier: Hei nr 14»). Meldingen skrives ut med System.out.println( ). Når den ene tråden skriver, skal den andre tråden vente på en av de to CyclicBarrier-ene og motsatt. Bare skriv run() metoden og initieringen av de to CyclicBarrier-ene. public void run( ) { for (int i =0; i < 20; i++){ try { b.await(); } catch (Exception e){return;} if (ind==0) System.out.println(" - tråd:"+ind+" sier Hei nr:"+i ); try { c.await(); } catch (Exception e){return;} if (ind==1) System.out.println(" - tråd:"+ind+" sier Hei nr:"+i ); } // end hei-loop } // end run: Kunne denne oppgaven vært løst med bare én CyclicBarrier? Ja, kunne fjernet CyclicBarrier c, og ventet på b begge stedene over. 6

M:\INF2440Para\2016\Sunnås\Prøveeksamen>java Oppg3 - tråd:0 sier Hei nr:0 - tråd:1 sier Hei nr:0 - tråd:0 sier Hei nr:1 - tråd:1 sier Hei nr:1 - tråd:0 sier Hei nr:2 - tråd:1 sier Hei nr:2 - tråd:0 sier Hei nr:3 - tråd:1 sier Hei nr:3... - tråd:0 sier Hei nr:17 - tråd:1 sier Hei nr:17 - tråd:0 sier Hei nr:18 - tråd:1 sier Hei nr:18 - tråd:0 sier Hei nr:19 - tråd:1 sier Hei nr:19 Main-tråden TERMINERER 7

Oppgave 4 (15 poeng) Anta at du har to tråder som aksesserer en felles variabel, deklarert i felt A slik: int i =0, og at hver av trådene har deklartert i det felles området A for alle trådene: ReentrantLock lock = new ReentrantLock(2); Tråd0 utfører følgende kode: lock.lock(); try { i++; } finally { lock.unlock();} i++; før den terminerer, mens Tråd1 utfører følgende kode: i--; lock.lock(); try { i--; } finally { lock.unlock();} før den terminerer, Hvilke mulige verdier kan i ha etter at begge trådene har terminert? (Main-tråden skriver ut verdien av i med System.out.println). Mulige verdier av i : -2,-1,0,1,2 8

i == -1 Tråd 0 i++ i++ Tråd 1 i-- i-- Main-tråden Main leser i i == - 2 Tråd 0 i++ i++ Tråd 1 i-- i-- Main-tråden Main leser i 9

i == 2 Tråd 0 i++ i++ Tråd 1 i-- i-- Main-tråden Main leser i 10

i == -1 Tråd 0 i++ i++ Tråd 1 i-- i-- Main-tråden Main leser i i == 0 Tråd 0 i++ i++ Tråd 1 i-- i-- Main-tråden Main leser i 11

Oppgave5 (30 poeng) Anta at du har deklarert en array: int tallene[] = new int [n]; og du kan anta at elementene i tallene[]er sortert stigende. Du skal nå skrive først en sekvensiell og så en parallell metode (anta at du har k kjerner) som snur innholdet av tallene[]slik at tallene blir sortert synkende. Skriv heller ikke her hele programmet, men bare de metodene og evt. data som du trenger i A og B området i vedlegget + hva innholdet av run()-metoden i trådene er. void snu ( int [] a, int left, int right) { int an = a.length-1, t; for (int i = left; i < right; i++) { t = a[i]; a[i] = a[an-i]; a[an-i] =t; } }// end snu Arbeider (int in, int [] a) { ind = in; this.a =a; num = a.length/(2*antt); // only swap half left = ind*num; right = (ind+1)*num; if (ind == antt -1) right += (a.length%antt)/2; } public void run( ) { // kalles når tråden er startet snu(a, left, right); } // end run 12

Oppgave 6 (40 poeng) Du har gitt en metode for å sortere (i Appendix II er en slik algoritme gitt basert på innstikk-sortering, men vi kunne like godt ha brukt radix eller quicksort i steden): public static void sort (int a[], int left, int right) {..} Du skal nå skrive en ny metode sort2, basert på denne som sorterer to arrayer med følgende forståelse: public static void sort2 (int a[], int [] b, int left, int right) {..} Du sorterer innholdet av arrayen a[] som i den første metoden "sort", men med det tillegget at elementene i den andre arrayen b[] flyttes helt tilsvarende som elementene i a[] flyttes. Eksempel: hvis elementet a[0] ble flyttet til a[23] etter sortering så vil også det opprinnelige elementet b[0] nå stå på plass b[23]. Dette oppnår du ved at hver gang du flytter a[] elementene, flytter du b[] elementene med samme indeks helt tilsvarende. Skriv en sekvensiell metode "sort2" som løser denne oppgaven. Denne vil du så bruke for å løse oppgave 7. 13

/** sorts a [left.. right] and b [left.. right] by Insertionsort.*/ void sort2 (int a[],int []b, int left, int right) { int i,k; int t,tb; for (k = left ; k < right; k++) { if (a[k] > a[k+1]){ t = a[k+1]; tb = b[k+1]; i = k; while (i >= left && a[i] >t { a[i+1] = a[i]; b[i+1] = b[i]; i--; } a[i+1] = t; b[i+1] = tb; } // end if }// end k } // end Sort2 14

Oppgave 7 (80 poeng) Du har en foreleser som tror at han har en genial idé til å lage en raskere innstikksortering-metode kalt mediansort. Problemet med innstikksortering, tenkte han, er at det er en del store elementer tidlig (med lave indekser) i arrayen som må skyves langt avgårde mot enden av arrayen, og motsatt, mange små verdier alt for langt ut i array-en som sorteres mot begynnelsen. Disse må flyttes (byttes med hverandre) før vi gjør instikksortering til sist, som da vil gå svært mye raskere. Liten median Stor median a[] b[] 15

Den sekvensielle algoritmen for dette er slik: a) Vi starter med å dele opp arrayen i en rekke m mindre områder ( f.eks i m = n/5 deler) og du kan for enkelthets skyld anta at n er delbar med m uten rest (n%m ==0). Vi sorterer så hver og en av dem med "sort" fra Appendix II samtidig som vi noterer verdien av det midterste elementet i hver av de sorterte delene i: int[] median = new int[m]. Samtidig har du laget en annen array int[] index = new int [m] som initielt inneholder 0,1,2,..,m-1. b) Sorter nå arrayene median og index med sort2 fra oppgave 6. Du kan her anta at du har løst oppgave 6 om å lage en sortering for to arrayer slik at når du sorterer på den ene arrayen (her: median) og har med en annen array indeks (initielt: 01,2,,m 1) som parameter, så deltar elementene i indeks i de samme ombyttingene som elementene i median. Når da median-arrayen er sortert, vil f.eks indeks[0] si hvilken av delene av a[] som hadde minst median, indeks[1] hvilken som hadde nest minst median, osv. c) Vi flytter om små-områdene i a[] over i en like lang array b[] slik at det området som har minst median kommer først i b[], nest minst kommer som område nr. 2, osv d) Når vi er ferdige med alle disse omflyttingene kopieres b[] tilbake til a[] og e) det gjøres ett kall på sort fra AppendixII av hele arrayen a[]. 16

Oppgaver: 7.1 Programmer denne algoritmen sekvensielt. 7.2 Lag en parallell versjon av dette sekvensielle programmet med Modell2 koden, bare parallelliser stegene a), c) og d) - ikke stegene b) eller e) som begge er kall på innstikksortering. Skriv bare de tilleggene du trenger og forklar hvor du plasserer dem i Modell2-koden, 17

Den sekvensielle algoritmen for dette er slik: a) Vi starter med å dele opp arrayen i en rekke m mindre områder ( f.eks i m = n/5 deler) og du kan for enkelthets syld anta at n er delbar med m uten rest (n%m ==0). Vi sorterer så hver og en av dem med "sort" fra Appendix II samtidig som vi noterer verdien av det midterste elementet i hver av de sorterte delene i: int[] median = new int[m]. Samtidig har du laget en annen array int[] index = new int [m] som initielt inneholder 0,1,2,..,m-1. // median-for small sections int medianval (int [] a, int index) { int start = index*med_len, end = start +MED_LEN-1; insertsort(a,start,end); return a[(start+ end)/2]; } // end int medianval 18

Den sekvensielle algoritmen for dette er slik: c) Vi flytter om små-områdene i a[] over i en like lang array b[] slik at det området som har minst median kommer først i b[], nest minst kommer som område nr. 2, osv void copysegments(int[] a,int[] b, int index[], int i){ int astart = i*med_len, bstart = index[i]*med_len; for (int j = 0; j < MED_LEN; j++) { b[bstart+j]= a[astart+j]; }// end j } // end copy segmnent 19

Den sekvensielle algoritmen for dette er slik: d) Når vi er ferdige med alle disse omflyttingene kopieres b[] tilbake til a[] og void copyback (int [] a, int [] b,int startseg, int endseg) { int start = startseg*med_len, end = endseg*med_len; for (int j = start; j < end; j++) { a[j]= b[j]; } // end j } // end copyback 20

// sequential median sort of a[] void mediansort (int [] a) { int antmed = (a.length)/med_len, start,end; // steg a) for (int i = 0 ; i < antmed; i++){ median[i] = medianval(a,i); } // steg b) sort2 (median,index,0,antmed-1); // sort median, move index same // steg c), copy the differnt parts to their median positions in b for (int i = 0 ; i < antmed; i++){ copysegments (a,b,index,i); } // steg d) copyback (a,b,0,antmed); // steg e) insertsort (a); } // end mediansort 21

public void run( ) { int antmed = (a.length)/med_len; num = antmed/antt; start = ind*num; end = (ind+1)*num; if (ind == antt -1) end += antmed % antt; // steg a) for (int i = start ; i < end; i++){ median[i] = medianval(a,i); } // ----------- sync 1 -------------------------------- try { barrier.await();} catch(exception e) {return;} // steg b) if (ind ==0) sort2 (median,index,0,antmed-1); // sort median,index // ----------- sync 2 -------------------------------- try { barrier.await();} catch(exception e) {return;} // steg c), for (int i = start ; i < end; i++){ copysegments(a,b,index,i); }// end i, alle medianer // ----------- sync 3 -------------------------------- try { barrier.await();} catch(exception e) {return;} // (run forts.) // ----------- sync 4 -------------------------------- try { barrier.await();} catch(exception e) {return;} // steg e) if (ind ==0) insertsort(a); } // end run // steg d) copyback(a,b,start,end-1); 22