МІНІСТЕРСТВО ОСВІТИ, НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Лабораторна робота № 6
з дисципліни
"Архітектура комп’ютерів ч.2"
Львів – 2013
Тема: Програма обчислення факторіалу
Мета : Дослідити техніку конвеєрного виконання програми обчислення факторіалу
Хід роботи
У даній лабораторній роботі досліджується програма, що виконує обчислення факторіалу числа n (n – вводиться користувачем з клавіатури)
Факторіал натурального числа - добуток натуральних чисел від одиниці до n включно, позначається n!
Базисна версія програми, що буде симулюватися
Файл Fact.s (власне обчислення)
.data
Prompt: .asciiz "An integer value >1 : "
PrintfFormat: .asciiz "Factorial = %g\n\n"
.align 2
PrintfPar: .word PrintfFormat
PrintfValue: .space 8
.text
.global main
main: ;*** Read value from stdin into R1
addi r1,r0,Prompt
jal InputUnsigned
;*** init values
movi2fp f10,r1 ;R1 -> D0 D0..Count register
cvti2d f0,f10
addi r2,r0,1 ;1 -> D2 D2..result
movi2fp f11,r2
cvti2d f2,f11
movd f4,f2 ;1-> D4 D4..Constant 1
;*** Break loop if D0 = 1
Loop: led f0,f4 ;D0<=1 ?
bfpt Finish
;*** Multiplication and next loop
multd f2,f2,f0
subd f0,f0,f4
j Loop
Finish: ;*** write result to stdout
sd PrintfValue,f2
addi r14,r0,PrintfPar
trap 5
trap 0
Файл INPUT.s (допоміжна програма для введення даних)
.data
;*** Data for Read-Trap
ReadBuffer: .space 80
ReadPar: .word 0,ReadBuffer,80
;*** Data for Printf-Trap
PrintfPar: .space 4
SaveR2: .space 4
SaveR3: .space 4
SaveR4: .space 4
SaveR5: .space 4
.text
.global InputUnsigned
InputUnsigned:;*** save register contents
sw SaveR2,r2
sw SaveR3,r3
sw SaveR4,r4
sw SaveR5,r5
;*** Prompt
sw PrintfPar,r1
addi r14,r0,PrintfPar
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
addi r1,r0,0
addi r4,r0,10 ;Decimal system
Loop: ;*** reads digits to end of line
lbu r3,0(r2)
seqi r5,r3,10 ;LF -> Exit
bnez r5,Finish
subi r3,r3,48 ;ґ0ґ
multu r1,r1,r4 ;Shift decimal
add r1,r1,r3
addi r2,r2,1 ;increment pointer
j Loop
Finish: ;*** restore old register contents
lw r2,SaveR2
lw r3,SaveR3
lw r4,SaveR4
lw r5,SaveR5
jr r31 ; Return
Рис.1 Вікно конвеєра
Рис.3 Вікно введення/виведення
Рис.2 Вікно статистики
Як бачимо, було виконано 57 інструкцій, на що пішло 88 циклів (CPI=1.54).
Відбулося 10 RAW пригальмовування конвеєра, 8 пригальмовувань керування і 12 пригальмовувань зупинки (trap stalls). Всього зупинок конвеєра 30
Модифікована (оптимізована) версія програми
.data
Prompt: .asciiz "An integer value >1 : "
PrintfFormat:.asciiz "Factorial = %g\n\n"
.align 2
PrintfPar: .word PrintfFormat
PrintfValue: .space 8
;*** Data for Read-Trap
ReadBuffer: .space 80
ReadPar: .word 0,ReadBuffer,80
PrintfPar1: .space 4
.text
.global main
main: ;*** Read value from stdin into R1
addi r1,r0,Prompt
jal InputUnsigned
;*** init values
movi2fp f10,r1 ;R1 -> D0 D0..Count register
cvti2d f0,f10
addi r2,r0,1 ;1 -> D2 D2..result
movi2fp f11,r2
cvti2d f2,f11
movd f4,f2 ;1-> D4 D4..Constant 1
;*** Break loop if D0 = 1
Loop: led f0,f4 ;D0<=1 ?
bfpt Finish
;*** Multiplication and next loop
multd f2,f2,f0
subd f0,f0,f4
j Loop
InputUnsigned: ;*** Prompt
sw PrintfPar1,r1
addi r14,r0,PrintfPar1
trap 5
;*** call Trap-3 to read line
addi r14,r0,ReadPar
trap 3
;*** determine value
addi r2,r0,ReadBuffer
addi r1,r0,0
addi r4,r0,10 ;Decimal system
Loop1: ;*** reads digits to end of line
lbu r3,0(r2)
nop
seqi r5,r3,10 ;LF -> Exit
nop
bnez r5,Exit
multu r1,r1,r4 ;Shift decimal
nop
subi r3,r3,48
nop
addi r2,r2,1 ;increment pointer
add r1,r1,r3
j Loop1
Exit: jr r31 ; Return
Finish: ;*** write result to stdout
sd PrintfValue,f2
addi r14,r0,PrintfPar
trap 5
trap 0
Рис.3 Вікно конвеєра Рис.4 Вікно статистики
Було виконано 55 інструкцій, на що пішло 79 циклів (CPI=1.43)
Не відбулося жодного RAW пригальмовування, 8 пригальмовувань керування і 12 пригальмовувань зупинки (trap stalls). Всього зупинок конвеєра 20
Для оптимізації було введено декілька “порожніх” інструкції nop, змінено порядок виконання деяких інструкцій та інтегровано функцію для введення /виведення в основну програму
Висновок: На лабораторній роботі я опанувала техніку конвеєрного виконання програми обчислення факторіалу