Akademia Techniczno-Humanistyczna w Bielsku-Białej
Anatoliy Melnyk
Ćwiczenia laboratoryjne
z przedmiotu „Architektura komputerów”
Bielsko-Biała-2015
Praca laboratoryjna 2. Badanie wykonania cyklu na potoku rozkazów
Cel wykonania pracy laboratoryjnej: Opanować technikę potokowego wykonania rozkazów RISC
Zadanie: Symulatorem WinMIPS64 wykonać badanie potokowego wykonania fragmentów programów komputerowych z cyklami. Optymizować kod programowy i wykonać badanie kodu.
Bazowe opcje wykonania pracy laboratoryjnej.
Jest symulowany program jaki zapisany w języku Asembler. Program szuka sumy 10 liczb od 1 do 10 z krokiem 1.
; 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:
LOOP:
daddui R1,R0,10 ; R1 <- 10
dadd R2,R0,R0 ; R2 <- 0 POINTER REG
dadd R3,R0,R0 ; R3 <- 0 RESULT REG
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
Niżej pokazano okno symulatora.
Rysunek. 1 -Główne okno symulatora z załadowanym programem. Wykorzystano zasoby przesyłania i prognozowanie kierunku przejścia warunkowego (branch target buffer)
Rysunek. 2 - Główne okno symulatora w jakie widać zawartośc pamięci do startu wykonania programu.
Rysunek. 3 - Główne okno symulatora, wykonano 7 cyklów symulowania, jest pierwszy konflikt RAW (read after write)
Rysunek. 4 - Potok symulatora, Pierwszy RAW hamowanie. 7 taktów symulowania.
Rysunek 5. - Drugi RAW hamowania. Wykonano 10 taktów.
Rysunek 6. -Po wykonaniu 11 taktów wystąpiło pierwsze hamowanie, przez wykonanie przechodu warunkowego (branch taken stall).
Rysunek 7. Pojawienie się pierwszego błędu w prognozowaniu kierunku przesyłania warunkowego (Branch misprediction stall)
Rysunek 8. - Główne okno symulatora w momencie zakończenia CYKLU.
СРІ - CPI - jest (średnia) liczba taktów zegara (cykli na instrukcji), które miały miejsce w trakcie wykonywania poszczególnych instrukcji programu.
Po wykonaniu programu z optymizowanym sprzętem straty potoku rozkazow stanowię: 20 RAW-hamowan, 2 hamowania pod czas wykonania przehodow warunkowych (Branch taken) i jeszcze 2 hamowania czrez blendy z wyznaczeniem kierunku przejścia warunkowego. Jasne, ze przy wykorzystaniu nie optymizowanego sprzętu czas wykonania wzrosty.
Symulowaniem potrzebne nadać odpowiedz na pytania: kiedy, czego, ile?
Praca laboratoryjna 3. Równolegle wykonanie maszynowych rozkazow
Cel wykonania pracy laboratoryjnej:
Opanowanie techniką równoległego wykonania maszynowych rozkazów na poziomie sprzętu.
Zadanie
Za pomocą symulatora WinMIPS64 wykonać badanie równoległego wykonania maszynowych rozkazów na poziomie sprzętu i otrzymane przewagi na przykładzie stworzonych studentem fragmentow maszynowego kodu.
W potoku rozkazow realizowana następna strategia: w schodku ID rozkaz sie analizuje i jeśli ma operandy rucha dalej, a jeśli operandow niema - wstrzymuje się. taka strategia pinwale wykorzystać przewagi nie urządzonego zakończenia wykonania (out-of-order completion), lecz ona również może spowodować niebezpieczeństwo WAR. Tu może pomóc technika przemianowywania registrów (register renaming). Na przykład, takie może stać się w następnym fragmencie kodu:
.text
add.d f7,f7,f3 add.d f7,f7,f4
mul.d f4,f5,f6 ; WAR czrez wspolny rejestr f4
Kiedy wypuścić mul.d, wtedy ten rozkaz (za pewnej umowy) "wyprzedzi" drugi rozkaz add.d i pierwszym zapisze do f4. Więc, mul.d musimy zatrzymać na ID.. Prosta reguła zapobiegania niebezpieczeństw brzmi tak: długie rozkazy wykonują pierwszymi. Niechaj mamy fragment kodu :
;***************************************
;*** winMIPS64 //hazard3.s// *****
;*** (c) 2003 CA226, DCU *****
;***************************************
.text
div.d f7,f9,f10 mul.d f2,f4,f3 sub.d f7,f7,f4 ld r1,78(r0) add.d f4,f5,f6 halt
Wyniki jego syntaktycznej kontroli.
Pass 1 completed with 0 errors
;***************************************
;*** winMIPS64 //hazard3.s// *****
;*** (c) 2005 CA226, DCU *****
;***************************************
00000000 |
.text |
|
00000000 462a49c3 |
div.d f7,f9,f10 |
|
00000004 46232082 00000008 462439c1 |
mul.d f2,f4,f3 sub.d f7,f7,f4 |
|
0000000c dc01004e |
ld r1,78(r0) |
|
00000010 46262900 |
add.d f4,f5,f6 |
; WAR on f4 |
00000014 04000000 |
halt |
|
Pass 2 completed with 0 errors Code Symbol Table
Data Symbol Table
Ryż. - Niepotokowy powolny wykonawczy węzeł dzielenia z ruchomym przecinkiem podejmował pracę pierwszym
Ryż. - Niepotokowy wykonawczy węzeł dzielenia z ruchomym przecinkiem ( 24 takty zwłoki) jest dociążony
Rys. - 4 rozkazy jest wykonany potokowe (z nie urządzonym zakończeniem)
Rys. - Równolegle wykonanie się kontinuje, żądny rozkaz nie doszedł do schodki МЕМ
Rys. - Pierwszy rozkaz dzielenia jeszcze się wykonuje, a trzecia od końca ld jest bliska do wykonania
Rys. - Nie urządzone (chaotyczne) zakończenie wykonanie rozkazu potoku
Rys. - sub.d ma te samy cel jak i div.d. Stworzona się sytuacja WAW, temu hamowano add.d i halt
Rys. - Hamowana na pierwszej z 4 schodek sub.d hamuje następne za niej add.d
Rys. - Zakończenie div.d odblokowało potok. Dzielenie i odejmowanie wykonywane
Rys. - Chaotycznie zakończony od początku halt, za tym odejmowanie i dodawanie z ruchomym przecinkiem
Rys. - Chaotyczne zakończenie wykonania rozkazu potoku
Rys. - Program jest wykonany, otrzymano statystyki programowe
Praca laboratoryjna 4. Badanie potokowego wykonania rozkazow dla opracowania danych z ruchomym przecinkiem
Cel wykonania pracy laboratoryjnej
Opanowanie techniki potokowego wykonania rozkazow RISC dla opracowania danych z ruchomym przecinkiem
.
Zadanie
Z wykorzystaniem symulatora WinMIPS64 komputera 64-bitowej architektury RISC typu MIPS64 wykonac badanie potokowego wykonania fragmentow programowych dla opracowania danych z ruchomym przecinkiem.
Wyszukać zależności za danymi i kierowaniem, optymizować kod programu i wykonać badanie zaproponowanej optymizacji. Sformować sprawozdanie.
Wariant bazowy pracy laboratoryjnej
Kod programowy jaki wykonuje opracowanie danych z ruchomym przecinkiem podano niżej.
; hail.s
; Hailstone numbers iteration
; If number is odd, multiply by 3 and add 1
; If number is even, divide it by 2
; repeat this iteration until number is 1
.data
number: .word 27 ; this is input number - change it!
max: .word 0 ; max number so far
.text
start: ld r1,number(r0) ; program start
loop: andi r3,r1,1 ; test odd or even
beqz r3,even
odd: dadd r2,r1,r1 ; times 2 dadd r1,r2,r1 ; times 3 daddi r1,r1,1 ; plus 1
j over
even: dsrl r1,r1,1 ; divide by 2
over: ld r4,max(r0)
slt r3,r4,r1 ; compare with max
beqz r3,skip
sd r1,max(r0) ; new max
skip: slti r3,r1,2 ; test for finished
beqz r3,loop halt