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

Like dokumenter
UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

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

UNIVERSITETET I OSLO

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

INF NOV PARALLELL SORTERING. Arne Maus, PSE, Ifi

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

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 3, våren2015 Regler for parallelle programmer, mer om cache og Radix-algoritmen. Arne Maus OMS, Inst. for informatikk

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

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

Sortering med tråder - Quicksort

UNIVERSITETET I OSLO

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

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

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

Arne Maus OMS, Inst. for informatikk

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Forelesning 9 mandag den 15. september

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

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

UNIVERSITETET I OSLO

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

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

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

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

7) Radix-sortering sekvensielt kode og effekten av cache

er et er et heltall. For eksempel er 2, 3, 5, 7 og 11 primtall, mens 4 = 2 2, 6 = 2 3 og 15 = 3 5 er det ikke.

INF1000 Variable. Marit Nybakken 27. januar 2004

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

PRØVEEKSAMEN (rettet versjon 27/11)

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

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

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

UNIVERSITETET I OSLO

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

UNIVERSITETET I OSLO

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

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

MAT1030 Forelesning 30

Løse reelle problemer

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

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

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

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

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

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

Java PRP brukermanual

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

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

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

UNIVERSITETET I OSLO

INF1000 Metoder. Marit Nybakken 16. februar 2004

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Kap 19. Mer om parallelle programmer i Java og Kvikksort

UNIVERSITETET I OSLO

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

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

Repetisjon: høydepunkter fra første del av MA1301-tallteori.

Leksjon 3. Kontrollstrukturer

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

Algoritmer og Datastrukturer

MAT1030 Diskret matematikk. Kompleksitetsteori. Forelesning 29: Kompleksitetsteori. Dag Normann KAPITTEL 13: Kompleksitetsteori. 7.

TOD063 Datastrukturer og algoritmer

ALGORITMER OG DATASTRUKTURER

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

INF1000 : Forelesning 4

Forelesning 28: Kompleksitetsteori

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

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

Invarianter, +lstander og li1 mer seman+kk

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

Fasit og løsningsforslag til Julekalenderen for mellomtrinnet

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

INF Uke 10. Ukesoppgaver oktober 2012

INF2440 Effektiv parallellprogrammering Uke 1, våren Arne Maus PSE, Inst. for informatikk

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

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

UNIVERSITETET I OSLO

Transkript:

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

Prøveeksamen Er en modell av hva du får til eksamen: - like mange (+-1) oppgaver som eksamen - Samme type oppgave på samme sted. - Prøveeksamen er grovt sett de oppgavene av to oppgavesett som ikke var gode nok til å komme med til eksamen. - Flere trykkfeil i prøveeksamen enn i eksamens-settet: - for eksempel: gjennomgang kl 15.15 - Oppgave 6 må rettes: f.eks slik setning s1 er: int num=1; - Oppgave 4 må vi anta at trådene ikke utfører koden sin samtidig (ikke data-kappløp om int teller2) - Oppgave 5: burde (?) spesifisert: stigende sortert 2

Appendix: Model2 kode skisse import java.util.concurrent.*; class Problem { // felles data og metoder A public static void main(string [] args) { Problem p = new Problem(); p.utfoer(8); void utfoer (int antt) { Thread [] t = new Thread [antt]; for (int i =0; i< antt; i++) ( t[i] = new Thread(new Arbeider(i))).start(); for (int i =0; i< antt; i++) t[i].join(); class Arbeider implements Runnable { int ind; // lokale data og metoder B Arbeider (int in) {ind = in; public void run( ) { // kalles når tråden er startet // end run // end indre klasse Arbeider // end class Problem 3

Oppgave 1 (10 poeng) Når vi synkroniserer i Java, hva annet skjer i tillegg til at vi evt. får ordnet trådene tidsmessig (svar kortfattet, maksimalt 10 linjer) Vi får skrevet ned alle felles variable i hovedhukommelsen og vi får utført alle utsatte operasjoner. Det vi si at alle trådene som har synkronisert på samme synkroniseringsvariabel, vil etter en synkronisering kunne lese samme verdi på alle felles variable. Hvilken effekt ville det ha på programutførelsen av et parallelt program i Java hvis alle metodene var synchronized og deklarert i A-området (se vedlegget) Vi vil grovt sett fått et sekvensielt program fordi første tråden som starter å eksekvere i sin run()-metode, vil kalle en synchronized metode som kaller en annen synchronized metode, som.. inntil tråden er ferdig med sin kode og neste tråd får slippe til som oppfører seg på samme måte. Dvs. vi får utført kodene til hver tråd etter hverandre og ikke samtidig et sekvensielt program. 4

Oppgave 2 (10 poeng) Du skal beskrive forskjellene av Gustafsons lov kontra Amdahls lov. Anta at du har et program som for en gitt n har 10% sekvensiell kode. Hva sier de to lovene om hva som vil skje med hvor stor maksimal speedup vi kan få på dette programmet hvis vi kjører programmet med en langt større n på problemet. Hvilken av de to lovene er mest optimistiske med hensyn til å få størst mulig speedup. Amdahls lov sier at med 10% sekvensiell kode vil vi maksimalt få speedup på 10 fordi den sekvensielle delen er en konstant del, uavhengig av størrelsen på problemet. Hos Gustafson derimot er den sekvensielle delen (mer eller mindre ) konstant, slik for et dobbelt så stort problem vil det bare være 5%, osv, slik at Gustafson er langt mer optimistisk om speedup. 5

Oppgave 3(20 poeng) Goldbach hadde egentlig to påstander i 1743. Den første om partall har vi jobbet mye med. Hans andre påstand var at ethvert oddetall kan skrives sum summen av tre primtall. Dette er visstnok bevist i 2013 i et 133 siders bevis (sist revidert 14. april 2014!). a) Skisser hvordan du vil lage et sekvensielt program som sjekker dette for alle oddetall n < M. Du kan godt bruke din løsning på Goldbachs påstand om partall som en del av løsningen. Svar: La M være et oddetall. Finn et primtall p3 < M. Da er (M-p3) et partall, og M = Goldbach3(M) = p3 + Goldbach2(M-p3) = p3 + p1 + p2 = M-p3 6

Oppgave 3(20 poeng) b) Skisser så hvordan du vil parallellisere det å vise Goldbachs påstand om alle oddetall n < M. Svar: Vi deler M opp i k like store deler slik: Anta k tråder; og at M er delelig med k. Tråd i vil da prøve Goldbach3(m) for (M*i)/k m <(M*(i+1))/k. c) Kan puffes: Hvis Goldbachs påstand om partall var bevist (noe det ikke er), men anta likevel det. Bevis da at Goldbachs påstand om oddetall er sant (meget lett, tips: 3 er et primtall). Svar : Gitt vilkårlig oddetall Od, Od 7. Da er Od-3 et partall (Od-3)=p1+p2, og da er M=p1+p2+3 7

Oppgave 4 (15 poeng) I denne oppgaven tenker vi oss ikke data-kappløp om teller2. Anta at at du har startet 5 tråder og at du i felt A i vedlegget deklarerer følgende to variable: int teller2 =0 Semaphore abc = new Semaphore(2); Trådene eksekverer kode i sin run()-metode som før eller siden alle prøver å utføre: try{abc.aquire(); catch (Exception e) {return; teller2 ++; a) Hva er verdien av teller2 etter at første tråden prøver å utføre denne koden. Svar: teller2 = 1; og den første tråden fortsetter b) Hva er verdien av teller2 etter at andre tråden prøver å utføre denne koden. Svar: teller2 = 2; og den første og andre tråden fortsetter c) Hva er verdien av teller2 etter at tredje tråden prøver å utføre denne koden. Svar: teller2 = 2; og den første og andre tråden fortsetter og den tredje tråden venter på abc-køen 8

Oppgave 4 (15 poeng) fors d) Hva er verdien av teller2 etter at fjerde tråden prøver å utføre denne koden. Svar: teller2 = 2; og den første og andre tråden fortsetter og den tredje og fjerde tråden venter på abc-køen 9

Oppgave 5 (40 poeng) Skriv først en sekvensiell og så en parallell metode for å løse følgende problem: I en matrise: int[][]a = new int[n][n] er det slik at to av radene er stigende sortert, mens de resterende n-2 radene ikke er sortert (dvs. i hver av disse n-2 radene er det minst en indeks i slik at i rad k er a[k][i] > a[k][i+1]). Oppgaven din nå er å finne disse to radene. La til slutt main-tråden skrive ut svaret (indeksen på de to radene som er sortert) N.B. Du skal ikke skrive hele programmet, men bare den sekvensielle metoden, de datastrukturer du trenger og den/de metodene du trenger i det parallelle tilfellet som kalles fra run() - metoden. For begge deler, skriv med kommentar i koden hvilke områder (A eller B) i vedlegget du tenker disse plassert. 10

Oppgave 5 -sekvensiell void finntoradersekvensiell (int [][]a){ int [] aa; int j; for (int i = 0; i< a.length; i++) { // for hver rad i aa = a[i]; for ( j = 1; j < aa.length; j++){ if (aa[j-1] > aa[j]) break; if(j == aa.length) System.out.println(«Rad: «+ i + «er sortert») // end rad i // end finntoradersekvensiell 11

Oppgave 5 - parallell // i A - området ArrayList svar = new ArrayList(); synchronized void reistrerpara(int i){ svar.add(i); // i B området: void finntoraderpara (int [][]a){ int [] aa; int j; int left = (ind)*ant; int right= (ind+1)*ant; if (ind == anttraader-1) right = n; ; for (int i = left; i< right; i++) { aa = a[i]; for ( j = 1; j < aa.length; j++){ if (aa[j-1] > aa[j]) break; if (j == aa.length) reistrerpara(i); // end rad i // end finntoradersekvensiell 12

Oppgave 6 (20 poeng) Du har et trådbasert system og vil øke en int variabel num hver gang med 1 slik at den til slutt blir så stor at den av maskinen blir betraktet som et negativt tall ved at verdien kommer opp i fortegnsbitet til variabelen. For det formålet starter du opp 10 tråder. Du skal da benytte følgende to programsetninger s1 og s2: // setninger s1 int num =1; // feil rettet her // setninger s2 synchronized int leggtil(int num) { num++ ; return num; Vi tenker oss at det i hver run-metode i trådene utføres følgende kode: while (num > 0 ){ num = leggtil(num); Selve problemløsningen din tar utgangspunkt følgende sekvensielle kode: while (num >= 0) num++; System.out.println (" num < 0: + num+ ", i mål ); 13

Oppgave 6 forts. Spørsmål: Hva er effekten av å plassere de to setningene (s1 og s2) ulike steder i Model2koden (vedlegget) N.B det er koden i run()-metoden som oppdaterer num IKKE leggtil-metoden i s2. Den framskaffer bare et tall som er 1 større enn den gamle verdien av num (slik run()-metoden ser num). a) s1 og s2 i A? Svar: Virker, men svært langsomt lager egentlig sekvensiell kode av problemet. b) s1 i A og s2 i B? Svar: Virker IKKE hvis vi vil ha med alle oppdateringene fordi den synkroniserte metoden i hver tråd synkroniserer bare på hvert sitt tråd-objekt, og vi vil få mange mistete oppdateringer, Derimot er dette mye raskere enn a) fordi vi får full parallellitet på problemet. Tvilsom, men raskere. c) s1 i B og s2 i A? Svar: Her er num en lokal variabel i hver tråd, men derimot så synkroniseres alle trådenes oppdateringer av sine lokale num -variable med de andre trådene uten at det er nødvendig. Dvs. dette går langsomt uten at det var nødvendig i det hele tatt med synkroniseringen. Vi får her k svar ikke ett. d ) s1 og s2 i B? Svar: Full fart fordi all synkroniseringene er lokal i hver tråd (men denne synkroniseringen er da heller ikke nødvendig). Vi får også her k svar ikke ett. 14 Gi en kort begrunnelse på hvert av punktene a)-d).

Oppgave 6 - testing Det kom opp en rekke intressante spørsmål etter gjennomgang av oppgave 6. Følgende vet vi etter å ha testet a) til d) + en sekvensiell versjon, at kjøretidene varierer voldsomt Sekvensiell kode : 1,3 sek a) s1 og s2 i A : 1675,036 sek b) s1 i A og s2 i B : 206,045 sek c) s1 i B og s2 i A : 202,553 sek d) s1 og s2 i B : 59,232 sek Grunnen til at a) tar spesielt lang til er at dette lager svært mange synkroniseringer og sekvenserer all aksess til num. Grunnen til sekvensiell kode er så mye raskere enn selv d) er at synchronized metoder er om mulig det langsomste synkroniseringsmåten vi har i Java, og her gjør vi over 2 milliarder kall. 15

Oppgave 7 (80 poeng) Flettesortering, sekvensiell og parallell. (For dere som har glemt hva flette-sortering er: Du har i en array a[] to sorterte sekvenser s1 og s2 (av lengde l1 og l2) som ligger etter hverandre i a[] dvs. at hvis s1 s siste element er i a[k], så starter s2 i a[k+1]. Kopier disse to over i en array b[] slik at du stadig tar det minste elementet av s1 eller s2 i a[] som enda ikke er kopiert som neste element du kopierer over til b[]. Du plukker altså elementene fra toppen hver av de to sekvensene til alle elementene er kopiert over til b[]. I b[] er det etter kopieringa da en sortert sekvens av lengde = l1+l2. ) 16

a) Du skal nå først skrive en rekursiv versjon av flettesortering, som består av to metoder (omtrent som quicksort) - her er den første oppgitt: void flettesort(int [] a) { if (a.length <= 50) insertsort(a,0,a.length-1); else { int [] b = new int [a.length]; flette(a,b,0,a.length-1); // end flettesort Du skal skrive den rekursive metoden flette: void flette (int [] a, int [] b, int v, int h){ <..din kode her.. > b ) Skriv en effektiv parallell versjon av din sekvensielle, rekursive flettesorteringsalgoritme. 17

void flette (int [] a, int [] b, int v, int h, int dybde){ if (h-v < INSERT_LIM && (dybde%2 == 0)) { insertsort (a,v,h); else { int mid = (v+h)/2; flette (b,a,v,mid, dybde+1); // sort left part b[v..mid] flette (b,a,mid+1,h, dybde+1); // sort right part b[mid+1..h] int vind = v, hind = mid+1, aind = v;; UTEN tilbakekopiering b[] til a[] // loop until all elenents moved to 'a' while (aind <= h) { // move left elements while all right elem moved or left smaller while ( vind <= mid && ( hind == h+1 b[vind] <= b[hind] )) { a[aind++] = b[vind++]; // end else // end flette // move right elements while all left elem moved or right smaller while ( hind <= h && ( vind == mid+1 b[hind] <= b[vind] )) { a[aind++] = b[hind++]; 18

void flette (int [] a, int [] b, int v, int h){ if (h-v < INSERT_LIM ) { insertsort (a,v,h); else { int mid = (v+h)/2; flette (a,b,v,mid, dybde+1); // sort left part b[v..mid] flette (a,b,mid+1,h, dybde+1); // sort right part b[mid+1..h] int vind = v, hind = mid+1, bind = v;; Med tilbakekopiering b[] til a[] // loop until all elenents moved to 'a' while (bind <= h) { // move left elements while all right elem moved or left smaller while ( vind <= mid && ( hind == h+1 a[vind] <= a[hind] )) { b[bind++] = a[vind++]; // move right elements while all left elem moved or right smaller while ( hind <= h && ( vind == mid+1 a[hind] <= a[vind] )) { b[bind++] = a[hind++]; for (int i = v; i <= h; i++) a[i] = b[i]; // end else // end flette 19

// i del A int [] a; static int LEVEL_MAX =4; int numthreads =1; public void sort (int [] to) { int [] from = new int [to.length]; System.arraycopy(to,0,from,0,a.length); CountDownLatch tochild = new CountDownLatch (1); pflette(from,to,0, from.length-1,0,tochild); try{ tochild.await(); catch (Exception e) {; // end sort Parallell flette starter med kall på sort(a) med tidtaking rundt // i del B class Para implements Runnable{ int [] a,c; int low,high,level; CountDownLatch fromparent; Para(int []a,int[]c,int i,int j,int level, CountDownLatch fromparent) { this.a=a; this.c = c; low =i; high=j;this.level=level; this.fromparent = fromparent; public void run() { numthreads++; pflette(a,c,low,high,level,fromparent); // end run // end Para 20

void pflette (int [] from, int [] to, int astart, int bend, int level, CountDownLatch fromparent) { int bstart = (bend + astart+1)/2; if ( level < LEVEL_MAX ){ // since < another parallel layer CountDownLatch tochild = new CountDownLatch(LEVEL_MAX-level) ; new Thread(new Para(to,from,bStart,bEnd,level+1,toChild)).start();//right part pflette (to,from, astart,bstart-1, level+1,fromparent); // left part try{ //her kunne vi brukt join(); tochild.await(); catch (Exception e) {; else if (bend-astart <= 50 ) { insertsort (a,astart,bend); else { // resten av treet raskere med rekursjon if(bstart-astart > 1) pflette (to, from,astart, bstart-1,level+1,null); // if(bend-bstart>0) pflette (to,from, bstart, bend,level+1,null); // 21

// on backtrack mergesort into one partition // from[astart..bstart-1] and from[bstart..bend] to to[astart..bend] int apek = astart, bpek = bstart, aend = bstart-1, next = astart; while (apek <= aend && bpek <=bend) { if (from[apek] < from[bpek]) { to[next++] = from[apek++]; else { to[next++] = from[bpek++];; // at most one of these loops will now perfom while (apek <= aend) { to[next++] = from[apek++]; while (next <= bend && bpek <= bend) { to[next++] = from[bpek++]; if ( level <= LEVEL_MAX ) fromparent.countdown(); // end pflette 22

Om eksamen Kunnskapsspørsmål: oppg.1 og 2 (synkronisering og Amdahl, Gustafson) Hvordan virker synkronisering oppg.4 ( Semaphore) og 6 ( ulik plassering av setninger og deklarasjoner Skissert et parallelt program oppg. 3 (Goldbach) Lag et sekvensielt og parallelt program oppgavene 5 ( lett ) og 7 (vanskeligere) Ikke til eksamen : bevis en matematisk sats. 74 kandidater til eksamen. LYKKE TIL! 23