Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Кафедра БІТ
/
Лабораторна робота №3
«КОНКУРЕНТНЕ ВИКОНАННЯ МАШИННИХ ІНСТРУКЦІЙ»
з дисципліни
«Архітектура комп'ютерних систем»
Варіант - 9
Мета роботи – опанувати техніку розпаралелення виконання машинних інструкцій на рівні апаратури.
Завдання
Засобами архітектурного симулятора 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
Стан програми перед початком виконання інструкцій
/
Такт 4
/
На даному такті отримаємо затримку виконання інструкції sub.d, оскільки вона використовує регістр f7. Для цього їй потрібно дочекатися виконання інструкції div.d, метою якої є запис значення у регістр f7.
Такт 5
/
На даному етапі маємо затримку також й інструкції add.d, оскільки інструкція sub.d досі в черзі і буде доти, доки не виконаються ще 21 такт виконання інструкції div.d.
Кінець виконання програми
/
Вікно статистики
/
Як бачимо, на виконання усіх інструкцій пішло 33 такта із 22 RAW затримками.
Перейдімо до оптимізованого коду.
Асемблерні інструкції
.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
Стан програми перед початком виконання інструкцій
/
Кінець виконання програми
/
Вікно статистики
/
При зміні порядку виконання функцій на виконання усіх піде уже 29 тактів. Це залежить від того, які регістри використовують інструкції. Перевіримо це на прикладі інструкцій sub.d i div.d, div.d, для запису у регістр f7 використовує значення у регістрах f9 і f10, sub.d, в свою чергу, для запису у той же регістр f7 також має використати значення у f7 та f4. Оскільки sub.d використовує значення регістр f7, то для початку її виконання над цим регістром не повинно проводитися ніяких дій. Тому ця інструкція почне своє виконання лише після div.d, яка проводить дію ділення і вкінці запише значення у цей регістр. Якщо інструкція sub.d почне своє виконання перед div.d, то вони зможуть виконуватися паралельно, адже для виконання ділення потрібно 24 такти, а віднімання – 4, тому над регістром f7 вже буде проведено дію і записано в нього значення, тому для ділення це заважати не буде.
Висновок: виконавши дану лабораторну роботу, я опанував техніку розпаралелення виконання машинних інструкцій на рівні апаратури.