МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
/
З В І Т
до лабораторної роботи №2
з курсу: « Архітектура комп'ютерних систем »
на тему: «Дослідження виконання циклів на конвеєрі інструкцій»
Варіант № 22
Львів 2022
Мета роботи - опанувати техніку конвеєрного виконання RISC інструкцій.
Завдання
Засобами архітектурного симулятора WinMIPS64 машини з 64-розрядною RISC архітектурою MIPS64 дослідити конвеєрне виконання фрагментів машинних програм, що містять цикли. Виявити наявні залежності (небезпеки) даних і керування, оптимізувати програмний код та дослідити дію запропонованої оптимізації. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Варіант
Числа
22
11, 58, 54, 8, 14, 7, 58, 20, 57, 1
Виконання завдання
Використовуючи середовище розробки Visual Studio Code, створив програмний файл loop.s , який містить код для MIPS64, що знаходить суму десяти чисел. Код програми на мові асемблер :
; Program: loop.s
; Sum of 10 integer values
.data
values: .word 11, 58, 54, 8, 14, 7, 58, 20, 57, 1 ; array of ints
result: .space 8 ; place for result 64 bits
.text
MAIN: daddui R1,R0,10 ; R1 <- 10 ; iterations number
dadd R2,R0,R0 ; R2 <- 0 pointer for values
dadd R3,R0,R0 ; R3 <- 0 result
LOOP: ld R4,values(R2) ; load value with r2 pointer to R4
dadd R3,R3,R4 ; R3 <- R3 + R4
daddi R2,R2,8 ; R2 <- R2 + 8 POINTER INCREMENT
daddi R1,R1,-1 ; R1 <- R1 - 1 DECREMENT COUNTER
bnez R1,LOOP
nop
sd R3,result(R0) ; Result in R3
HALT ; the end
Ще до симулювання перевіряємо синтаксис програми з допомогою утиліти asm.exe, прописуючи команду в терміналі powershell :
/
У симуляторі WINMIPS64 відкриваємо файл loop.s з текстом програми на мові асемблер.
/
Встановлюємо дозволи на використання апаратури випередження (forwarding) і апаратури передбачення напрямку умовного переходу (branch target buffer) у налаштуваннях.
/
Далі я виконуємо покрокове симулювання, натискаючи Execute/Single Cycle (або F7). Після виконання семи циклів симулювання, отримую перше RAW, що видно на наступному скріншоті.
/
Після виконання десяти циклів симулювання, отримую друге RAW пригальмування, що видно на наступному скріншоті.
/
Виконую одинадцять тактів симулювання, стається перше пригальмування за рахунок виконаного умовного переходу (branch taken stall).
/
Стан виникнення першої помилки в передбаченні напрямку умовного переходу (Branch misprediction stall) можна спостерігати після виконання 76 циклів симулювання. В вікні статистика (Statistics) видно що в пункті (Branch misprediction stall) з’явилася перша помилка (наступний скрін).
/
Після виконання 84 тактів симулювання завершується. Загальне число виконаних циклів становить 84 на 56 інструкцій. На наступному скріншоті видно головне вікно симулятора по завершенню симулювання програми.
/
Підсумовуючи можна сказати, що після виконання програми з оптимізованою апаратурою втрати конвеєра інструкцій склали 20 RAW-пригальмувань. СРІ = 1.500 – це середнє число тактових інтервалів (cycles per instruction), що припало на виконання кожної інструкції програми. RAW Stalls (read after write) = 20. Branch Taken Stalls (виконаного умовного переходу) = 2. Branch Misprediction Stalls (передбаченні напрямку умовного переходу) = 2. Ці дані розміщено у вікні Statistics, яке показано на наступному скріншоті.
/
Змінюючи налаштування виконую симулювання ще раз для того, щоб переконатися, що при використанні неоптимізованої апаратури час виконання програми зросте. Вимикаємо апаратні механізми випередження даними і прогнозування напрямку умовного переходу за допомогою буфера цільових адрес переходу (branch target buffer).
/
Виконуємо повторне симулювання.
/
Аналізуючи вікно статистики (Statistics), можна побачити, що у загальне число виконаних циклів становить 110 на 56 інструкцій. СРІ = 1.964 – це середнє число тактових інтервалів (cycles per instruction), що припало на виконання кожної інструкції програми. RAW Stalls (read after write) = 41. Branch Taken Stalls (виконаного умовного переходу) = 9. Branch Misprediction Stalls (передбаченні напрямку умовного переходу) = 0.
/
Висновок: на даній лабораторній роботі я опановував техніку конвеєрного виконання RISC інструкцій. Під час симулювання дослідив, що з увімкненим механізмом випередження і прогнозування напрямку умовного переходу за допомогою буфера цільових адрес переходу (branch target buffer, BTB) програма виконала на 26 циклів менше ніж із вимкненими механізмами, але при вимкнених механізмах не було помилок в передбаченні напрямку умовного переходу (Branch misprediction stall).