TKT-3201 Tietokonearkkitehtuuri 2 Luku 7: Moniytimet, moniprosessorit ja klusterit Adapted from Computer Organization and Design, 4 th Edition, Patterson & Hennessy, 2008 Adapted from slides by Mary Jane Irwin, PSU
Moniprosessorijärjestelmä Moniprosessorijärjestelmä (Multiprocessor) tietokonejärjestelmä, jossa vähintään kaksi prosessoria Processor Processor Processor Cache Cache Cache Interconnection Network Memory I/O Voi tuottaa korkean läpäisyn toisistaan riippumattomille tehtäville #2 Tehtävätason rinnakkaisuus (job-level parallelism, process-level parallelism, tasklevel parallelism) Voi pienentää yhden ohjelman suoritusaikaa, jos ohjelma on erikseen valmisteltu suoritettavaksi moniprosessorissa rinnakkaisprosessointiohjelma
Moniydin-prosessorit Haasteet virrrankulutuksessa ovat pakottaneet muutoksiin mikroprosessoreiden suunnittelussa Vuodesta 2002 lähtien ohjelman vasteajan suhteellinen parannus on hidastunut kertoimesta 1.5/vuosi alle 1.2/vuosi Nykisessä mikroprosessorissa tyypillisesti piilastulla useampi prosessoriydin (core) Chip Multicore microprocessors (CMPs) Ytimien lukumäärän odotetaan tuplaantuvan joka toinen vuosi Product AMD Barcelona Intel Nehalem IBM Power 6 Sun Niagara 2 Cores per chip 4 4 2 8 Clock rate 2.5 GHz ~2.5 GHz? 4.7 GHz 1.4 GHz Power 120 W ~100 W? ~100 W? 94 W #3
Moniprosessorijärjestelmä Jotkut suurempaa suorituskykyä vaativat ongelmat voidaan ratkaista yksinkertaisesti käyttämällä klusteria joukko lähiverkon avulla toisiinsa kytkeytyneitä riippumattomia palvelimia (tai PCkoneita), jotka toimivat yhtenä suurena moniprosessorijärjestelmänä Hakukoneet, web-palvelimet, sähköpostipalvelimet, tietokannat, Haasteena on kehittää rinnakkainen ohjelma (parallel, concurrent), jolla aikaansaadaan korkea suorituskyky silloin kuin prosessoreiden määrä järjestelmässä kasvaa skaalautuminen Vuoronnus, kuorman tasaus, synkronointiaika, kommunikointikuorma #4
Amdahlin laki Nopeutus parannuksen E avulla t o : alkuperäinen suoritusaika ilman parannusta E t E : suoritusaika parannuksen E avulla Oletetaan, että E kiihdyttää tekijällä S (S>1) osan F (F<1) tehtävän suorituksesta. Jäljelle jäävää osaa (1-F) tehtävästä ei saada kiihdytettyä (sarjallinen suoritus) #5
Esim 1: Amdahlin laki nopeutus E = 1 / ((1-F) + F/S) Oletetaan parannus, jonka avulla suoritus on 20x nopeampi, mutta on käytettävissä ainoastaan 25% ohjelmasta nopeutus E = 1/(0.75 + 0.25/20) = 1.31 Jos parannus olisi käytettävissä 15% ohjelmasta? nopeutuse = 1/(0.85 + 0.15/20) = 1.17 Amdahlin laki kertoo, että lineaarisen nopeutuksen aikaansaamiseksi, mikään osa alkuperäisestä laskennasta ei saa olla sarjallista! Käytetään 100 prosessoria, jolloin nopeutuksen 90 saamiseksi alkuperäisessä ohjelmassa voi olla sarjallisesti suoritettavaa osaa vähemmän kuin 0.1% nopeutuse = 1/(.001 +.999/100) = 90.99 #7
#9 Esim 2: Amdahlin laki nopeutus E = 1 / ((1-F) + F/S) Oletetaan 10 skalaarimuuttujan summaus ja kahden 10x10 matriisin summaus (matriisien summa) käyttäen 10 prosessoria? nopeutus E = 1/(10/110 + 100/110*1/10) = 1/0.1819 = 5.5 Jos käytössä olisi 100 prosessoria? nopeutus E = 1/(.091 +.909/100) = 1/0.10009 = 10.0 Jos käytettäisiin 100x100 matriiseja (tai suoritetaan kaikkiaan 10 010 summausta) 10:llä prosessorilla? nopeutus E = 1/(.001 +.999/10) = 1/0.1009 = 9.9 Jos käytössä olisi 100 prosessoria? nopeutus E = 1/(.001 +.999/100) = 1/0.01099 = 91
#10 Skaalautuminen Vahva skaalautuminen Nopeutusta saadaan lisäämällä prosessoreiden määrää ilman ongelman koon kasvattamista Heikko skaalautuminen Nopeutusta aikaansaadaan ainoastaan kasvattamalla ongelman kokoa prosessoreiden määrän lisäyksen suhteessa Kuorman tasaus tärkeä tekijä Yksi prosessori kaksinkertaisella kuormalla muihin verrattuna pienentää nopeutuksen melkein puoleen 10 skalaarin summaus ja 100x100 matriisin summaus 100:lla prosessorilla, mutta yhdellä prosessorilla 2% kokonaiskuormasta: t E = 10t add + max(200t add, 9800t add /99); nopeutus E = t 0 /t E = 10010t add / 210t add = 48 (tasaisella kuormalla 91)
Moniprosessori/klusteri: pääpiirteet Q1 miten data jaetaan? Q2 miten toiminta koordinoidaan? Q3 kuinka skaalattava arkkitehtuuri on? Kuinka monta prosessoria tuetaan? #11
Jaetun muistin moniprosessori Shared Memory Multiprocessor (SMP) #12 Q1 yksi muistiavaruus, joka jaetaan kaikkien prosessoreiden kesken Q2 prosessorit koordinoivat toimintansa/kommunikoivat muistissa olevien jaettujen muuttujien avulla Jaetun datan käyttö on koordinoitava synkronointiprimitiiveillä (lukitusmekanismi), joka sallii vain yhden prosessorin kerrallaan viittaamaan jaettuun dataan sama lyhenne: Symmetric multiprocessing Kaksi tai useampaa samanlaista prosessoria jakaa yhden päämuistin ja järjestelmää ohjaa yksi käyttöjärjestelmäinstanssi
Jaetun muistin moniprosessori kaksi pääluokkaa yhtenäinen muistiviittaus: (uniform memory access, UMA) Päämuistin hakuaika on sama kaikille prosessoreille ja kaikille päämuistin muuttujille epäyhtenäinen muistiviittaus: (nonuniform memory access, NUMA) Päämuistin hakuaika erilainen eri prosessoreille ja eri muuttujille NUMAn ohjelmointi on hankalampaa NUMA voi skaalautua paremmin ja tarjota paikalliseen muistiin pienemmän latenssin Local mem Local mem Local mem #13
100000 luvun summaus 10- prosessorin SMP:llä Prosessorit aloittavat silmukalla, joka summaa prosessorille annetun osan vektorista A (vektorit A ja sum ovat jaettuja muuttujia, Pn on prosessorin indeksi, i on paikallinen muuttuja). Prosessorit koordinoivat välisummien yhteenlaskun (half on paikallinen muuttuja, alustettu arvoon 10 (prosessoreiden lukumäärä)) sum[pn] = 0; for (i = 10000*Pn; i< 10000*(Pn+1); i = i + 1) sum[pn] = sum[pn] + A[i]; repeat synch(); if (half%2!= 0 && Pn == 0) sum[0] = sum[0] + sum[half-1]; half = half/2; /*synchronize first if (Pn<half) sum[pn] = sum[pn] + sum[pn+half]; until (half == 1); /*final sum in sum[0] #14 Puomisynkronointi (barrier synchronization) synkronointimenetelmä, jossa prosessorit odottavat, että kaikki ovat saavuttaneet synkronointikohdan
Esim. 10:llä prosessorilla sum[p0] sum[p1] sum[p2] sum[p3] sum[p4] sum[p5] sum[p6] sum[p7] sum[p8] sum[p9] P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 half = 10 P0 P1 P2 P3 P4 half = 5 P0 P1 prosessoreiden kuormitus epätasainen half = 2 P0 half = 1 #15
Sanomanvälitys-moniprosessori Message Passing Multiprocessors (MPP) Jokaisella prosessorilla oma yksityinen osoiteavaruutensa Q1 prosessorit jakavat dataa lähettämällä ja vastaanottamalla tietoa (sanomanvälitys) Q2 koordinaatio on sisäänrakennettu sanomanvälitysprimitiiveihin (sanoman lähetys ja sanoman vastaanotto) Processor Processor Processor Cache Cache Cache Memory Memory Memory #16 Interconnection Network
#17 100000 luvun summaus 10- prosessorin MPP:lla Aloitetaan hajauttamalla 10000 vektorin A elementtiä jokaisen prosessorin paikalliseen muistiin ja summataan elementit välisummiksi rinnakkain. Prosessorit koordinoivat yhdessä välisummien yhteenlaskun (Pn on prosessorin indeksi, send(x,y) lähetää arvon y prosessorille x ja receive() vastaanottaa arvon) sum = 0; for (i = 0; i<10000; i = i + 1) sum = sum + Al[i]; /* sum local array subset half = 10; limit = 10; repeat half = (half+1)/2; /*dividing line if (Pn>= half && Pn<limit) send(pn-half,sum); if (Pn<(limit/2)) sum = sum + receive(); limit = half; until (half == 1); /*final sum in P0 s sum
Esimerkki 10:llä prosessorilla sum sum sum sum sum sum sum sum sum sum P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 send half = 10 limit = 10 P0 P1 P2 P3 P4 send receive half = 5 limit = 5 P0 P1 P2 send receive half = 3 limit = 3 P0 P0 receive P1 send receive half = 2 limit = 2 half = 1 #18
Sanoman välityksen edut ja haitat Sanoman lähetys ja vastaanotto on huomattavasti hitaampaa kuin laskenta, esim. summaus MPP-laitteisto on huomattavasti helpompi suunnitella Ei tarvetta huolehtia esim. välimuistin koherenssiudesta Etu ohjelmoijalle: kommunikoinnin selkeys Vähemmän suorituskyky-yllätyksiä kuten SMP:n yhteydessä välimuistien koherenssin säilyttämisestä aiheutuvat päivitykset Sanomanvälitys-standardi MPI-2 (www.mpi-forum.org ) Sarjallisen ohjelman porttaaminen MPP:lle on hankalaa, koska jokainen kommunikointitapahtuma täytyy identifioida etukäteen Koherentilla välimuistilla varustettu jaettu muisti huolehtii itse ajoaikana mitä dataa tarvitsee siirtää #19
Työasemaklusterit Networks of Workstations (NOWs) Clusters Klusteri koostuen kaupallisista tietokoneista, jotka on kytketty toisiinsa käyttäen tietokoneen I/O-väylää Alhaisempi kaistanleveys kuin moniprosessoreilla, jotka käyttävät prosessori-muistiväyliä Käytetään hitaampia verkkolinkkejä enemmän I/O-liikenteestä johtuvia konflikteja N prosessorilla varustetussa klusterissa on N käyttöjärjestelmäkopiota, mikä rajoittaa sovelluksille käytettävissä olevan muistin määrää Parempi saatavuus ja laajennettavuus Yksittäinen kone voidaan vaihtaa ilman koko järjestelmän alasajoa Mahdollistaa nopean inkrementaalisen laajentamisen kustannustehokas #20
Grid Computing Erillisiä verkkoyhteydellä varustettuja tietokoneita Esim. Internet-yhteys Työyksiköt lähetetään verkkoon ja tulokset lähetetään takaisin keskukselle Voi hyödyntää tietokoneen joutoaikaa Esim. SETI@home, World Community Grid #21
Monisäikeistys Multithreading on A Chip Yritetään kätkeä todellisista datariippuvuuksista, välimuistin hudeista ja haarautumisista aiheutuva liukuhihnan sakkaus hakemalla suoritukseen käskyjä (muista prosessisäikeistä), jotka ovat sakkauksen aiheuttavista käskyistä riippumattomia Monisäikeistys laitteistolla kasvatetaan piirin resurssien käyttöastetta sallimalla useamman prosessin (säikeen) jakaa prosessorin funktioyksiköitä Prosessorin pitää kopioida jokaisen säikeen osalta laitteiston tila jokaisella säikeellä tulee olla talletustilaa: rekisteritiedosto, ohjelmalaskuri, käskypuskuri, tallennuspuskuri Välimuistit, TLB, BHT, BTB, RUU voidaan jakaa (vaikkakin hutisuhde saattaa kasvaa jos näitä ei ole mitoitettu ajettavien säikeiden määrälle) Muisti voidaan jakaa virtuaalimuistimekanismeilla Laitteiston tulee tukea tehokasta säikeen tilan vaihtoa #22
Monisäikeistetty arkkitehtuuri ohjelmisto laitteisto säie Hardware Context rekisterit Hardware Context rekisterit Hardware Context rekisterit puskurit puskurit puskurit ohjelmalaskuri ohjelmalaskuri ohjelmalaskuri RUNNING WAITING READY Context Selection FU väylät FU FU #23
Säikeistys Hienorakeinen (fine-grain) vaihdetaan säiettä jokaisella käskyjaksolla Kiertävä säikeiden vuoronnus (skipataan sakkaavat käskyt, jotka odottavat operaation valmistumista) Prosessorin on pystyttävä vaihtamaan säiettä jokaisella kellojaksolla etu pystyy kätkemään sekä lyhyen että pitkän latenssin sakkauksia haitta hidastaa yksittäisen säikeen suoritusta, koska säiettä vaihdetaan kellojakson välein Karkearakeinen (coarse-grain) vaihdetaan säiettä ainoastaan kalliin sakkauksen yhteydessä (esim. L2- välimuistin huti) etu säikeen vaihdon ei tarvitse olla nopea haitta rajoittunut, liukuhihnan uudelleenkäynnistys kallis operaatio Liukuhihna on tyhjennettävä ja täytettävä uudelleen jokaisen säikeen vaihdon yhteydessä #24
Simultaneous Multithreading (SMT) Monisäikeistyksen variaatio, jossa käytetään superskalaariprosessorin resursseja hyödyntämään sekä ohjelman käskytason että säie-tason rinnakkaisuutta (threadlevel parallelism, TLP) Useimmissa SS -prosessoreissa enemmän konetason rinnakkaisuutta kuin useimman ohjelmat voivat tehokkaasti hyödyntää (eli ILP pienempi kuin koneen rinnakkaisuus) Rekisterin uudelleen nimeämisen ja dynaamisen vuoronnuksen avulla useampia käskyjä toisistaan riippumattomista säikeistä voidaan asettaa suoritukseen ilman riippuvuuksien tarkastusta Intel kutsuu Pentium 4 SMT nimellä hyperthreading Tukee kahta säiettä (tuplaa arkkitehtuurin tilamuuttujat) #25
4-tie SS-prosessorin säikeistys, esim. Issue slots Coarse MT Fine MT SMT Thread A Thread B Time Thread C Thread D #26
Flynn:n luokittelu SISD single instruction, single data stream Yksi prosessoriydin (uniprocessor) SIMD single instruction, multiple data streams Yksi ohjausyksikkö lähettää operaation useammalle datapolulle MISD multiple instruction, single data Tällaisia koneita ei tunneta (joissain lähteissä vektorikoneet luokitellaan tähän) MIMD multiple instructions, multiple data streams moniprosessori (SMP, MPP, klusteri, NOW) Nyttemmin vanhentunut luokittelu, paitsi... #27
SIMD -prosessorit PE PE PE PE PE PE PE PE Control PE PE PE PE PE PE PE PE Yksi ohjausyksikkö (ohjelmakoodista vain yksi kopio) Useampi datapolku (prosessointielementti PE) toimii rinnakkain #28 Q1 PE:t kytketty toisiinsa ja ne vaihtavat/jakavat dataa ohjausyksikön käskyjen mukisesti Q2 jokainen PE suorittaa saman operaation omalle paikalliselle datalleen
Multimedia-SIMD -laajennukset Eniten käytetty SIMD-variaatio löytyy nykyisin melkein kaikista mikroprosessoreista Käskykantaan lisätyt MMX- ja SSE käskyt multimediasovellusten suorituskyvyn kasvattamiseksi Yksi leveä ALU on partitioitu useammaksi pienemmäksi rinnakkain toimivaksi ALU:ksi 16-bit 8-bit summain 32-bit 8-bit summain 16-bit 8-bit summain 8-bit summain summain summain summain Lataukset ja talletukset ovat yhtä leveitä kuin levein ALU, joten sama datan siirto voi käsitellä yhtä 32-bittistä arvoa tai kahta 16-bittistä arvoa tai neljää 8-bittistä arvoa Nykyisin x86 ISA sisältää satoja SSE käskyjä multimediaoperaatioiden tukemiseen #29
Vektoriprosessorit vektoriprosessorissa (esim. Cray) ALU on liukuhihnoitettu hyvän suorituskyvyn aikaansaamiseksi alemmalla kustannuksella Tarvitaan joukko vektorirekistereitä operandien tulosten tallettamiseen Kerätään dataelementit muistista, talletetaan ne oikeaan järjestykseen rekisterijoukkoon, operaatiot suoritetaan sarjallisesti rekisterioperandeille ja tulokset kirjoitetaan takaisin muistiin Tällä periaatteella suunniteltiin 80- ja 90-lukujen supertietokoneet Ajatellaan vektorilaajennusta MIPS:n käskykantaan (VMIPS), esim. addv.d : summaa kaksi double precision -arvoa vektorirekisteristä addvs.d, mulvs.d : summaa (tai kerro) skalaarirekisterin arvo jokaisella vektorirekisterin elementillä lv, sv : vektorilataus ja tallennus double precision datalle #30
MIPS vs VMIPS DAXPY-koodi: Y = a X + Y l.d $f0,a($sp) ;load scalar a addiu r4,$s0,#512 ;upper bound to load to loop: l.d $f2,0($s0) ;load X(i) mul.d $f2,$f2,$f0 ;a X(i) l.d $f4,0($s1) ;load Y(i) add.d $f4,$f4,$f2 ;a X(i) + Y(i) s.d $f4,0($s1) ;store into Y(i) addiu $s0,$s0,#8 ;increment X index addiu $s1,$s1,#8 ;increment Y index subu $t0,r4,$s0 ;compute bound bne $t0,$zero,loop ;check if done l.d $f0,a($sp) ;load scalar a lv $v1,0($s0) ;load vector X mulvs.d $v2,$v1,$f0 ;vector-scalar multiply lv $v3,0($s1) ;load vector Y addv.d $v4,$v2,$v3 ;add Y to a X sv $v4,0($s1) ;store vector result #31
Vektorikone vs skalaarikone Käskynhaun ja dekoodauksen kaistanleveys dramaattisesti pienempi (säästää energiaa) #32 64-elementtinen DAXPY: VMIPS:ssä 6 käskyä vs. ~600 MIPS:ssä Laitteiston ei tarvitse tarkkailla hasardeja vektorikäskyissä. Vektorikäsky sakkaa ainoastaan ensimmäisen elementin kohdalla, loput ilman pysähdyksiä Ohjaushasardeja ei ole MIPS sakkaa n. 64 kertaa useammin kuin VMIPS DAXPY -käskyn yhteydessä Data-tason rinnakkaisten sovellusten kirjoittaminen on helpompaa Muistin viittauskuvio tiedetään etukäteen, joten lomitettu rinnakkaismuisti toimii hyvin Muistin latenssista aiheutuva kustannus näkyy ainoastaan kerran koko datavektorille
Grafiikkaprosossorit Graphics Processing Units (GPU) GPU on kiihdytin, joka täydentää keskusprosessoria GPU:n ei tarvitse pystyä suorittamaan kaikkia CPU:n tehtäviä; GPU:n kaikki resurssit on räätälöity grafiikkasovelluksiin GPU datatyyppejä ovat (x, y, z, w) koordinaatit ja kuvapisteen (pixel) (red, green, blue, alpha) värikomponentit GPU suorittaa monia säikeitä rinnakkain (vertex ja pixel shading) in parallel hyvin paljon data-tason rinnakkaisuutta Nykyinen trendi kohti yleiskäyttöisiä GPU-prosessoreita CPU-GPU -yhdistelmä heterogeeninen moniprosessointi CPU sarjallinen koodi, GPU rinnakkainen koodi Ohjelmointikieliä/-rajapintoja DirectX, OpenGL C for Graphics (Cg), High Level Shader Language (HLSL) Compute Unified Device Architecture (CUDA) OpenCL Laaja joukko SIMD-käskyjä; suuntaus kohti moniydin-arkkitehtuureja #33
#34 Grafiikka tietokonejärjestelmässä
NVIDIA Tesla Streaming multiprocessor 8 Streaming processors #35
Kytkentäverkot Verkkotopologia prosessoreiden, kytkimien ja linkkien järjestys Bus Ring N-cube (N = 3) 2D Mesh Fully connected #36
Kytkentäverkon suorituskyky Verkon kustannus Kytkimien lukumäärä Kytkimen verkkoon liittyvien (kaksisuuntaisten) linkkien lukumäärä (plus yksi linkki prosessoriin kytkeytymiseen) Linkin leveys biteissä, linkin langoituksen pituus (piirillä) Verkon kaistanleveys (network bandwidth, NB) esittää parasta tapausta Kunkin linkin kaistanleveys * linkkien lukumäärä Puolittajan kaistanleveys (bisection bandwidth, BB) lähempänä pahinta tapausta Jaa kone kahteen osaan, joissa kummassakin puolet solmuista, ja laske yhteen jakolinjan ylittävien linkkien kaistanleveydet Muita kytkentäverkon suorituskykyyn liittyviä seikkoja kuormittamattoman verkon lähetyksen ja vastaanoton latenssi läpäisy aikayksikössä lähetettyjen sanomien max. lukumäärä Pahimman tapauksen reitityshyppyjen lukumäärä, ruuhkan ohjaus ja viive, vikasietoisuus, energiatehokkuus #37
Väylä kaksisuuntainen verkkokytkin prosessorisolmu N prosessoria, 1 kytkin ( ), 1 linkki (väylä) vain 1 datasiirto kerrallaan NB = linkin (väylä) kaistanleveys * 1 BB = linkin (väylä) kaistanleveys * 1 #38
Rengas N prosessoria, N kytkintä, 2 linkkiä/kytkin, N linkkiä N samanaikaista siirtoa NB = linkin_kaistanleveys * N BB = linkin_kaistanleveys * 2 Jos linkki on yhtä nopea kuin väylä, rengas on ainoastaan 2 kertaa nopeampi kuin väylä pahimmassa tapauksessa, mutta N kertaa nopeampi parhaassa tapauksessa #39
Täysinkytketty N prosessoria, N kytkintä, N-1 linkkiä/kytkin, (N*(N-1))/2 linkkiä N samanaikaista siirtoa NB = linkin_kaistaneveys * (N * (N-1))/2 BB = linkin_kaistanleveys * (N/2) 2 #40
Ristikytkin (crossbar, Xbar) N prosessoria, N 2 kytkintä (yksisuuntaisia), 2 linkkiä/kytkin, N 2 linkkiä N samanaikaista siirtoa NB = linkin_kaistanleveys * N BB = linkin_kaistanleveys * N/2 #41
Hyperkuutio (Binary N-cube) 2-cube 3-cube #42 N prosessoria, N kytkintä, logn linkkiä/kytkin, (NlogN)/2 linkkiä N samanaikaista siirtoa NB = linkin_kaistanleveys * (NlogN)/2 BB = linkin_kaistanleveys * N/2
2D ja 3D Mesh/Torus #43 N prosessoria, N kytkintä, 2, 3, 4 (2D torus) tai 6 (3D torus) linkkiä/kytkin, 4 N/2 linkkiä tai 6 N/2 linkkiä N samanaikaista siirtoa NB = linkin_kaistanleveys * 4N tai linkin_kaistanleveys * 6N BB = linkin_kaistanleveys * 2N 1/2 tai linkin_kaistanleveys * 2N 2/3
Kytkentäverkkojen vertailua 64:n prosessorin järjestelmä Network bandwidth Bisection bandwidth Total # of switches Links per switch Total # of links (bidi) Bus Ring 2D Torus 6-cube Fully connected 1 1 1 1 64 2 64 2+1 64+64 256 16 64 4+1 128+64 192 32 64 6+7 192+64 2016 1024 64 63+1 2016+64 #44
#45 Monitasoiset kytkentäverkot Multistage Networks