DATORTEKNIK ELEKTROINGENJÃRSUTBILDNINGEN
DATORTEKNIK ELEKTROINGENJÃRSUTBILDNINGEN
DATORTEKNIK ELEKTROINGENJÃRSUTBILDNINGEN
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Namn:<br />
Laborationen godkänd:<br />
Laboration 3.<br />
Pipelinearkitektur<br />
Laborationens syfte<br />
Efter den här laborationen ska du ha förstått huvudprinciperna för en CPU med<br />
pipelinearkitektur.<br />
Laborationen belyser hasardproblem för data och hoppadresser och ger exempel på<br />
olika sätt att eliminera dessa problem.<br />
Förberedelser<br />
Läs noga igenom laborationshandledningen och kapitel 7 i kursboken.<br />
Instruktionsklasser<br />
Olika instruktioner använder olika delar av CPU:n. Man brukar dela in MIPSinstruktionerna<br />
i fyra klasser:<br />
• arithmetic<br />
• load<br />
• store<br />
• branch<br />
Instruktionerna inom en klass liknar varandra vad gäller datavägar inom CPU:n<br />
och det är ofta tillräckligt att förstå en av dem för att förstå alla.<br />
Stefan Nyman 8 oktober 2009
Uppgift 1<br />
Aritmetiska instruktioner hör till de s.k. registerinstruktionerna som utmärks av att<br />
de endast opererar på de interna registren.<br />
I denna uppgift kommer vi att studera hur dessa instruktioner fungerar i pipelinen.<br />
Du ska använda den enklare pipelinesimulatorn, MipsPipeS.exe, som du hittar i<br />
samma mapp som den tidigare simulatorn.<br />
Skapa ett nytt projekt, skriv in följande program och kompilera det. Skapa en uppladdningsbar<br />
kod.<br />
Ladda upp koden på vanligt sätt till simulatorn.<br />
Simulatorn liknar den tidigare, men om du klickar i rutan CPU får du upp en förenklad<br />
bild av den processor-CPU som vi använder.<br />
#include <br />
.set noreorder<br />
.text<br />
.globl start<br />
.ent start<br />
start: add<br />
nop<br />
nop<br />
nop<br />
nop<br />
t0, t1, t2<br />
.end start<br />
Skriv in några lättigenkännliga värden i register t1 och t2 och stega sedan ett steg.<br />
Vad händer när instruktionen går in i det första steget, IF?<br />
Beskriv alla registerförändringar, signaler och övriga förändringar i detalj.<br />
____________________________________________________________<br />
Vad händer i det andra steget, ID?<br />
___________________________________________________________<br />
Vad händer i det tredje steget, EX?<br />
___________________________________________________________<br />
2<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009
Vad händer i det fjärde steget, MEM?<br />
___________________________________________________________<br />
Vad händer i det femte steget, WB?<br />
___________________________________________________________<br />
Vad betyder IF, ID, EX, MEM och WB?<br />
___________________________________________________________<br />
Hur många klockcykler tar det från det att instruktionen läses till det att resultatet<br />
tagit sig till resultatregistret?<br />
___________________________________________________________<br />
I vilket pipelinesteg skiljer sig de olika aritmetiska instruktionerna åt?<br />
___________________________________________________________<br />
Ett av stegen används inte av de aritmetiska instruktionerna. Vilket? Varför?<br />
___________________________________________________________<br />
3<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009
Uppgift 2<br />
Ersätt instruktionen add t0, t1, t2 med lw t0, 0(t1), ladda upp den nya koden<br />
och undersök programmet.<br />
Se till att t1 innehåller adressen 80020000. Detta är ju adressen till den första instruktionen<br />
i programmet men där kan du också läsa värden. Instruktionen motsvarar<br />
ju 32-bitarsvärdet 8D280000.<br />
Vad händer i de olika pipelinestegen?<br />
___________________________________________________________<br />
___________________________________________________________<br />
___________________________________________________________<br />
Vilken aritmetisk operation utförs i ALU:n? Varför?<br />
___________________________________________________________<br />
Hur många cykler tar det för destinationsregistret att få sitt värde? _________<br />
Används alla pipelinestegen? ________________________________<br />
Uppgift 3<br />
Lägg till instruktionen sw t0, 4(t1) efter den sista (fjärde) NOP-instruktionen.<br />
Studera vad som händer genom hela pipelinekedjan.<br />
Vilken aritmetisk operation utförs i ALU:n?<br />
____________________<br />
Används alla pipelinestegen?<br />
___________________________________________________________<br />
4<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009
Uppgift 4<br />
Instruktionssekvensen i föregående uppgift läser en instruktion som ett 32-<br />
bitarsvärde och skriver detta värde på adress 8002004.<br />
I praktiken kopieras den första instruktionen till adress 8002004.<br />
Ta nu bort en NOP-instruktion, ladda upp koden, initiera register t1 till 80020000<br />
och stega programmet.<br />
Fungerar det som det är tänkt? _________________________________<br />
Hur många NOP-instruktioner behöver du mellan load och store för att värdet på<br />
adress 80020000 ska kopieras till 80020004?<br />
___________________________________________________________<br />
Uppgift 5<br />
Undersök nu följande program:<br />
#include <br />
.set noreorder<br />
.text<br />
.globl start<br />
.ent start<br />
start: beq t2, t2, start<br />
nop<br />
nop<br />
nop<br />
nop<br />
.end start<br />
Stega igenom programmet noggrant!<br />
Hur många pipelinesteg passerar instruktionen beq? __________________<br />
Vad händer i varje steg?<br />
___________________________________________________________<br />
Förklara funktionen av bubblan ”Sign extend”<br />
____________________________________________________________<br />
5<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009
Förklara meningen med bubblan ”Shift left 2”<br />
___________________________________________________________<br />
Hur många instruktioner utförs egentligen i ett varv och vilka?<br />
___________________________________________________________<br />
Uppgift 6<br />
Prova nu med följande program:<br />
#include <br />
.set noreorder<br />
.text<br />
.globl start<br />
.ent start<br />
start: nop<br />
beq t2, t2, start<br />
beq t2, t2, start<br />
beq t2, t2, start<br />
beq t2, t2, start<br />
.end start<br />
Förklara vad som händer!<br />
___________________________________________________________<br />
Hur många klockcykler tar ett helt varv i programmet<br />
____________________________________________________________<br />
6<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009
Problem med pipelining<br />
Vi ska nu undersöka ett program med flera olika instruktioner och studera hur de<br />
exekverar parallellt. Vi undersöker några av de problem som kan uppstå i en pipelinearkitektur.<br />
Om n är antalet steg i pipelinekedjan så kan man teoretiskt få en processor att köra<br />
n gånger fortare.<br />
Men det finns en del begränsningar som gör det omöjligt att uppnå detta. En av<br />
dem är att alla instruktioner inte använder alla steg.<br />
Vi ska nu studera några andra begränsningar.<br />
Uppgift 7<br />
Kör följande program i pipelinesimulatorn. Se till att t1=1, t2=3 och t3=5 så att du<br />
kan följa vad som händer.<br />
Vilket resultat bör till slut finnas i t5? ______________________________<br />
#include <br />
.set noreorder<br />
.text<br />
.globl start<br />
.ent start<br />
start: add t4, t1, t2<br />
add t5, t4, t3<br />
nop<br />
nop<br />
nop<br />
.end start<br />
Efter hur många cykler får t4 sitt värde?<br />
___________________________________________________________<br />
Efter hur många cykler behövs värdet i t4 av den följande additionen?<br />
___________________________________________________________<br />
Vad kallas denna typ av hasard?<br />
___________________________________________________________<br />
Detta problem löses enklast genom att komplettera med några NOP-instruktioner<br />
så att resultatet från den första additionen blir färdigt innan det behövs.<br />
7<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009
Hur många NOP-instruktioner behövs? ______________________<br />
Både den verkliga MIPS-processorn och den simulator vi använde under de föregående<br />
laborationerna använder en mekanism som kallas forwarding.<br />
Det finns en simulator som illustrerar forwarding mm.<br />
Stäng av MipsPipeS och starta MipsPipeXL!<br />
Ladda upp koden igen till denna simulator och stega försiktigt igenom instruktionerna.<br />
Studera hur forwardingmekanismen arbetar.<br />
Hur detekteras att forwardingmekanismen ska träda i kraft?<br />
___________________________________________________________<br />
Vilken väg tar värdena jämfört med den enklare pipelinemodellen?<br />
___________________________________________________________<br />
Förklara för handledaren!<br />
Uppgift 8<br />
Kör följande program på den enkla simulatorn, MipsPipeS. Skriv in värdet 5 i både<br />
t1 och t2.<br />
Stega igenom programmet.<br />
#include <br />
.set noreorder<br />
.text<br />
.globl start<br />
.ent start<br />
start: nop<br />
nop<br />
beq t1, t2, start<br />
addi t1, t1, 1<br />
nop<br />
nop<br />
nop<br />
.end start<br />
8<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009
Hur många cykler tar det innan hoppinstruktionen verkligen gör ett hopp?<br />
___________________________________________________________<br />
Vad har hänt med den efterföljande additionen medan hoppadressen räknas ut?<br />
___________________________________________________________<br />
Byt nu till den mer komplicerade pipelinesimulatorn, MipsPipeXL. Hur hanteras<br />
nu instruktionen beq?<br />
___________________________________________________________<br />
Uppgift 9<br />
Kör följande program på den enkla pipelinesimulatorn. Ge t0 och t1 värden som<br />
du kan känna igen och låt t2 innehålla en adress till ett värde du känner till.<br />
Stega igenom programmet.<br />
#include <br />
.set noreorder<br />
.text<br />
.globl start<br />
.ent start<br />
start: lw t0, 0(t2)<br />
add t1, t1, t0<br />
nop<br />
nop<br />
nop<br />
.end start<br />
Efter hur många klockcykler får t0 sitt riktiga värde? ___________________<br />
Efter hur många klockcykler behöver instruktionen add det riktiga värdet i t0?<br />
___________________________________________________________<br />
Denna typ av problem kan lösas genom att man låter processorn själv stoppa in ett<br />
antal väntecykler, men med vår MIPS-processor löser man detta på ett annat sätt.<br />
Hur?<br />
___________________________________________________<br />
9<br />
Datorarkitekturer och operativsystem, Lab 1 8 oktober 2009