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

Like dokumenter
UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Prøveeksamen INF2440 v 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

Arne Maus OMS, Inst. for informatikk

UNIVERSITETET I OSLO

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

INF NOV PARALLELL SORTERING. Arne Maus, PSE, Ifi

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, våren2014 Avsluttende om matrisemultiplikasjon og The Java Memory Model + bedre forklaring Radix. Arne Maus OMS, Inst.

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

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

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

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

UNIVERSITETET I OSLO

INF2440 Uke 5, våren2017. 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

INF1010 Tråder II 6. april 2016

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

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

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

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

INF1000: noen avsluttende ord

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

Sortering med tråder - Quicksort

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

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

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

UNIVERSITETET I OSLO

Kap 19. Mer om parallelle programmer i Java og Kvikksort

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

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

Avdeling for ingeniørutdanning Institutt for teknologi

IN1010 våren Repetisjon av tråder. 15. mai 2018

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

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

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

INF Notater. Veronika Heimsbakk 10. juni 2012

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

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

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

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

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

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

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

løsningsforslag-uke5.txt

La oss begynne med en repetisjon av hva som skjer når du kjører Javaprogrammet

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Forelesning inf Java 5

Forelesning inf Java 5

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Løsningsforslag til eksamen i INF1000 våren 2006

Jentetreff INF1000 Debugging i Java

UNIVERSITETET I OSLO

INF 1000 høsten 2011 Uke september

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

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

Løse reelle problemer

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

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

UNIVERSITETET I OSLO

INF1000 oppgaver til uke 38 (17 sep 23 sep)

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

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

MER OM PARALLELLE PROGRAMMER I JAVA OG KVIKKSORT

Operativsystemer, prosesser og tråder

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

GUI («Graphical User Interface») del 2

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

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

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I OSLO

Forelesning inf Java 4

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

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

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

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

UNIVERSITETET I OSLO

Transkript:

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

Prøveeksamen Er en modell av hva du får til eksamen: - like mange (+-1) oppgaver som eksamen og nesten samme type oppgave på samme sted. - Prøveeksamen er grovt sett de oppgavene i to oppgavesett som ikke var gode nok til å komme med til eksamen. - Dette oppgavesettet har 160 poeng totalt dvs 4*60min/160= 1 min og 30 sek. per. poeng - dvs. 15 min på oppgave 1 - Flere trykkfeil i prøveeksamen enn i eksamens-settet: Navnet på kurset: Effektiv parallellprogrammering ikke: Praktisk parallell programmering tidspunktene gale: Utdeling 11.00 og gjennomgang 15.15. Skal være som hjemmesida: Utdeling 10.15 og gjennomgang : 14.15 En av oppgavene (3c) står det kan puffes. Det betyr at du bare får E på dette punktet hvis det er blankt (ikke F) 2

Appendix: Modell2 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(runtime.getruntime().availableprocessors()); 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

Husk ikke skriv all kode 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 datadeklarasjonene, skriv med kommentar i koden hvilke områder (A eller B) i vedlegget du tenker disse plassert. Du kan eventuelt lage en ny konstruktør i class Arbeider hvis du trenger det. 4

Oppgave 1 (10 poeng) Når main-tråden pluss de k trådene vi har i et parallelt program alle synkroniserer med en CyclicBarrier a = new CyclicBarrier(k), beskriv kortfattet ulike varianter av hva som da kan skje (hvem venter, hvem fortsetter). Svar: De k første trådene som greier å slippe samtidig igjennom barrieren, den ene som kommer sist blir hengende å vente (og programmet vil ikke terminere). Etter all sannsynligvis vil main-tråden slippe gjennom barrieren, og det er én av de nystartede trådene som henger feil uansett. Dvs. gal kode skulle vel vært a = new CyclicBarrier(k+1); eller at main-tråden ikke deltok i synkroniseringen. 5

Oppgave 2 ( 15 poeng) Forklar kortfattet de tre kravene ( lovene ) vi har når vi har felles, globale variable (eks int a,b;) som minst to tråder ønsker å lese og/eller skrive på disse variablene. Når er det sikkert å lese, og når er det sikkert å skrive på disse variablene fra trådene som kjører i parallell? Uke 4: A) Hvis ingen skriver på en felles variabel, kan alle lese samtidig uten synkronisering. B) Hvis to tråder vil skrive på en felles variabel, må slik skriving synkroniseres (f.eks med en synchronized metode i et felles objekt eller en felles ReentrantLock) C) Hvis én tråd skriver på en felles variabel må ingen andre tråder lese denne variabelen Regel B) kan brytes hvis det er likegyldig hvilken av trådene som får skrive og ingen feil oppstår hvis noen leser gammel eller annen verdi. 6

Oppgave 3 (25 poeng) Effektivisér og parallelliser summering av alle elementer i int[][] a. long tid = System.nanoTime(); long sum =0; for (int i = 0; i < n; i++){ long s =0; for (int j = 0 ; j < n; j++){ s += a[j][i]; sum +=s; double seqtid = (System.nanoTime() tid)/ 1000000.0 System.out.println ("Sum av a["+n+"]["+n+"]="+sum+ ", paa:"+seqtid +" msek"); To ineffektiviter: a) Arrayen a[][] leses kolonne-vis ikke radvis (følg cache-linjene) IKKE: s += a[j][i]; men: s += a[i][j]; b) Løkker som er inne i lang kode bør pakkes inn i små metoder (JIT komp.) 7

Løsningsskisse oppg. 3 - sekvensiell Mange mulige løsninger for å lage metode av deler av koden, denne kan jeg nytte på i sekvensiell og parallell løsning. // sum langs radene for (int i = 0; i<n; i++){ sum += radsum(a[i]); long radsum (int [] a ) { long sum =0; for (int j = 0 ; j < a.length; j++) { sum += a[j]; return sum; // end radsum Speedup 100 sammenlignet med første kode (N=25 000) 8

A Oppg. 3 parallell (speedup ca. 210, n=25 000, k=8) int numthreads = Runtime.getRuntime().availableProcessors(); Thread t []= new Thread [numthreads]; long[] svar = new long [numthreads]; long sum =0; CyclicBarrier synk= new CyclicBarrier(numThreads) ;. for (int tr = 0; tr < numthreads; tr++) t[tr] = new Thread(new Para(tr)); tid = System.nanoTime(); for (int i=0; i< numthreads; i++) t[i]. start(); try{ for (int i = 0; i< numthreads; i++) t[i].join(); catch(exception e) {; class Para implements Runnable{ int ind; B int left, right, part; Para(int i, int met ) { ind =i; part = n/numthreads; left = ind*part; right = left+part ; if (ind == numthreads-1) right = n; public void run() { long s = 0; for (int i=left; i < right; i++) { s+= radsum(a[i]); svar[ind] = s; try{ synk.await(); catch (Exception e) { return; if (ind == 0) { for (int i = 0; i < numthreads; i++) { sum+= svar[i]; // end run 9

ArraySum numthreads:8 Inline i loop, kolonnevis sum= 7812542677079, n= 25000, paa: 32349.967 msek Egen metode, radvis, n=25000, speedup: 104.73 Para: Egen Metode,radvis, n=25000, paa: 158.18 msek, Speedup: 204.51 10

Oppg. 4 hvor lange ord bruker Ibsen og hvor ofte? 1) Lag en sekvensiell metode som leser String [] ordene og som lager en tabell over: den %-vise delen av ordbruken som hadde lengde = 1 (ordene å og i ) den %- vise delen av ordbruken som hadde lengde = 2.. den %- vise delen av ordbruken som hadde lengde = 20. N.B. Hver bruk av et ord teller da med, slik at i f.eks. setningen: «Å å å så glad jeg skal bli.» har tre av 8 ord lengde = 1, ett ord har lengde = 2, to har lengde =3 og to har lengde =4, og dette skal oppgis slik at 37,5% har lengde =1, osv. 2) Skriv en parallellversjon av løsningen. 11

Oppgave 4 sekvensiell class IbsenFrekvens{ int numthreads; A final static int MAX_LEN = 21; int [] antall = new int[max_len]; int[][] traadsvar; int [] parantall= new int[max_len]; CyclicBarrier synk = new CyclicBarrier(numThreads); String[]ordene ={"En","stue","på","Østråt", "Gennem","den", "åbne", int n = ordene.length; void laganalyse (int [] tab, int left, int right){ for (int i = left ; i < right; i++){ tab[ordene[i].length()]++;.. long tid = System.nanoTime(); laganalyse (antall,0,ordene.length); tid = System.nanoTime() - tid; for (int j = 1; j < MAX_LEN; j++) System.out.println("Ord med len = «+Format.align(j,2)+" er: "+ Format.align((antall[j]*100.0/n),6,2)+"% av alle ord"); 12

Oppgave 4 parallell B class Para extends Thread { int ind; int left, right, part; int localtab[] = new int[max_len]; public void run() { laganalyse (localtab, left, right); traadsvar[ind] = localtab; try{ synk.await(); catch (Exception e) { return; if (ind == 0) { for (int i = 0; i < numthreads; i++) { int ant =0; for (int j = 0; j < MAX_LEN; j++){ ant += traadsvar[i][j]; parantall[i] = ant; // ind == 0 // end run 13

Sekvensiell: antall ord:64, paa: 0.012 msek Ord med len = 1 er: 3.12% av alle ord Ord med len = 2 er: 17.19% av alle ord Ord med len = 3 er: 26.56% av alle ord Ord med len = 4 er: 7.81% av alle ord Ord med len = 5 er: 17.19% av alle ord Ord med len = 6 er: 4.69% av alle ord Ord med len = 7 er: 6.25% av alle ord Ord med len = 8 er: 9.38% av alle ord Ord med len = 9 er: 1.56% av alle ord Ord med len = 10 er: 3.12% av alle ord Ord med len = 11 er: 3.12% av alle ord Ord med len = 12 er: 0.00% av alle ord Ord med len = 13 er: 0.00% av alle ord Ord med len = 14 er: 0.00% av alle ord Ord med len = 15 er: 0.00% av alle ord Ord med len = 16 er: 0.00% av alle ord Ord med len = 17 er: 0.00% av alle ord Ord med len = 18 er: 0.00% av alle ord Ord med len = 19 er: 0.00% av alle ord Parallell: antall ord:64, paa: 1.163 msek, speedup :0.0105 Ord med len = 1 er: 3.12% av alle ord Ord med len = 2 er: 17.19% av alle ord Ord med len = 3 er: 26.56% av alle ord Ord med len = 4 er: 7.81% av alle ord Ord med len = 5 er: 17.19% av alle ord Ord med len = 6 er: 4.69% av alle ord Ord med len = 7 er: 6.25% av alle ord Ord med len = 8 er: 9.38% av alle ord Ord med len = 9 er: 1.56% av alle ord Ord med len = 10 er: 3.12% av alle ord Ord med len = 11 er: 3.12% av alle ord Ord med len = 12 er: 0.00% av alle ord.. 14

Oppgave 5 finn de to sorterte radene i a[][] - sekv class FinnToSorterte{ int numthreads; int [][] a; int n; ReentrantLock lock = new ReentrantLock (); int [] answer = new int[2]; int numfound = 0;. boolean update (int radnum) { lock.lock(); // block until condition holds try { answer[numfound ++]=radnum; finally { lock.unlock(); return numfound == 2; // end update boolean radtest (int [] aa ) { for (int j = 1 ; j < a.length; j++){ if ( aa[j-1] > aa[j]) return false; return true; // end radsum long tid = System.nanoTime(); // sum langs rad for (int i = 0; i<n; i++){ if (radtest(a[i]) && update(i)) break; tid = System.nanoTime() - tid; double seqtid = (tid/1000000.0); System.out.println (" Sekvensiell, n=" + n +", 1.sort:"+answer[0]+ ", 2.sort:"+answer[1]+", paa:"+ Format.align(seqTid, 6,2)+"ms." ); 15

Oppg.5 parallell: class Para implements Runnable{ int ind; int left, right, part; Para (int i ) { ind =i; part = n/numthreads; left = ind*part; right = left+part ; if (ind == numthreads-1) right = n; public void run() { for (int i = left; i<right; i++){ if (radtest(a[i]) && update(i) ) break; // end run // end Para 16

FinnToSorterte numthreads:8 Sekvensiell, n=20000, 1.sort:13638, 2.sort:16906, paa: 2.26ms. Parallell, n=20000, 1.sort:13638, 2.sort:16906, paa: 1.38ms., Speedup: 1.64 17

Oppg 6, Beste k= antall tråder, gitt antall kjerner class BesteAntTraader{ int [] a; int n,k; long sum, fasitsum; long [] svar ; CyclicBarrier synk ; int kk = Runtime.getRuntime(). availableprocessors(); Thread t []= new Thread [3*kk]; double [] seqtid = new double[11], paratid = new double[11]; svar = new long [3*kk]; long radsum (int [] a, int l, int r ) { long s =0; for (int j = l ; j < r; j++) s += a[j]; return s; // end radsum. long tid = System.nanoTime(); fasitsum = radsum(a,0,n); tid = System.nanoTime() - tid; seqtid [m] = (tid/1000000.0); 18

Oppg. 6 parallell for ( k = 1; k < 3*kk; k++) { sum =0; tid = System.nanoTime(); for (int tr = 0; tr < k; tr++) (t[tr] = new Thread(new Para(tr))).start(); try{ for (int i = 0; i < k; i++){ t[i].join(); catch(exception e) {return;; paratid[m] = (System.nanoTime() - tid)/1000000.0; public void run() { svar[ind] = radsum(a,left,right); try{ synk.await(); catch(exception e) {return; if (ind == 0 ) { for ( int i =0; i < k; i++) { sum += svar[i]; // end run 19

Oppg6 resultater med 8 kjerner 2,5 Antall tråder nyttet til å summere n tall med 8 kjerner 2 Speedup 1,5 1 1000000 10000000 100000000 1000000000 0,5 0 0 1 2 3 4 5 6 7 k - antall 8 tråder 9 10 11 12 13 14 15 16 17 20

Om eksamen Kunnskapsspørsmål:oppg.2 Hvordan virker synkronisering opp 1 Lag et sekvensielt og parallelt program oppgavene 3,4,5 og 6 LYKKE TIL! 21