МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
Кафедра ЗІ
/
Звіт
до лабораторної роботи №2
з курсу: «Архітектура комп’ютерних систем»
на тему: «Дослідження виконання циклів на конвеєрі інструкцій»
Мета роботи
Опанувати техніку конвеєрного виконання RISC інструкцій.
Завдання
Засобами архітектурного симулятора WinMIPS64 машини з 64-розрядною
RISC архітектурою MIPS64 дослідити конвеєрне виконання фрагментів
машинних програм, що містять цикли. Виявити наявні залежності (небезпеки)
даних і керування, оптимізувати програмний код та дослідити дію
запропонованої оптимізації. За результатами проведених лабораторних
досліджень оформити звіт та захистити його.
Варіант
Числа
24
26, 7, 60, 58, 32, 8, 11, 11, 42, 4
Початок виконання роботи
.data
values: .word 26, 7, 60, 58, 32, 8, 11, 11, 42, 4
result: .space 8
.text
MAIN: daddui R1,R0,10
dadd R2,R0,R0
dadd R3,R0,R0
LOOP: ld R4,values(R2)
dadd R3,R3,R4
daddi R2,R2,8
daddi R1,R1,-1
bnez R1,LOOP
nop
sd R3,result(R0)
HALT
Код програми мовою асемблера
Секція .data містить дані, над якими програма виконує операцію. Це послідовність з 10 чисел та зарезервований простір розміром у 8 байт (64 біти).
Мітка MAIN секції .text позначає основний код програми, який, згідно з логікою програми, виконується однократно. Код, який повинен виконуватися в циклі, починається від мітки LOOP.
Інструкція LD rt, offset(base) завантажує подвійне машинне слово з пам’яті в вказаний регістр rt значення з пам’яті зі зсувом offset.
Інструкція DADD rd, rs, rt виконує додавання значень регістрів rs та rt зі збереженням результату в регістр rd.
Інструкція DADDI rt, rs, immediate виконує додавання до значення регістру rs константи immediate зі збереженням результату в регістр rt.
Інструкція BNEZ r1, label повертає лічильник програми на мітку label, якщо значення r1 не дорівнює 0, Branch (if) Not Equal Zero
Інструкція SD rt, offset(base) виконує протилежну до LD функцію, тобто зберігає значення регістру в комірку пам’яті зі зсувом offset.
Інструкція NOP (No Operation) є пустою операцією, яка не впливає не виконання програми та має опкод 00. Аналогом даної інструкції в високорівневих мовах програмування є pass в Python або null statement в С та С++.
Інструкція HALT переводить процесор в стан HALT. В цьому стані виконання інструкцій зупиняється до отримання зовнішнього переривання.
Pass 1 completed with 0 errors
00000000 .data
00000000 000000000000001a values: .word 26, 7, 60, 58, 32, 8, 11, 11, 42, 4
0000000000000007
000000000000003c
000000000000003a
0000000000000020
0000000000000008
000000000000000b
000000000000000b
000000000000002a
0000000000000004
00000050 result: .space 8
00000000 .text
00000000 6401000a MAIN: daddui R1,R0,10
00000004 0000102c dadd R2,R0,R0
00000008 0000182c dadd R3,R0,R0
0000000c dc440000 LOOP: ld R4,values(R2)
00000010 0064182c dadd R3,R3,R4
00000014 60420008 daddi R2,R2,8
00000018 6021ffff daddi R1,R1,-1
0000001c 1c01fffb bnez R1,LOOP
00000020 00000000 nop
00000024 fc030050 sd R3,result(R0)
00000028 04000000 HALT
Pass 2 completed with 0 errors
Code Symbol Table
MAIN = 00000000
LOOP = 0000000c
Data Symbol Table
values = 00000000
result = 00000050
Результат перевірки
Бачимо, що програма пройшла процес перевірки без помилок.
Відкриваємо симулятор WinMIPS64 та завантажуємо в нього написану програму.
/
Виконання програми займе 84 цикли з форвардингом та BPB і 105 циклів без форвардингу з BPB, тому перейдемо до результатів виконання всієї програми:
/
Програма виконується інструкція за інструкцією, проходячи всі стадії конвеєра: завантаження, ідентифікація, виконання, доступ до регістрів, доступ до пам’яті. Деякі інструкції можуть не взаємодіяти з пам’яттю, регістрами або не доходити до стадії виконання взагалі (інструкція NOP).
/
/
Бачимо послідовність стадій конвеєра для кожної виконаної інструкції в порядку виконання
/
Бачимо, що програма виконалася і повернула значення 0x103, яке еквівалентне 259 в десятковій системі.
/
Статистика виконання з увімкненим форвардингом
/
Статистика виконання з вимкненим форвардингом
Без використання Branch Target Buffer відбулося 9 Branch Taken Stalls (пригальмовувань виконання умовних переходів). При увімкненні Branch Target Buffer отримуємо 2 Branch Taken Stalls і 2 Branch Misprediction Stall (пригальмовування неправильного передбачення напрямку умовного переходу).
Висновок
В даній лабораторній роботі розглядалося виконання інструкцій на конвеєрі в процесорах архітектури MIPSv4 на прикладі програми, яка додає 10 чисел за допомогою умовного циклу, керованого інструкцією BNEZ. В результаті дослідження виконання було зроблено висновок про можливі пригальмовування виконання програми.