МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
Кафедра ЗІ
/
Звіт
до лабораторної роботи №3
з курсу: «Архітектура комп’ютерних систем»
на тему: «Конкурентне виконання машинних інструкцій»
Мета роботи
Опанувати техніку розпаралелення виконання машинних інструкцій на
рівні апаратури.
Завдання
Засобами архітектурного симулятора WinMIPS64 дослідити на прикладі фрагментів програмного коду можливості паралельного опрацювання машинних інструкцій на рівні апаратури та позитивні ефекти, що при цьому досягаються.
За результатами проведених лабораторних досліджень оформити звіт та
захистити його.
Початок виконання роботи
.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
Код початкової програми мовою асемблера
Pass 1 completed with 0 errors
00000000 .text
00000000 462a49c3 div.d f7,f9,f10
00000004 46232082 mul.d f2,f4,f3
00000008 462439c1 sub.d f7,f7,f4
0000000c dc01004e ld r1,78(r0)
00000010 46262900 add.d f4,f5,f6
00000014 04000000 halt
Pass 2 completed with 0 errors
Code Symbol Table
Data Symbol Table
Результат перевірки
/
Статистичні результати показують 33 цикли та 22 пригальмовування типу Read-after-write, з чого робимо висновок, що програма працює вкрай неефективно та потребує рефакторингу.
Проаналізуємо діаграму станів конвеєра:
/
Бачимо, що найбільше часу виконуються інструкції ділення з рухомою комою та інструкція віднімання, яка залежить від регістру f7, який зайнятий інструкцією ділення. В свою чергу, інструкція відінмання використовує регістр f4, і оскільки вона знаходиться в очікуванні, в очікуванні знаходиться і залежна від даного регістру інструкція додавання.
Найлогічнішим кроком буде змінити порядок виконання інструкцій так, щоб мінімізувати простоювання конвеєра та ефективно використати можливості паралельного виконування команд множення, додавання/віднімання з рухомою комою та цілочисельних операції. Операції множення та ділення є досить складними, а тому їх можна виконувати після простіших операцій додавання та віднімання.
.text
sub.d f7,f7,f4
div.d f7,f9,f10
ld r1,78(r0)
add.d f4,f5,f6
mul.d f2,f4,f3
halt
Вигляд програми після рефакторингу
Pass 1 completed with 0 errors
00000000 .text
00000000 462439c1 sub.d f7,f7,f4
00000004 462a49c3 div.d f7,f9,f10
00000008 dc01004e ld r1,78(r0)
0000000c 46262900 add.d f4,f5,f6
00000010 46232082 mul.d f2,f4,f3
00000014 04000000 halt
Pass 2 completed with 0 errors
Code Symbol Table
Data Symbol Table
Результат перевірки програми після рефакторингу
/
Статистичні результати суттєво покращилися після оптимізації коду. Кількість пригальмовувань Read-after-write зменшилася до трьох.
/
Як бачимо з діаграми станів конвеєра, процесорний час використовується значно ефективніше. Але програму можна оптимізувати ще краще, оскільки спостерігаються RAW Stall, тобто поки регістр f4 зарезервований інструкцією додавання, інструкція множення не може прочитати цей регістр і простоює. Отже, можна оптимізувати код зміною порядку інструкцій.
.text
sub.d f7,f7,f4
div.d f7,f9,f10
ld r1,78(r0)
mul.d f2,f4,f3
add.d f4,f5,f6
halt
Вигляд програми після другого рефакторингу
00000000 .text
00000000 462439c1 sub.d f7,f7,f4
00000004 462a49c3 div.d f7,f9,f10
00000008 dc01004e ld r1,78(r0)
0000000c 46232082 mul.d f2,f4,f3
00000010 46262900 add.d f4,f5,f6
00000014 04000000 halt
Pass 2 completed with 0 errors
Code Symbol Table
Data Symbol Table
Результат перевірки програми після другого рефакторингу
/
Таким чином, ми позбулися ще трьох пригальмовувань і максимально оптимізували код.
/
Це видно також і на діаграмі станів конвеєра. Найбільше часу все ще займає інструкція ділення з рухомою комою.
Висновок
На цій лабораторній роботі я дослідив конкурентне виконання інструкцій різного типу (множення, ділення, додавання/віднімання з рухомою комою та цілочисельних операцій) на прикладі тестової програми, яка поєднує всі перелічені типи інструкцій. Вдалося досягти максимальних результатів продуктивності.