Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Кафедра ЗІ
/
Лабораторна робота №4
«ДОСЛІДЖЕННЯ КОНВЕЄРНОГО ВИКОНАННЯ ІНСТРУКЦІЙ РУХОМОЇ КОМИ»
з дисципліни
«Архітектура комп'ютерних систем»
Мета роботи: опанування технікою конвеєрного виконання RISC інструкцій для операндів формату рухомої коми.
Завдання
Засобами архітектурного симулятора WinMIPS64 дослідити на прикладі фрагментів програмного коду можливості паралельного опрацювання машинних інструкцій на рівні апаратури та позитивні ефекти, що при цьому досягаються. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Асемблерні інструкції
.data
number: .word 11
max: .word 0
.text
start: ld r1,number(r0)
loop: andi r3,r1,1
beqz r3,even
odd: dadd r2,r1,r1
dadd r1,r2,r1
daddi r1,r1,1
j over
even: dsrl r1,r1,1
over: ld r4,max(r0)
slt r3,r4,r1
beqz r3,skip
sd r1,max(r0)
skip: slti r3,r1,2
beqz r3,loop
halt
Результат виконання програми до оптимізації
/
Вікно статистики
/
Методи оптимізації:
Forwarding
Branch target buffer
Асинхронне виконання команд. У даному випадку це пов’язано із заміною інструкцій в залежності від використання регістрів пам’яті.
Результат виконання програми з Configure – Enable Forwarding (випередження)
/
Вікно статистики
/
Кількість тактів відчутно опустилась (301-228), зокрема на 73 такти, порівнюючи з вимкненим випередженням. Це пов’язано з тим, що потреба у очікуванні проходженні усіх етапів виконання операції та завантаження даних, які поміщені у регістр відсутня, оскільки операції ld/sd (завантаження у/з пам’яті) виконуються не очікуючи кінця інструкцій.
Результат виконання програми з Configure – Enable Branch Target Buffer (випередження)
/
Вікно статистики
/
Кількість тактів зменшилась на 13. Це пов’язано з передбаченням операцій, зокрема коли потрібно обрати логіку із парним або непарним числом. У даному випадку відбулось 16 успішних передбачень та 10 невдалих.
Асинхронне виконання команд
Оптимізовані асемблерні інструкції:
.data
number: .word 11 ; this is input number
max: .word 0 ; max number so far
.text
start: ld r1,number(r0) ; program start
andi r5,r1,1 ; test odd or even
loop: dadd r2,r1,r1 ; times 2
beqz r5,even
odd: dadd r1,r2,r1 ; times 3
ld r4,max(r0)
daddi r1,r1,1 ; plus 1
slt r3,r4,r1 ; compare with max
andi r5,r1,1
beqz r3,loop
sd r1,max(r0) ; new max
j loop
even: dsrl r1,r1,1 ;divide by 2
slti r3,r1,2 ; test for finished
andi r5, r1,1
beqz r3,loop
halt
Оптимізація відбулась за рахунок перенесення інструкції andi (логічне І), виконання якого тривало 2 цикла. Враховуючи це, переставлено команди, щоб не було «простою» в 1 цикл, поки наступна інструкція чекає на результат виконання попередньої. Також через перестановлення даної інструкції кількість її викликів став значно меншим, що позитивно вплинуло на результат. Після оптимізування коду число циклів зменшилось аж на (215- 126) 89 циклів.
Результат виконання програми
/
Вікно статистики
/
Висновок: у ході виконання лабораторної роботи засобами архітектурного симулятора WinMIPS64 досліджено на прикладі фрагментів програмного коду можливості паралельного опрацювання машинних інструкцій на рівні апаратури та позитивні ефекти, що при цьому досягаються. Опановано техніку конвеєрного виконання RISC інструкцій для операндів формату рухомої коми. Проведено оптимізацію коду за допомогою Forwarding та Branch Target Buffer.