Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Кафедра БІТ
/
Лабораторна робота №4
«ДОСЛІДЖЕННЯ КОНВЕЄРНОГО ВИКОНАННЯ ІНСТРУКЦІЙ РУХОМОЇ КОМИ»
з дисципліни
«Архітектура комп'ютерних систем»
Варіант - 9
Мета роботи – опанування технікою конвеєрного виконання RISC інструкцій для операндів формату рухомої коми.
Завдання
Засобами архітектурного симулятора WinMIPS64 дослідити на прикладі фрагментів програмного коду можливості паралельного опрацювання машинних інструкцій на рівні апаратури та позитивні ефекти, що при цьому досягаються. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Асемблерні інструкції
Спочатку проаналізуємо неоптимізований код.
.data
number: .word 27
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).
Кінець виконання програми з увімкненим форвардінгом
/
Вікно статистики
/
Вікно статистики показує, що при увімкненому форвардінгу кількість тактів значно зменшується, у порівнянні із попередньою статистикою. Різниця становить цілих 101 такти. Це пов’язано із великою кількістю операцій ld/sd – завантаження у/з пам’яті. Така велика кількість тактів економиться через відсутність потреби чекати проходження усіх етапів виконання цих операцій і використання даних, які поміщенні у регістр, у наступних інструкціях.
Однак є ще один спосіб – branch target buffer.
Кінець виконання програми з увімкненим форвардінгом та branch target buffer
/
Вікно статистики
/
Завдяки увімкнені цієї функції можна зекономити ще невелику кількість тактів. Такти можна економити на вгадуванні наступної інструкції, наприклад на моментів коли потрібно обрати логіку із парним або непарним числом. Однак, як видно по статистиці є аж 12 невгадувань. Незважаючи на це, використання цієї функції все одно економлять кількість тактів.
Приклади вдосконалення коду:
.data
number: .word 9
max: .word 0
.text
start: ld r1,number(r0)
andi r5,r1,1
loop: dadd r2,r1,r1
beqz r5,even
odd: dadd r1,r2,r1
ld r4,max(r0)
daddi r1,r1,1
slt r3,r4,r1
andi r5,r1,1
beqz r3, even
sd r1,max(r0)
j loop
even: dsrl r1,r1,1
slti r3,r1,2
andi r5, r1,1
beqz r3,loop
halt
Стан програми перед початком виконання інструкцій
/
Кінець виконання програми
/
Вікно статистики
/
Висновок: виконавши дану лабораторну роботу, я опанував техніку конвеєрного виконання RISC інструкцій для операндів формату рухомої коми. Оптимізацію коду проведено завдяки використанню функцій forwarding та brench target buffer. Можливий також варіант із заміною інструкцій в залежності від використання регістрів пам’яті. Однак цей варіант тут не буде доречним, оскільки виконання інструкцій конвеєрне і необхідно дочекатися виконання попередньою інструкції для використання даних, які вона обробила, у наступній інструкції.