МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
Кафедра БІТ З В І Т
до лабораторної роботи №4
з курсу: «Архітектура комп’ютерних систем»
Варіант № 21
Львів 2022
Мета: опанування технікою конвеєрного виконання RISC інструкцій для операндів формату рухомої коми.
Завдання: Засобами архітектурного симулятора WinMIPS64 машини з 64-розрядною RISC архітектурою MIPS64 дослідити конвеєрне виконання фрагментів машинних програм, що команди опрацювання операндів в форматі з рухомою комою. Виявити наявні залежності (небезпеки) даних і керування, оптимізувати програмний код та дослідити дію запропонованої оптимізації. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Завантаження програми
; 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 13 ; 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
Результат після виконання команди C:\winmips64> asm lab4.s > report.txt
Pass 1 completed with 0 errors
; 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
00000000 .data
00000000 000000000000001b number: .word 27 ; this is input number - change it!
00000008 0000000000000000 max: .word 0 ; max number so far
00000000 .text
00000000 dc010000 start: ld r1,number(r0) ; program start
00000004 30230001 loop: andi r3,r1,1 ; test odd or even
00000008 18030002 beqz r3,even
0000000c 0021102c odd: dadd r2,r1,r1 ; times 2 dadd r1,r2,r1 ; times 3 daddi r1,r1,1 ; plus 1
00000010 08000001 j over
00000014 0020087a even: dsrl r1,r1,1 ; divide by 2
00000018 dc040008 over: ld r4,max(r0)
0000001c 0081182a slt r3,r4,r1 ; compare with max
00000020 18030001 beqz r3,skip
00000024 fc010008 sd r1,max(r0) ; new max
00000028 28230002 skip: slti r3,r1,2 ; test for finished
0000002c 1803fff5 beqz r3,loop
00000030 04000000 halt
Pass 2 completed with 0 errors
Code Symbol Table
start = 00000000
loop = 00000004
odd = 0000000c
even = 00000014
over = 00000018
skip = 00000028
Data Symbol Table
number = 00000000
max = 00000008
Візьмемо за input number число 13.
Запустимо код в симуляторі.
/
Було виконано 192 цикли і 80 інструкцій. Середнє число тактових інтервалів 2.400. Також було 82 пригальмовування RAW і 26 Branch Taken Stalls.
Змінимо код додавши до нього інструкцію nop, також активуємо forwarding і branch target buffer
; 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 13 ; 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
nop
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
nop
beqz r3,loop
halt
Pass 1 completed with 0 errors
; 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
00000000 .data
00000000 000000000000000d number: .word 13 ; this is input number - change it!
00000008 0000000000000000 max: .word 0 ; max number so far
00000000 .text
00000000 dc010000 start: ld r1,number(r0) ; program start
00000004 30230001 loop: andi r3,r1,1 ; test odd or even
00000008 00000000 nop
0000000c 18030004 beqz r3, even
00000010 0021102c odd: dadd r2,r1,r1 ; times 2
00000014 0041082c dadd r1,r2,r1 ; times 3
00000018 60210001 daddi r1,r1,1 ; plus 1
0000001c 08000001 j over
00000020 0020087a even: dsrl r1,r1,1 ; divide by 2
00000024 dc040008 over: ld r4,max(r0)
00000028 0081182a slt r3,r4,r1 ; compare with max
0000002c 18030001 beqz r3,skip
00000030 fc010008 sd r1,max(r0) ; new max
00000034 28230002 skip: slti r3,r1,2 ; test for finished
00000038 00000000 nop
0000003c 1803fff1 beqz r3,loop
00000040 04000000 halt
Pass 2 completed with 0 errors
Code Symbol Table
start = 00000000
loop = 00000004
odd = 00000010
even = 00000020
over = 00000024
skip = 00000034
Data Symbol Table
number = 00000000
max = 00000008
/
Було виконано 136 цикли і 99 інструкцій. Середнє число тактових інтервалів 1.374. Також було 19 пригальмовування RAW, 10 Branch Taken Stalls і 4 Branch Misprediction Stalls.
Висновок
Під час виконання цієї лабораторної роботи я опанував техніку конвеєрного виконання RISC інструкцій для операндів формату рухомої коми, оптимізував програмний код та дослідив дію запропонованої оптимізації.