МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
Кафедра БІТ З В І Т
до лабораторної роботи №1
з курсу: «Архітектура комп’ютерних систем»
Варіант № 21
Львів 2022
Мета роботи: Опанування технікою роботи з архітектурним симулятором WinMIPS64 машини з 64-розрядною RISC архітектурою MIPS64.
Завдання: Дослідити симулюванням виконання заданих викладачем машинних окремих інструкцій і пар інструкцій. За результатами проведених лабораторних досліджень оформити звіт та захистити його.
Теоретичні відомості
Симулятор WinMIPS64 стартують за правилами Windows. Основне вікно симулятора містить шість дочірніх вікон і ще статусну лінію під ними. Дочірні вікна отримали назви Pipeline, Code, Data, Registers, Statistics і ще вікно часових діаграм (Clock Cycles Diagram)
Далі подамо назви і пояснимо призначення дочірніх вікон симулятора.
Таблиця 1 – Дочірні вікна симулятора WinMIPS64
Pipeline window
( вікно конвеєра інструкцій, five pipeline stages :
IF – instruction fetch from instruction memory,
ID – instruction decoding/operand fetch,
EX – execute,
MEM – to/from data memory,
WB – write back to registers file)
Вікно містить “схематичне” подання
п’ятисходинкового конвеєра інструкцій 64- розрядного процесора MIPS64 разом з апаратними секціями виконання операцій рухомої коми, а саме, додавання/віднімання (addition/subtraction) множення (multiplication) і ділення (division). Рухоме ділення не конвеєризоване. Це вікно показує, на якій сходинці конвеєра знаходиться та чи інша інструкція. Вікно може збільшуватися.
Code window (вікно коду)
Вікно виконує триколонкове подання пам’яті інструкцій, а саме, (зліва направо):
адреса байта,
32-бітову машинну інструкцію, асемблерну інструкцію.
Подвійний лівий щиголь мишею на певній інструкції встановлює/знімає точку зупинки.
Data window (вікно даних)
/
Це вікно показує вмістиме пам’яті даних,. Ясно, що адресування комірок виконується побайтне, проте у вікні вмістиме подане 64-бітовими пакетами, тобто так, як це вмістиме сприймає 64- розрядний процесор. Аби відредагувати певні дані, треба зробити на них подвійний лівий щиголь мишею (double-left-click).
Аби побачити і відредагувати дані з рухомою комою, треба виконати подвійний правий щиголь (double-right-click).
Register window (регістрове вікно)
/
Вікно подає вмістиме регістрів.
Коли вмістиме регістрів подають сірим кольором, тоді воно змінюється під дією програми, що симулюється. Коли вмістиме регістру подається іншим кольором, тоді цей колір відповідає кольору сходинки конвеєра, де знаходиться відповідна інструкція за умови, що з цієї сходинки є можливим так зване випередження (forwarding).
Це вікно дозволяє інтерактивну зміну вмістимого будь-якого регістру, тобто, залежно від контексту, зміну коду 64-бітового цілого або рухомого числа, що в поточний момент містить регістр. Останнє можливе лише за умови, що обраний регістр не знаходиться в процесі програмної зміни вмістимого і його вмістиме не має не використовуватися для випередження даними.
Аби змінити вмістиме регістра на ньому треба зробити подвійний лівий щиголь (double-left- click on the register). З’явиться модальне спливаюче вікно.
Треба натиснути OK, аби записати до регістру 64-бітове гексадецимальне 0х0000000000000777.
Clock Cycle diagram (вікно часової діаграми)
Вікно містить часову поведінку конвеєра, що
знаходиться під дією поточної програми, що симулюється. Воно фіксує історію кожної інструкції. Коли певна інструкція спричиняє пригальмування конвеєра, тоді її символьне подання в лівій частині циклового вінка міняє колір з чорного на синій. Інструкції, що споживають результат пригальмованої інструкції змінюють колірність на сіру.
Statistics (вікно статистики)
Саме це вікно є найважливішим, адже воно накопичує результати виконання кожної лабораторної роботи з дослідження ефективності RISC архітектури.
Вікно подає накопичені і поточні статистики програми, що симулюється, а саме, число циклів (тактових інтервалів) на симуляцію ( number of simulation cycles), число виконаних за ці цикли інструкцій, середнє число циклів на одну інструкцію ( average Cycles Per Instruction, тобто CPI), типи затримок (stalls) і числа виконаних особливих інструкцій, а саме, умовних переходів (conditional branches) і інструкцій завантаження / збереження (Load/Store).
Status Line (стан симулятора)
Статусна лінія на низу основного вікна симулятора нормально видає повідомлення "Ready", проте протягом симулювання подає різну корисну користувачеві інформацію щодо поточного стану процесу симулювання.
Завантаження програми
Користуйтеся стандартним редактором NotePad, аби створити програмний файл, наприклад, sum.s. Ця програма містить код для MIPS64, що вираховує суму двох цілих чисел A і B. Числові коди спочатку вибрати з комірок пам’яті за адресами А і В до регістрів, потім додати на регістрах і, нарешті, записати отриману суму до комірки пам’яті за адресою С. Далі йде текст асемблерної програми.
;*** winMIPS64 //lab1.s//
C=A+B
*****
;*** (c) 2003 CA226, DCU
*****
.data
A: .word 44
B: .word 7
C: .word 0
.text
main:
ld r4,A(r0)
ld r5,B(r0)
dsub r3,r4,r5
sd r3,C(r0)
halt
Зауважимо, що невеличка за розміром утиліта asm.exe дозволяє ще до симулювання перевірити синтаксис програми, що мають симулювати. Аби перевірити синтаксис потрібно виконати команду операційної системи:
C:\winmips64> asm lab1.s
Результат побачимо на дисплеї. Коли виконати C:\winmips64> asm lab1.s > report.txt
тоді результат вміщуватиме не екран, а файл report.txt, вмістиме якого для програми lab1.s зараз і подамо.
Pass 1 completed with 0 errors
00000000 .data
00000000 000000000000002c A: .word 44
00000008 0000000000000007 B: .word 7
00000010 0000000000000000 C: .word 0
00000000 .text
00000000 main:
00000000 dc040000 ld r4,A(r0)
00000004 dc050008 ld r5,B(r0)
00000008 0085182e dsub r3,r4,r5
0000000c fc030010 sd r3,C(r0)
00000010 04000000 halt
Pass 2 completed with 0 errors
Code Symbol Table
main = 00000000
Data Symbol Table
A = 00000000
B = 00000008
C = 00000010
Покрокове симулювання
В будь-якому стані симулятора натисни F10, аби розпочати новий цикл симулювання. Зауважимо, що на старті перша кольорова лінія в вікні Code з адресою 0х0000 (0000) забарвлена жовтим. Сходинка конвеєра IF у вікні Pipeline також забарвлена жовтим і містить асемблерну мнемоніку першої інструкції програми. Поглянемо до кодового вікна Code I знайдемо там першу інструкцію ld r4,A(r0). У вікні Data можна знайти програмну змінну A.
/
Clock 1
Натиснути Execute/Single Cycle (або натиснути F7). Симулятор виконає перший цикл (тактовий інтервал) програми. Увага! Не першу інструкцію, а лише перший цикл, що для п’ятисходинкового конвеєра відповідає виконанню 1/5 першої інструкції в найкращому випадку, коли нема вимушених затримок конвеєра. Зауважимо, що абревіатура MIPS відповідає в українському перекладі “мікропроцесору, що немає затримок конвеєра”, а не “мільону операцій на секунду”. У вікні Code колірність першої інструкції змінюється на блакитну і вже друга інструкція забарвлена жовтим. Таке забарвлення вказує на сходинку конвеєра, де знаходиться відповідно забарвлена інструкція:
жовтий для IF (вибирання інструкції з пам’яті інструкцій, точніше з кеша інструкцій), блакитний для ID (декодування інструкції і вибирання операндів безпосередніх і з регістрового файла),
червоний для EX (виконання інструкції, 1 такт для фіксованих кодів і більше тактів для рухомих кодів),
зелений для MEM (запис/читання до/з комірок пам’яті даних),
пурпурний для WB (запис результату до регістру регістрового файлу).
Коли подивитися на сходинку конвеєра IF у вікні Pipeline , можна побачити, що друга інструкція програми ld r5, B(r0) з’явилася на цій, в той час, як перша інструкція ld r4,A(r0) пересунулася на другу сходинку ID конвеєра. Конвеєр розпочав функціонування.
/
Clock 2
Наступний натиск на F7 змінює забарвленість в вікні Code через уведення червоного кольору для третьої сходинки EX конвеєра. До конвеєра увійшла інструкція dsub r3,r4,r5.
/
Clock 3
Третій натиск на F7 знову змінює колірність вікна Code, уводячи зелену забарвленість для четвертої сходинки MEM конвеєра. До конвеєру входить інструкція sd r3,C(r0). У вікні Cycle бачимо історію виконання кожної інструкції програми, тобто сходинку, на якій знаходиться кожна інструкція перед надсиланням чергового тактового імпульса.
/
Clock 4
Знову натискаємо F7. Кожна сходинка конвеєра отримує нову інструкцію. Регістр r4 має завантажуватися з комірки пам’яті даних. Проте оновлене вмістиме регістра можна отримати завчасно (кажуть – з випередженням в часі, прямо з виходу пам’яті даних, тобто, з виходу сходинки МЕМ (for forwarding from the MEM stage)). Отже, прямо з виходу пам’яті забираємо новий, ще не записаний до регістру призначення операнд (це і є випередження), а далі паралельно виконуємо додавання цього нового операнду і в той самий час пишемо цей операнд до регістру регістрового файлу. Добре, що в конвеєрі водночас знаходиться черга з п’ятьох інструкцій, тобто, всі ці інструкції є «під рукою».
Можна бачити, що r4 забарвлюється зеленим (колір сходинки MEM) у вікні Registers. Зауважимо, що остання інструкція програми halt (симулятор не має навіть примітивної програми монітора, що вже казати про операційну систему; отже, програміст мусить вручну гальмувати виконання програми саме такою інструкцією) вже уведена до конвеєра.
/
Clock 5
Натискаємо F7. Тут відбуваються цікаві події. Значення, призначене для r5, стає доступним для пересилання. Однак значення для r5 не було вчасно доступним для виконання інструкції dadd r3,r4,r5 у EX. Таким чином, він залишається в EX, зупинився. Рядок стану читає «RAW зупинка в EX (R5)», вказуючи, де сталася зупинка, і недоступність якого реєстру спричинила це.
/
Фігури в вікнах Clock Cycle Diagram і Pipeline чітко вказують на те, що інструкція dsub “застрягла” в сходинці EX, і що всі інструкції за нею також неспроможні пересуватися конвеєром далі. У вікні Clock Cycle Diagram інструкцію dadd підсвічено блакитним, а інструкції, що розташовані за нею “посіріли”.
Clock 6
Натискаємо F7. Інструкція dsub r3,r4,r5 нарешті виконується, а щойно отримана сума, призначена для запису до r3, паралельно стає досяжною для виконання випередження (зі сходинки execute). Отримано значення 0x25, що є різницею 44 - 7 = 37 в десятковій. Це і є відповідь програми, а нас більше цікавить не ця відповідь, а часові витрати на виконання програми (вимірюємо числом тактових імпульсів) і скорочення цього часу різними методами. Щойно зауважене є предметом курсу ЛР з архітектури комп’ютерних систем.
/
Clock 7
Натискаємо F7. Інструкція halt, вже уведена до конвеєра, спричинює ефект “закриття” конвеєра. По ній вже жодна інша інструкція не уводиться до конвеєра, а сам конвеєр поступово спорожнюється, він сходинки IF до сходинки WB.
/
Clock 8
Натискаємо F7. Перевіряємо пам’ять даних Data , де фіксуємо, що змінна C набула значення 0х25. Інструкція sd r3,C(r0) записала це значення до пам’яті на сходинці MEM конвеєра, використовуючі випереджені дані з виходу IF, які вже нормально, без випередження записуються до регістра r3.
/
Clock 9
Натискаємо F7.
/
Clock 10
Натискаємо F7. Програма фінішує.
/
Проаналізуємо вміст вікна статистики (Statistics) і зауважимо, що ми мали 1 пригальмування RAW. Витратили 10 тактових циклів на виконання п’яти інструкцій. Значить, отримали середнє число тактових імпульсів CPI=2.000 на одну інструкцію.
/
Заборонимо випередження, на вкладці «configure» Enable Forwarding
Виконаємо програму знову:
/
По виконанню нашої програми, але вже без випередження, проаналізуємо вміст вікна статистики. Зауважимо, що маємо аж 4 пригальмування RAW. Середнє число тактів на виконання інструкції погіршилося і становить CPI=2.600.
Висновок: Виконавши цю лабораторну роботу я навчився використовувати програму WinMIPS64 в різних режимах.
Режим випередження дає можливість більш детально розглянути програму і зменшує кількість помилок, тому ми отримали 1 пригальмування RAW, а середнє число тактів на виконання інструкції становить CPI = 2.000.
Без режиму випередження, отримали аж 4 пригальмування RAW. Середнє число тактів CPI збільшилось до 2.600.