Namn: Laborationen godkänd: Laboration 2. Cacheminne Laborationens syfte I laborationen ska du bekanta dig med cacheminnen. Genom laborationen fås kunskap om hur cacheminnen är konstruerade och hur de används. Ef- ter laborationen kommer du att förstå hur datorns cacheminne fungerar och vilka parametrar som påverkar cacheminnen. Förberedelser Besvara de elektroniska frågorna (se kurshemsidan). Läs kapitel i kursbok Redovisning Demonstrera dina lösningar för laborationsassistenten och lämna in labo- rationsrapport med källkod. OBS, använd försättsbladet (se kurshemsidan). Godkänt Laborationen är godkänd när följande moment är avklarade: de elektroniska frågorna är besvarade labborationen är demonstrerad labborationsrapporten godkänd Erik Larsson
Laborationsmiljö För denna laboration behövs: MipsIt.exe (för programutvecklingen) och Mips.exe (för simuleringen) Ladda ner MIPSIt (finns på hemsidan). Packa upp filen. Starta Mipsit.exe i mappen \bin. Ignorera popup- fönstret med texten: "Failed to open COM- port...". Tänk på följande: Spara filer i hemmakatalog. Skapa en ny projektfil för varje nytt program. Spara det gamla projektet innan du skapar ett nytt. Undvik mellanrum och konstiga tecken i mappar och filnamn. Komma igång Starta MipsIt (i mappen \bin) Skapa under File New ett nytt assemblerprojekt. Skapa en ny mapp skapas med samma namn. Skapa en ny assemblerfil. Studera nedanstående program som utför additionen 2 + 3 = 5. Först laddas värdet 2 i register $8, sedan laddas talet 3 i register $9 och slutligen adderas innehållen i dessa båda register och resultatet läggs i register $10. Den första raden i programlistningen är en kommentarrad. Den inleds alltid med tecknet #. De fyra efterföljande raderna består av direktiv som bestämmer hur programmet ska översättas av assemblern. Namnet start utgör en symbol för en adress; det är an- vändbart ifall man vill referera till denna adress utan att känna till dess verkliga värde. De tre följande raderna är programmets verkliga instruktioner. # Laboration 1, Hemuppgift 1.set noreorder # Ändra inte instruktionernas ordning.text # Instruktioner skapas.globl start # start är en global symbol.ent start # Programmet börjar vid start # Dina kommentarer: start: li $8, 0x2 #... li $9, 0x3 #... add $10, $8, $9 #....end start # Markerar slutet på programkoden 2
Skriv in programmet ovan. Översätt programmet till maskinkod med kommandot Build (snabbtangenten F7). Rätta eventuella fel. Starta MIPS.exe Ladda upp programmet till simulatorn (snabbtangenten F5). Instruktionerna kommer att läggas i simulatorns RAM från adress 0x80020000. Klicka upp Mips- simulatorn och klicka på rutan RAM. Provkör. Laborationsuppgifter Uppgift 1 Studera cache- inställningar. Programmet nedan består av två subrutiner för att beräkna summan av elementen i en matris. Enda skillnaden mellan de två rutinerna är i vilken ordning elementen beräknas. Det kan tyckas oviktigt, men med ett cache- minne spelar det roll. Matrisaddition genomförs så här: Z=X+Y där Z, X, och Y är matriser av någon storlek, till exempel 5*10. Det innebär att matriserna Z, X, och Y består av 5 rader och 10 kolumner. Ett element zij i matrisen Z är på rad i och kolumn j och zij beräknas som xij + yij. Till exempel, för två små matriser (A och B) med 3 rader och 2 kolumner, beräknas summan (A+B) ut så här: (Exemplet är från Wikipedia: http://sv.wikipedia.org/wiki/matrisaddition) Skriv in, kompilera och simulera programmet nedan. Obs, använd grundin- ställningar (default settings). Kör ett antal simuleringar med olika inställ- ningar. Fyll i tabellen nedan. 3
#include <stdio.h> #include <idt_entrypt.h> #define N 10 int A[N][N]; int (int Matrix[N][N]) int i, j, Sum = 0, Time; for (j = 0; j < N; j ++) for (i = 0; i < N; i ++) Sum += Matrix[i][j]; printf(" tid: %d\n", Time); int (int Matrix[N][N]) int i, j, Sum = 0, Time; for (i = 0; i < N; i ++) for (j = 0; j < N; j ++) Sum += Matrix[i][j]; printf(" tid: %d\n", Time); main () int a, b; printf ("Cache laboration. Del 1\n"); a = (A); b = (A); printf ("Summan är %d och %d\n", a, b); 4
I-cache D-cache Memory cache size = 16 Grundinställning block size = 2 cache size = 16 block size = 2 read cycles = 50, write cycles = 50 writepolicy = WriteThrough blocks in sets = 1 blocks in sets = 1 write buffersize = 0 replacementpolicy = Random Settings Allt på grundinställningar I-cache och D-cache cache size =32 I-cache and D-cache blocksize =8 I-cache and D-cache Number of blocks in sets =2 Övrigt: grundinställnin D-cache writepolicy=writeback D-cache replacementpolicy=fifo I-cache Hit rate D-cache Hit rate Simuleringstid 5
Uppgift 2 Studera hur programvaran kan påverka cacheminne. Skriv in programmet nedan. Kompilera med Optimization high. #include <stdio.h> #include <idt_entrypt.h> #define N 10 int A[N][N]; int initmatrix (int Matrix[N][N]) int i, j; for (i = 0; i < N; i ++) for (j = 0; j < N; j ++) Matrix[i][j] = i*n+j; return 0; int SumOfProdByRowCol (int Matrix[N][N]) int i, j, k, r, Sum = 0, Time; for (i = 0; i < N; i ++) for (j = 0; j < N; j ++) r = 0; for (k = 0; k < N; k = k + 1) r = r + Matrix[i][k]*Matrix[k][j]; Sum += r; printf("sumofprod tid: %d\n", Time); int main () int a; initmatrix(a); printf ("Cachelaboration. Del 2\n"); a = SumOfProdByRowCol(A); printf ("Summan av produkterna är %d\n", a); 6
Introducera en blockeringsfaktor (blocking factor) och ändra programmet enligt lokaliseringsoperationerna. Ett exempel på kod är: #define B 4 #define min(x,y) (X>Y?Y:X) int SumOfProdByRowCol_Blockfactor (int Matrix[N][N]) int i, j, k, r, Sum = 0, Time; int jj, kk; for (jj = 0; jj < N; jj = jj + B) for (kk = 0; kk < N; kk = kk + B) for (i = 0; i < N; i ++) for (j = jj; j < min(jj+b, N); j ++) r = 0; for (k = kk; k < min(kk+b, N); k = k + 1) r = r + Matrix[i][k]*Matrix[k][j]; Sum += r; printf("sumofprod tid: %d\n", Time); Simulera programmen och fyll i tabellen.. Inställningar I-cache: Disable penalty Utan blockeringsfaktor D-cache: block size= 4 Övriga: Grundinställningar Med blockeringsfaktor I-cache D-cache Hit rate Hit rate Simuleringstid 7