МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
/
ІКТА
З В І Т до лабораторної роботи №4
з курсу: «Архітектура комп’ютерних систем»
на тему: «КОНКУРЕНТНЕ ВИКОНАННЯ МАШИННИХ ІНСТРУКЦІЙ»
Варіант № 16
Мета:
Опанування технікою конвеєрного виконання RISC інструкцій для операндів формату рухомої коми.
Завдання:
Засобами архітектурного симулятора WinMIPS64 машини з 64-розрядною RISC архітектурою MIPS64 дослідити конвеєрне виконання фрагментів машинних програм, що команди опрацювання операндів в форматі з рухомою комою. Виявити наявні залежності (небезпеки) даних і керування, оптимізувати програмний код та дослідити дію запропонованої оптимізації. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Вихідний прототип виконання роботи:
Вводимо його на перевірку в програму asm.exe
; 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
Тому запускаємо код:
PS C:\Users\Admin\Desktop\aks\lab> .\asm.exe hali.s
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 ???????? beqz r3,loop halt
Pass 2 completed with 1 errors
Вихідний код тест не пройшов тож виправляємо це.
. Далі запускаємо код в WINMIPS64:
/
Бачимо велику кількість переривань, та погано оптимізовану роботу.
Після оптимізації коду та його часткового переписання (кінцевий варіант нижче) ми забрали частину коду, яка не несе нам великої користі, але забирає ресурси процесора, із включеним передбаченням, та включеним випередженням код став набагато краще працювати, а кількість переривань зменшилась до 1 (було 445).
/
; 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!
.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 skip
even: dsrl r1,r1,1 ; divide by 2
skip: slti r3,r1,2 ; test for finished
nop
beqz r3,loop
haltВисновок
За час виконання даної лабораторної роботи я опанував техніку конвеєрного виконання RISC інструкцій для операндів формату рухомої коми на рівні апаратури, провів тестування коду даного за завданням, покращив код для його швидкодії та зумів досягти непоганого результату.