Akademia Techniczno – Humanistyczna w Bielsku Białej
Wydział: Budowy Maszyn i Informatyki
Kierunek Automatyka i Robotyka
Rok: 2014/2015
Semestr: 4
PODSTAWY Architektury komputerów
ĆWICZENIA 2
Wykonawca sprawozdania
Szymon Gajewski
Cel ćwiczenia
Opanować technikę potokowego wykonania rozkazów przychodów warunkowych
Zadania
Symulatorem WinMIPS64 wykonać badanie potokowego wykonania fragmentów programów komputerowych z cyklami. Optymizować kod programowy i wykonać badanie kodu.
Kod programu
; Program: loop.s
; Sum of 10 integer values
.data
values: .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; 64-bit integers
result: .space 8
.text
MAIN:
daddui R1,R0,10 ; R1 <- 10
dadd R2,R0,R0 ; R2 <- 0 POINTER REG
dadd R3,R0,R0 ; R3 <- 0 RESULT REG
LOOP:
ld R4,values(R2) ;GET A VALUE IN R4
dadd R3,R3,R4 ; R3 <- R3 + R4
daddi R2,R2,8 ; R2 <- R2 + 8 POINTER INCREMENT
daddi R1,R1,-1 ; R1 <- R1 - 1 DECREMENT COUNTER
bnez R1,LOOP
nop
sd R3,result(R0) ; Result in R3
HALT ; the end
Okna programowe
Zasada programu jest taka sama jak pokazałem w sprawozdaniu nr1.
W tym przypadku występują inne błędy.
Pierwszy błąd Raw 1 pokazał się w 7 takcie
Drugi błąd typu Raw w takcie 10
Po wykonaniu 11 taktu pojawiło się pierwsze hamowanie, przez błąd w wykonaniu przejścia warunkowego (branch taken stall).
Po wykonaniu 12 taktu pojawia się kolejny błąd typu (branch taken stall).
Przy wykonywaniu 76 taktu miało miejsce pojawienie się pierwszego błędu w prognozowaniu kierunku przesyłania warunkowego (Branch misprediction stall).
Przy wykonywaniu 77 taktu miało miejsce pojawienie się drugi błędu typu (Branch misprediction stall).
Po zakończonym programie można odnotować 84 cykle, 56 instrukcji, 1,500 cykli na instrukcje, 20 konfliktów RAW oraz 2 błędy: w prognozowaniu kierunku przesyłania warunkowego i 2 wykonywania przejścia warunkowego.
Optymalizacja
W celu poprawienia szybkości działania programu pozbywamy się wszystkich błędów.
Kod programu po optymalizacji
; Program: loop.s
; Sum of 10 integer values
.data
values: .word 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; 64-bit integers
result: .space 8
.text
MAIN:
daddui R1,R0,10 ; R1 <- 10
dadd R2,R0,R0 ; R2 <- 0 POINTER REG
dadd R3,R0,R0 ; R3 <- 0 RESULT REG
LOOP:
ld R4,values(R2) ;GET A VALUE IN R4
nop
dadd R3,R3,R4 ; R3 <- R3 + R4
nop
daddi R2,R2,8 ; R2 <- R2 + 8 POINTER INCREMENT
nop
daddi R1,R1,-1 ; R1 <- R1 - 1 DECREMENT COUNTER
nop
bnez R1,LOOP
nop
sd R3,result(R0) ; Result in R3
nop
HALT ; the end
Żeby ten program został zoptymalizowany należy w odpowiednie miejsca wprowadzić polecenie nop
I zmienić ustawienia w konfiguracji należało wyłączyć polecenie Enable branch target bulfer i włączyć Enable delay slot.
Dzięki tym zmianą pozbywamy się błędów z programu i jak widzimy z okna Statistics, liczba instrukcji wynosła 106 ale ilość cykli na instrukcje zmalała do 1.036 co przyśpieszyło działanie programu.