МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
/
З В І Т
до лабораторної роботи №4
з курсу: « Архітектура комп'ютерних систем »
на тему: «Дослідження конвеєрного використання інструкцій рухомої коми»
Варіант № 22
Львів 2022
Мета роботи - опанувати техніку конвеєрного виконання RISC інструкцій для операндів формату рухомої коми.
Завдання
Засобами архітектурного симулятора WinMIPS64 машини з 64-розрядною RISC архітектурою MIPS64 дослідити конвеєрне виконання фрагментів машинних програм, що команди опрацювання операндів в форматі з рухомою комою. Виявити наявні залежності (небезпеки) даних і керування, оптимізувати програмний код та дослідити дію запропонованої оптимізації. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Виконання завдання
Код 1
Використовуючи середовище розробки Visual Studio Code, створив програмний файл hail.s, який містить базовий (прототипний) програмний код для MIPS64. Код програми на мові асемблер :
.data
number: .word 22
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
Ще до симулювання перевіряємо синтаксис програми з допомогою утиліти asm.exe, прописуючи команду операційній системі :
Синтаксис є коректним, результат з’являється на дисплеї (лише коментар написаний українською вивело некоректно).
/
Запускаємо програму WINMIPS64 і відкриваємо в ній програмний файл hail.s
/
Налаштування конфігурації середовища
/
Виконуємо симулювання файлу hail.s програми в WINMIPS64 і отримуємо результат.
/
/
ОПТИМІЗУВАТИ ВИКОНАННЯ КОДУ МОЖНА ЗА РАХУНОК:
Використання можливості асинхронного виконування команд
Для цього ми редагуємо код, а саме перенесемо інструкції andi (логічне І), виконання якої тривало 2 цикла. Команди було переставлено, щоб не було «простою» в 1 цикл, поки наступна інструкція чекає на результат виконання попередньої.
Новий код виглядає так:
.data
number: .word 22
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,even
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
Ще до симулювання перевіряємо синтаксис програми з допомогою утиліти asm.exe, прописуючи команду операційній системі :
Синтаксис є коректним, результат з’являється на дисплеї (лише коментар написаний українською вивело некоректно).
/
Результат змін коду:
/
/
Бачимо, що кількість циклів зменшилася на 136; CPI (число циклів на одну інструкцію) зменшилося на 0,514; Пригальмування RAW(Read after write) зменшилося на 22; Branch taken stalls зменшилося на 21.
Включення Enable Forwarding (випередження)
/
Це допоможе вирішити проблему потреби у очікуванні проходженні усіх етапів виконання операції та завантаження даних, які поміщені у регістр. З цим методом оптимізації операції ld/sd (завантаження у/з пам’яті) виконуються не очікуючи кінця інструкцій.
/
/
Бачимо, що кількість циклів зменшилася на 55; CPI (число циклів на одну інструкцію) зменшилося на 0,545; Пригальмування RAW(Read after write) зменшилося на 55 і становить лише 1; Branch taken stalls не змінилося.
Включення Enable Branch Target Buffer
/
Ця оптимізація дозволяє зменшити кількість тактів за рахунок вгадування наступної інструкції, наприклад на моментів коли потрібно обрати логіку із парним або непарним числом.
/
/
Бачимо, що кількість циклів збільшилася на 3; CPI (число циклів на одну інструкцію) збільшилося на 0,03; Пригальмування RAW(Read after write) не змінилося і становить 1; Branch taken stalls зменшилося на 7.
Але бачимо, що відбулося лише 6 вгадувань та 10 невгадувань(Branch misprediction stalls). По CPI бачимо, що цей метод оптимізації не допоміг.
Висновок : виконавши дану лабораторну роботу я опанував техніку конвеєрного виконання RISC інструкцій для операндів формату рухомої коми. В оптимізації коду допомогли використання асинхронного виконання задач та ввімкнення випередження. Branch Target Buffer за рахунок великої кількості невгадувань сповільнило програму.