МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
/
З В І Т
до лабораторної роботи №3
з курсу: « Архітектура комп'ютерних систем »
на тему: «Конкурентне виконання машинних інструкцій»
Варіант № 22
Львів 2022
Мета роботи - опанувати техніку розпаралелення виконання машинних інструкцій на рівні апаратури.
Завдання
Засобами архітектурного симулятора WinMIPS64 дослідити на прикладі фрагментів програмного коду можливості паралельного опрацювання машинних інструкцій на рівні апаратури та позитивні ефекти, що при цьому досягаються. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Виконання завдання
Код 1
Використовуючи середовище розробки Visual Studio Code, створив програмний файл example1.s, який містить код для MIPS64. Код програми на мові асемблер :
.text
add.d f7,f7,f3
add.d f7,f7,f4
mul.d f4,f5,f6 ; WAR через спільний регістр f4
Ще до симулювання перевіряємо синтаксис програми з допомогою утиліти asm.exe, прописуючи команду операційній системі :
Синтаксис є коректним, результат з’являється на дисплеї (лише коментар написаний українською вивело некоректно).
/
Запускаємо програму WINMIPS64 і відкриваємо в ній програмний файл example1.s
/
Виконуємо симулювання файлу example1.s програми в WINMIPS64 і отримуємо результат.
/
/
Проаналізувавши та виконавши на стимуляторі фрагмент коду, що наведено вище, можна зауважити, що першою почала виконуватися інструкція mul.d, тоді вона в певний момент перегнала другу інструкцію add.d і перешим запишеться його результат тому потрібно затримувати інструкцію mul.d на сходинці ID.
Код 2
Аналіз другого коду на мові асемблер, назва програмного файлу example2.s:
;***************************************
;*** winMIPS64 //hazard3.s// *****
;*** (c) 2003 CA226, DCU *****
;***************************************
.text
div.d f7,f9,f10
mul.d f2,f4,f3
sub.d f7,f7,f4
ld r1,78(r0)
add.d f4,f5,f6
halt
Ще до симулювання перевіряємо синтаксис програми з допомогою утиліти asm.exe, прописуючи команду в powershell:
/
Відкриваємо програму WINMIPS64 та програмний файл example2.s :
/
Виконуємо покрокове симулювання файлу example2.s програмі в WINMIPS64 та отримуємо результат :
/
/
Проаналізувавши вікно статистики (Statistics) зроблено висновок, що у було виконано 33 цикли на 6 інструкцій та CPI (число циклів на одну інструкцію) 5.500 на виконання однієї інструкції. Також пригальмування RAW(Read after write) дорівнює 22. Також у Cycles видно, що в коді є проблеми, які не дозволяють виконувати паралельно усі необхідні функції.
Функція div.d (ділення) виконується 28 кроків і можна побачити, що ця функція займає регістри і не дає весь цей час доступу до регістрів іншим функціям, наприклад sub чекає на комірку заняту функцією div.d. Так само функція mul.d займає багато часу і не надає доступу до комірок функціям add.d і sub.d.
Для оптимізації, змінюємо послідовність коду:
;***************************************
;*** winMIPS64 //hazard3.s// *****
;*** (c) 2003 CA226, DCU *****
;***************************************
.text
mul.d f2,f4,f3
sub.d f7,f7,f4
div.d f7,f9,f10
ld r1,78(r0)
add.d f4,f5,f6
halt
Виконуємо програму asm.exe для перевірки синтаксису програми. Синтаксис є коректним:
/
Відкриваємо програму WINMIPS64 для виконання файлу з текстом програми та отримую результат:
/
Проаналізувавши вікно статистики (Statistics) бачимо, що було 36 циклів стало - 30 при цьому кількість інструкцій не змінна, CPI (число циклів на одну інструкцію) було 5.500 стало 5.000 на виконання однієї інструкції. Також пригальмувань RAW(Read after write) було 22, а стало 0.
/
/
Висновок : виконавши дану лабораторну роботу я опанував техніку паралельного виконання машинних інструкцій на рівні апаратури; провів тестування кодів заданих в завданні, також провів покращенні коду і добивсяі збільшення швидкості виконання, тобто кращого результату, який полягає в наступному: кількість циклів зменшилася( було 36 цикли, стало 30); кількість пригальмувань 22 RAW стала дорівнювати нулю; було CPI – 5,500 , стало – 5,000.