William Sandqvist william@kth.se Övning 8 Minnessystem Lokalitet Cacheminnen William Sandqvist william@kth.se
Datorteknik & komponenter DC F1 DC Ö1 DC F2 DC Ö2 lab dicom Digitala komponenter CE F1 CE F2 CE Ö1 CE F3 CE Ö2 CE F4 CE Ö3 lab nios2time Assemblerprogram CE F5 CE Ö4 hemlab C C CE F6 CE Ö5 CE Ö6 lab nios2io In- och utmatning CE F7 CE Ö7 lab nios2int Avbrott och "trap" CE F8 CE Ö8 hemlab cache Cacheminnen CE F9 CE Ö9 hemlab trådar Trådar, synkronisering CE F10 CE Ö10 tentamen William Sandqvist william@kth.se
Processor-memory performance gap Både processorer och minnen ökar sina prestanda år efter år, men inte alls med samma ökningstakt – ett prestandagap har uppstått! Lösningen på detta problem har blivit uppfinnandet av Cache-minnet. William Sandqvist william@kth.se
William Sandqvist william@kth.se Minneshierarki En tre nivåers minneshierarki. De snabbare minnestyperna används som ”buffertar” mot de långsammare. Principbild William Sandqvist william@kth.se
William Sandqvist william@kth.se SRAM Varje bit i ett CMOS SRAM består av en låskrets uppbyggd av sex MOS-transistorer. William Sandqvist william@kth.se
William Sandqvist william@kth.se DRAM Varje bit i ett DRAM består av en transistor och en minneskonden- sator. En laddad kondensator läcker ut laddningen efter ett tag. Periodiskt måste alla kondensatorer under- sökas och de som har laddning kvar måste då återladdas. Detta kallas för Refresh. Det sköts av kretsar inuti minnet. William Sandqvist william@kth.se
Kondensatorn byggs på djupet Trench Capacitor (trench = dike) En bit i ett DRAM tar samma plats som två MOS-transistorer. En bit i SRAM som sex MOS-transistorer! William Sandqvist william@kth.se
William Sandqvist william@kth.se Burst (skur) Minnet läses i tre steg: ROW, COL, och access. Accesstiden för ett valfritt minnes- ord blir därför tre Bussklock-cykler. Om man läser minnet ”skurvis” (Burst) räknar minnet självt fram adresserna till minnesordets ”grannar”. Resten av minnes- orden i skuren tar då bara en Bussklockcykel. Burst kan tex. vara 2, 4, 8 minnes- ord. William Sandqvist william@kth.se
Burst ger snabbare medelaccess Att hämta 1 ”random” ord i minnet tar tre busscykler 3TBus/ord (varav 2 TBUS är Waitstates) Att hämta en ”Burst” med 2 ord tar 3+1 busscykler, 4/2 = 2TBus/ord Att hämta en ”Burst” med 4 ord tar 3+1+1+1 busscykler, 6/4 = 1,5TBus/ord Att hämta en ”Burst” med 8 ord tar 3+1+1+1+1+1+1+1 busscykler, 10/8 = 1,25TBus/ord Det gäller dock att ha användning för alla hämtade ord – annars slösar man bussklockcykler med Burst-metoden! Detta är ett principiellt resonemang. Gäller både SRAM och DRAM. Andra accessmönster förekommer, tex. 5+3+3+3 osv. TBUS = 10*TCPU är valt som exempel. William Sandqvist william@kth.se
William Sandqvist william@kth.se Cacheminnet Cacheminnet kan hålla en liten del av huvudminnets innehåll. Processorn hämtar sin information från Cacheminnet, men om informationen saknas där (= Cache-miss), överförs den tillsam- mans med ett helt Cache-block från huvudminnet till Cache-minnet. Blockvis läsning av huvudminnet ger lägre genomsnittlig accesstid, men man måste ha nytta av de övriga orden i blocket … Chansen att övriga ord i blocket kommer till användning beror av … Tidslokalitet En minnescell som blivit accessad nyligen kan bli accessad snart igen. Rumslokalitet De minnesceller som har adresser nära en som nyligen accessats har större chans att bli accessade. William Sandqvist william@kth.se
Cache – Adressavbildning De flesta huvudminnen är Byteorganiserade, men eftersom huvudminnet accessas blockvis brukar det bli enklare om man ritar det som en följd av Minnesblock. Direkt adressavbildning: Minnesblock: i Cacheblock: j = i % K Minnesblocket i avbildas på Cacheblocket j tills Cache-minnet tar slut – då börjar det om från Cache- minnets början. Två Minnesblock som avbildas på samma Cache- block kan inte användas samtidigt – det ena ”knuffar ut” det andra. William Sandqvist william@kth.se
William Sandqvist william@kth.se Hitrate och accesstid Man önskar en genomsnittlig acesstid tAVG = 8 ns från ett minne som har acesstiden tM = 70 ns och ett cacheminne med acesstiden tC = 5 ns. Vilken hitrate krävs? h = ? ( h är hitrate). William Sandqvist william@kth.se
William Sandqvist william@kth.se Beräkning av hitrate Önskas tAVG 8 ns Med hitrate 95% blir medelaccesstiden 8 ns trots att vi använder ett långsamt main memory med accesstiden 70 ns ! William Sandqvist william@kth.se
William Sandqvist william@kth.se 8.1 Blockstorlek 4 ord Ställ in 15 som Accesstime i simulatorn William Sandqvist william@kth.se
William Sandqvist william@kth.se 8.1 Blockstorlek 2 ord Ställ in 20 som Accesstime i simulatorn William Sandqvist william@kth.se
William Sandqvist william@kth.se 8.1 I-cache och D-cache William Sandqvist william@kth.se
William Sandqvist william@kth.se I-Cache och D-Cache William Sandqvist william@kth.se
William Sandqvist william@kth.se 8.2 Lokalitet William Sandqvist william@kth.se
Blockstorlek och genomsnittlig accesstid Större blockstorlek utnyttjar rumslokalitet Liten blockstorlek utnyttjar tidslokalitet William Sandqvist william@kth.se
Rumslokalitet och Tidslokalitet Tidslokalitet: för data är det Read-Modify-Write operationer till en variabel. Till exempel C:s sammansatta operatorer += *= -= /= %= ++ -- a += 3; ( a = a+3; ), loopräknare och index- variabler. För instruktioner finns tidslokalitet vid korta loopar. ”Rak” kod saknar tidslokalitet. Rumslokalitet: för instruktioner är det rak kod. För data är det vektorer och arrayer. William Sandqvist william@kth.se
8.3 Adressering i Main memory och Cache memory William Sandqvist william@kth.se
8.3 Uppdelning av adressen, blocksize 2 Main memory är 3128 Mbyte = 384 Mbyte. M=220, 128 = 27, 3 (4) = 22 229 ( 29 bitar adresserar upp till 512 Mbyte ). Cache memory är 16 kByte. k=210, 16 = 24, 214 Direktmappning minne-cache, Block size = 2 ord a’ 8 Byte. bbb 8Byte/ord, w 2ord/Block, iiiiiiiiii 1024Index (rader, block). Restrerande 15 bitar är tag ttttttttttttttt (15+10+1+3=29) Mm: mmmmmmmmmmmmmmm.mmmmmmmmmm.m.mmm Cm: ttttttttttttttt.iiiiiiiiii.w.bbb Två minnesadresser med samma index upptar samma rad i cacheminnet. Har de olika tag så knuffar de ut varandra! Har de däremot samma tag så finns innehållet i cachen! William Sandqvist william@kth.se
Minnesblock och Cacheblock Mappningen mellan minne och cache blir tydlig om man ritar minnet som om det bestod av cacheblock. William Sandqvist william@kth.se
8.3 Uppdelning av adressen, blocksize 4 Main memory är 229 (29 adressbitar). Cache memory är 214 (14 adressbitar) Direktmappning minne-cache, Block size = 4 ord a’ 8 Byte. bbb 8Byte/ord, ww 4ord/Block, iiiiiiiii 512Index (rader, block). Restrerande 15 bitar är tag ttttttttttttttt (15+9+2+3=29) Mm: mmmmmmmmmmmmmmm.mmmmmmmmm.mm.mmm Cm: ttttttttttttttt.iiiiiiiii.ww.bbb Med blockstorleken 4 ord ökar ww till två bitar på indexbitarna i:s bekostnad. Tagbitarnas t:s antal blir detsamma. William Sandqvist william@kth.se
8.3 Uppdelning av adressen, två set Main memory är 229 (29 adressbitar). Cache memory är 214 (14 adressbitar) Direktmappning minne-cache, Block size = 4 ord a’ 8 Byte. bbb 8Byte/ord, ww 4ord/Block, iiiiiiii 256Index (rader, block). Restrerande 16 bitar är tag tttttttttttttttt (16+8+2+3=29) Mm: mmmmmmmmmmmmmmmm.mmmmmmmm.mm.mmm Cm: tttttttttttttttt.iiiiiiii.ww.bbb Med ett associativt minne som har två set, gäller adressavbildningen mot ett set. Taggbitarna t ökar med en bit på indexbitarnas i bekostnad (de övriga raderna finns inuti det andra setet. Logik i cacheminnet väljer sedan mellan de två seten.) William Sandqvist william@kth.se
8.3 Uppdelning av adressen, fyra set Main memory är 229 (29 adressbitar). Cache memory är 214 (14 adressbitar) Direktmappning minne-cache, Block size = 4 ord a’ 8 Byte. bbb 8Byte/ord, ww 4ord/Block, iiiiiii 128Index (rader, block). Restrerande 17 bitar är tag tttttttttttttttt (17+6+2+4=29) Mm: mmmmmmmmmmmmmmmmm.mmmmmmm.mm.mmm Cm: ttttttttttttttttt.iiiiiii.ww.bbb Med ett associativt minne som har fyra set, gäller adressavbildningen mot ett set. Indexbitarna i minskar med två bitar på taggbitarnas t:s bekostnad (de övriga raderna fördelas på de övriga seten. Logik i Cacheminnet väljer mellan de fyra seten.) William Sandqvist william@kth.se
8.3 Uppdelning av adressen, full associativitet Main memory är 229 (29 adressbitar). Cache memory är 214 (14 adressbitar) Direktmappning minne-cache, Block size = 4 ord a’ 8 Byte. bbbb 8Byte/ord, ww 4ord/Block, 1Index (rad, block). Restrerande 24 bitar är tag tttttttttttttttttttttttt (24+2+3=29) Mm: mmmmmmmmmmmmmmmmmmmmmmmm.mm.mmm Cm: tttttttttttttttttttttttt.ww.bbb För adressavbildningen har ett fullständigt associativt minne bara en rad (ingen indexbit i). Alla indexbitarna tas över av tag-bitar t. Cacheminnet består av set (i stället för rader) som väljs med intern logik. William Sandqvist william@kth.se
8.3 Uppdelning av adressen t i w.b William Sandqvist william@kth.se
William Sandqvist william@kth.se 8.4 Instruktionscache Antalet instruktioner per loop-varv tar man i allmänhet reda på genom att studera assemblerkoden. William Sandqvist william@kth.se
I-Cache 16 Ord a’ 4 Byte 32 bit, två ord/block Instruktionerna utförs i en följd tills hoppinstruktionen tillbaka till loopens början utförs. För varje cache-rad blir det MT. När cacheminnet tar slut så mappas instruktionerna till början igen. Mönstret MT fortsätter i alla varv. Hitrate h = 50%. För loopen med 60 instruktioner blir det samma hitrate, 50%. iii.w.bb William Sandqvist william@kth.se
I-Cache 32 Ord, a’ 4 Byte (32 bit), två ord/block Hela 30-instruktioners loopen ryms i cacheminnet. För första varvet i loopen blir det MT i varje rad. Därefter finns redan alla instruktioner i följd i cacheminnet och då blir hitrate 100%. För loopen med 60 instruktioner blir det fortsatt en hitrate 50%. iiii.w.bb För 1000 varv så blir det första varvet försumbart! William Sandqvist william@kth.se
William Sandqvist william@kth.se I-Cache 64 Ord Ett 64 ords cacheminne rymmer båda looparna. Hitrate blir nära 100%. iiiii.w.bb William Sandqvist william@kth.se
I-Cache 64 Ord associativitet med två set Hela 30 instruktioners loopen ryms i ett set i cacheminnet. 60 instruktions loopen ryms i två set. Hitrate för båda looparna blir nära 100%. iiii.w.bb William Sandqvist william@kth.se
I-Cache 64 Ord Blocksize 8 ord Båda looparna får första varvet MTTTTTTT, därefter TTTTTTTT. h = 100% iii.www.bb I-Cache 32 Ord 60-instruktioners loopen får mycket bättre hitrate än med mindre blocksize. Alla varv MTTTTTTT. h = 7/8 = 88% ii.www.bb William Sandqvist william@kth.se
8.5 Matrisberäkning, Datacache #define RADER 8 #define KOLUMNER 8 typedef int matris[RADER][KOLUMNER]; /* matrix calculation */ void matmul3(matris A, matris B) { int i,j; for(i=0;i<RADER; i++) /* vary row-index */ for(j=0;j<KOLUMNER;j++) /* vary col-index */ A[i][j] = A[i][j]*3 + B[i][j]; } int main() { static matris M1,M2; . . . matmul3(M1,M2); } William Sandqvist william@kth.se
Repris: Hur lagrar C matriser? 35 matris matematik-index a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] 35 matris C-index I minnet radvis. William Sandqvist william@kth.se
William Sandqvist william@kth.se Radvis lagring Att matrisen B ligger direkt efter A är vanligt, men inget som garanteras. Med C:s adressoperator & kan man dock alltid ta reda på hur kompilatorn lagrat matriserna. William Sandqvist william@kth.se
William Sandqvist william@kth.se Datacache Integer = ord = 32 bitar = 4 Bytes. Datacache 32 ord, Blocksize 4 ord. iii.ww.bb William Sandqvist william@kth.se
Rumslokalitet och Tidslokalitet? for(i=0;i<RADER; i++) /* vary row-index */ for(j=0;j<KOLUMNER;j++) /* vary col-index */ A[i][j]=A[i][j]*3 + B[i][j]; a) Rumslokalitet (Locality)? Ja, C lagrar radvis och inre loopen (index j) stegar inom raden. b) Tidslokalitet (Reuse)? Ja, operationen med elementet A[i][j] är av typen Read-Modify-Write. William Sandqvist william@kth.se
Datacache 32 Word, cacheblock 4 Word William Sandqvist william@kth.se
Datacache 32 Word, cacheblock 8 Word c) Ökad blockstorlek till 8 ord för att utnyttja rumslokaliteten. Eftersom båda matriserna mappas på samma rader så gör ”utknuffningen” bara att körtiden ökar! William Sandqvist william@kth.se
William Sandqvist william@kth.se Beräkna hitrate A[i][j] = A[i][j]*3 + B[i][j]; d) Cache 32 ord, blocksize 4. I exemplet mappas A och B elementen alltid till samma rad i cacheminnet (tyvärr): ldw A ldw B stw A MMM TMM TMM TMM . . . 33% träff. Blocksize 8 skulle bara innebära att man hämtar in fler ord som inte kommer till användning. Körtiden ökar. e) Cache 128 ord, blocksize 4? Båda matriserna ryms samtidigt i cachen, ingen utknuffning. MMT TTT TTT TTT . . . 83% träff. William Sandqvist william@kth.se
William Sandqvist william@kth.se Associativitet 2 set A[i][j] = A[i][j]*3 + B[i][j]; f) Cache 32 ord, blocksize 4, 2 set. Elementen i A och B kan lagras i olika set och behöver inte knuffa ut varandra. ldw A ldw B stw A MMT TTT TTT TTT . . . 83% träff (2 missar vart fjärde varv). En förutsättning för detta är att den använda utbytes-algoritmen inte väljer att skriva över det nyligen använda blocket. Tex. LRU (Least Recently Used). Blocksize 8, då får vi 2 missar var åttonde varv. William Sandqvist william@kth.se
Att undvika utknuffning! William Sandqvist william@kth.se
William Sandqvist william@kth.se L1 L2 L3 Cache Intel Itanium har stora associativa Cacheminnen i tre nivåer … William Sandqvist william@kth.se