26.11.2014 Views

DATORTEKNIK ELEKTROINGENJÖRSUTBILDNINGEN

DATORTEKNIK ELEKTROINGENJÖRSUTBILDNINGEN

DATORTEKNIK ELEKTROINGENJÖRSUTBILDNINGEN

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!