Uppgift (p) Vid en testkörning på en processor tog ett program sekunder för att lösa ett problem av storlek n. När ytterligare tre processorer lades till krävde samma program sekunder för samma problemstorlek. Hur lång tid tar det att lösa ett problem av storlek n på processorer med detta program, enligt Amdahls lag, och vad blir uppsnabbningen? Hur lång tid tar det att lösa ett problem av storlek n på processorer med detta program, enligt Gustavson- Barsis lag, och vad blir uppsnabbningen? processor: sekunder. 4 processorer: sekunder. s+p=, s+p/4= s=5/, p=4/ Amdahl: s+p/=8 sekunder, speedup=/8=5/ G-B: Seriellt, ggr större: s+*p=5. Parallellt, med processorer: s+*p/=, speedup=5/=5. Rank Manufacturer Computer/Procs NEC Earth-Simulator/ 5 Hewlett-Packard ASCI Q - AlphaServer SC ES45/.5 GHz/ 496 Hewlett-Packard ASCI Q - AlphaServer SC ES45/.5 GHz/ 496 4 IBM ASCI White, SP Power 75 MHz/ 89 5 Linux NetworX MCR Linux Cluster Xeon.4 GHz - Quadrics/ 4 R max R peak 586. 496. 777. 4. 777. 4. 76. 88. 5694. 6. Installation Site Country/Year Earth Simulator Center Japan/ Los Alamos National Laboratory USA/ Los Alamos National Laboratory USA/ Lawrence Livermore National Laboratory USA/ Lawrence Livermore National Laboratory USA/ Inst. type Installation Area Nmax Nhalf Research 75 664 Research 59 6 Research 59 6 Research Energy 5896 79 Research 45 9 Computer Family Computer Type NEC Vector SX6 Compaq AlphaServer Al.Se.-Cluster Compaq AlphaServer Al.Se.-Cluster IBM SP SP Power 75 MHz high node NOW - Intel NOW Cluster - Intel Uppgift (p) Ovanstående tabell visar de första 5 platserna i TOP5-listan för november. Utifrån den hör listan, vilka maskiner kan man vara hyfsat säker på klarar att komma upp i 5 Gflops/s på LINPACK-testet med matriser som är runt x stora? Motivera ditt svar. Här skulle man dels vara klurig, dels förstå Rmax, Nmax samt Nhalf, dels ha snappat upp lite från numeriska-algoritmer-föreläsningen. Generellt sätt kan man säga att en algoritm går snabbare på en parallelldator när datamängden är större. Detta gäller till en viss gräns, sedan, sedan blir problemet för stort för minnet. Bästa sättet att lösa den här uppgiften var en plot. Sedan handlar det om att binda datapunkter, men där har jag godkänt det mesta. I plotten nedan så klarar NEC:en det hela, medan HP:en är på gränsen. De andra ligger under.
9 8 7 Gflops/s 6 5 4 NEC HP IBM Linux Önskat resultat 4 5 6 Storlek Uppgift (p) Förklara begreppen cachekoherens och false sharing? Hur är de kopplade till varandra? Ge ett exempel på programsnutt som skulle kunna drabbas av false sharing. Cachekoherens är inget dåligt, det är något bra Förklara varför det är nödvändigt (cacheminnen ska hålla samma bild av minnet mm), och gärna hur cachekoherens upprätthålls. False sharing uppstår när två eller flera processorer använder olika minnesområden som har råkat hamna på samma cacheline. När då uppdateringar sker, måste alla andra processorer få del av denna (eller invalideras) för att cachekoherensen ska upprätthållas. De flesta har angett något liknande programsnutten nedan: Processor : Processor for (i = ; i < N; i += ) for (i = ; i < N; i += ) a[i] = a[i] * ; a[i] = a[i] * ; Observera att det krävs skrivningar för att man ska kunna observera false-sharingen. Nu är dock risken stor att den ena processorn skenar iväg och hinner före. Då kommer man inte riktigt att se ping-pong-effekten. Ett annat exempel som borde ha större chans (risk) att råka ut för false sharing: void *proc(void *a) { int i; for (i = ; i < ; i++) (int *) a = 6-*(int *) a; main() { int x =, y = ; /* Borde ligga på samma cache-line */ pthread_create(proc,..., &x,...); pthread_create(proc,..., &y,...);...
Uppgift 4 (6p) Antag att strukturen på en beräkning är ett binärt träd med n= d löv (avslutande arbetssteg) och +log n nivåer. Varje nod i trädet består av ett beräkningssteg t b. Kommunikationen mellan två (olika) processorer i beräkningsträdet antas vara konstant, t k. Vad blir den lägre gränsen för exekveringstiden om antal processorer är n? Vad blir den lägre gränsen för exekveringstiden om antal processorer är mindre än n? Här bör man till att börja med tänka på att det krävs bara en kommunikation i varje split, eftersom moderprocessorn tar med sig sitt data till nästa steg. Den som tar längst tid är den sista processorn (n-), där varje steg är kommunikation. Tiden för den blir (d+) t b.+ d t k. Om vi tar bort n/ processorer så måste de två sista stegen utföras av en processor. Dock försvinner ett kommunikationssteg: (d+) t b.+ (d-) t k. Allmänt, om vi har p= e processorer, får vi: (e+) t b.+ e t k.+ (n/p) t b Men om p inte är en jämn två-potens då? Då blir det lite knepigare. De flesta har angett samma tid som om man avrundade antal processorer nedåt till närmsta undre två-potens. Även om det har gett många poäng, så är det ju inte riktigt hela sanningen. Tänk om det bara saknas en processor. Då verkar det ju smartast att den väg som innehåller minst kommunikationssteg får ta extrajobbet, se bilden till höger. Just i det här fallet blir det alltså max((d+) t b, (d+) t b.+ d t k ). (Det är antingen grenen längst till vänster eller grenen längst till höger som tar längst tid.) En generell formel blir nog bökig att ta fram. Sedan var det en student som kom på att det smartaste är förstås dataduplicering i det här fallet. Ingen kommunikation
Uppgift 5 (6p) 5 7 Antag att fem (arbets-)processer (motsvarande nod 5) ska lösa shortest path för grafen till höger med Parallell implementation II (nedan) och Dijkstras termineringsalgoritm. Hur många, och vilka, meddelanden skickas? Rita upp en tidsaxel med kommunikationen. 4 5 Varje hörn är en process. Så fort ett hörn får en ny vikt (startnoden sig själv), skickar den nya avstånd till sina grannar. recv(newdist, PANY); if (newdist < dist) dist = newdist; /* start searching around vertex */ for (j = ; j < n; j++) /* get next edge */ if (w[j]!= infinity) { d = dist + w[j]; send(&d, Pj); /* send distance to proc j */ De som inte har fått full poäng har antingen inte ritat upp en kommunikationsaxel, inte insett att jobben körs parallellt, eller missförstått Dijkstras termineringsalgoritm (se lastbalanseringsföreläsningen). Uppgift 6 (5p) Ta fram en effektiv algoritm för alla-till-alla kommunikation på en hyperkub (pseudokod). Vad blir tidskomplexiteten? Alla-till-alla-kommunikation finns bland annat tydligt beskrivet i MPI-föreläsningen. Många har implementerat all-gather istället. alltoall(iam, d, list) /* d = antal dimensioner */ { n = d ; for (i = d- /* MSB */; i >= ; i--) { newlist = for (j = ; j < n; j++) { if ((iam bit_and ( i ) and not (j bit_and ( i ))) or (not (iam bit_and ( i )) and (j bit_and ( i ))) { /* vi är hög, skicka alla låga listelementnedåt, alternativt vi är låg, skicka höga listelement uppåt */ newlist = newlist + list[j] recv_nowait (newlist, iam xor ( i )) send (newlist, iam xor ( i )) wait_for_recv /* OK, nu har vi gjort utbyte, och fått en ny lista, newlist, som ska sättas in i list */ for (j = k = ; j < n; j++) { 4
if ((iam bit_and ( i ) and not (j bit_and ( i ))) or (not (iam bit_and ( i )) and (j bit_and ( i ))) { list[j] = newlist[k]; k++; I J K L M N O P I varje steg skickas halva listan, dvs: t start + (d-) l t byte Totalt alltså: d (t start + (d-) l t byte ) A B C D E F G H I M K O J N L P Där l är längden på varje element A E C G B F D H C G K O D H L P A E I M B F J N Uppgift 7 (8p) Beskriv Cannon s algoritm för matrismultiplikation och visa hur den kan implementeras med MPI. Vad blir tidskomplexiteten? Antag att alla matriser är n n och processornätet är p p, p n. Cannon finns beskriven på numeriska-algoritmer-föreläsningen. Distrubuera (skifta), och sedan multiplicera, skifta, multiplicera, skifta. Varje block är (n/p) (n/p). Först skiftning: ((n/p) t float + t start + (p-)t hopp ) (:an pga båda A och B-matris. t hopp är den extratid ett meddelande tar om det ska genom flera länkar. t float är tiden för att skicka ett flyttal. Sedan multiplikation: (n/p) t flop Och skift: ((n/p) t float + t start ) Totalt: ((n/p) t float + t start + (p-)t hopp + p ((n/p) t flop + (n/p) t float + t start )) = ((p+) t start + (p-)t hopp + (p+)(n/p) t float + p((n/p) t flop )) Om man ignorerar t start och t hopp får man: O(n /p t float + n /p t flop ) 5
Uppgift 8 (p) Sortera följande lista genom att använda bitonic sort:, 5, 6, 4,,, 8, Se boken. 6