Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2024
Тип роботи:
Лабораторний практикум
Предмет:
Архітектура комп'ютерів

Частина тексту файла (без зображень, графіків і формул):

Використання поза межами кафедри ЕОМ Національного університету Львівська політехніка заборонено Віктор ТРОЦЕНКО ЛАБОРАТОРНИЙ ПРАКТИКУМ АРХІТЕКТУРА КОМП’ЮТЕРА ЗМІСТ 1. ПЕРЕДМОВА 3 2. СИМУЛЯТОР WINDLX 3 2.1. Запуск та конфігурування 4 2.2. Завантаження тестових програм 5 2.3. Симулювання 5 3. ПОДАЛЬШІ ЕКСПЕРИМЕНТИ 9 4. СИМУЛЮВАННЯ ОПЕРАЦІЙ РУХОМОЇ КОМИ 11 5. ВСТУПНА ЛАБОРАТОРНА РОБОТА 18 5.1. Завдання 18 5.2. Складання програми 18 5.3. Симулювання базисної програми 18 5.4. Експериментальна частина 21 5.5. Висновки 21 6. ЛАБОРАТОРНІ РОБОТИ 21 6.1. План виконання робіт 23 6.2. Лабораторна робота 1. Програма ЦИКЛ 23 6.3. Лабораторна робота 2. Програма РУХОМА КОМА 23 6.4. Лабораторна робота 3. Програма ПРОСТЕ ЧИСЛО 24 6.5. Лабораторна робота 4. Програма ФАКТОРІАЛ 25 6.6. Лабораторна робота 5. Програма КОСИНУС 25 6.7. Лабораторна робота 6. Програма СИНУС 27 6.8. Лабораторна робота 7. Програма ЛОГАРИФМ 28 7. ДОДАТОК. ТАБЛИЦЯ ІНСТРУКЦІЙ ПРОЦЕСОРА 30 ПЕРЕДМОВА Основний варыант DLX процесора (вимовляють як "Deluxe") є конвеєрним. Симулятор цього процесора з назвою WinDLX створено студентами Віденського університету. Симулятор доцыльно використовувати як наочний посібник до підручника американських викладачів-науковців, засновників RISC-архітектури, а саме: J. Hennessy and D. Patterson. Computer Architecture. A quantitative approach. – MK Publishing, CA, 1996. Надана далі інформація з використання симулятора є нескладною. Але за її допомогою можна виконати перші кроки, тобто коротенькі програми DLX та опанувати методологією користування симулятором. Зауважимо, що симулятор надає контекстно-залежну допомогу у скрутних випадках, яка активується натисканням клавіші F1. Зауважимо, що спроможність симулятора оперувати з вкладеними каталогами є обмеженою, тому він, наприклад, відмовляється функціонувати на третьому і більших рівнях вкладеності. Отже, розміщуйте симулятор і програми ближче до кореня! СИМУЛЯТОР WinDLX Процесор фірми MIPS, що з певними наближеннями симулюється програмою WinDLX, містить процесор фіксованої коми (центральний процесорний вузол, CPU) разом із певними копроцесорами, що виконують допоміжні або службові функції, наприклад обробку в форматі рухомої коми, або ж керування пам’яттю і вводом-виводом див. наступний рисунок). Наш симулятор симулює центральний процесорний вузол і лише один з двох копроцесорів, а саме, копроцесор 1, що є вузлом обробки форматів рухомої коми. Копроцесор обслуговує виключні ситуації, що виникають під час виконання програми (наприклад, ділення на нуль, переповнення тощо), переривання, що дозволяють апаратним засобам реагувати на асинхронні події, та систему віртуальної пам’яті.  Рис. 1 - Процесор MIPS R2000, CPU і FPU Тут: Cause – причина переривання або виключення, EPC – допоміжний лічильник інснструкцій, що зберігає адресу перерваної програми, BadVAddr – некоректне значення адреси комірки пам’яті, Status – стан, trap – пастка (для запуску системнихх програми, що опрацьовують ситуації виключення і переривання), Lo – молодша частина, Hi – старша частина (результату множення або ділення). В подальшому викладенні для ознайомлення з функціонуванням симулятора використовується асемблерна програма, яку містить файл FACT.S. Програма обраховує факторіал цілого числа, а саме ціле числе треба уводити з клавіатури після запуску процесу симулювання. Разом із цією асемблерною програмою використовується допоміжна асемблерна програма вводу, що містить файл INPUT.S. Зауважимо, що розширення s в позначенні файлів відповідає асемблерним програмам. Запуск та конфігурування WinDLX стартує як звичайна Windows-програма (мінімально – Win95). При цьому відчиняється головне вікно із шістьма іконками, що є зменшеними дочірніми вікнами. Подвійним щиголем миші на будь-якій іконці перетворюємо іконку на звичайне вікно. Симулятор має бути приведеним до першостану (скинутим) за допомогою щигля клавішею миші, коли її курсор позначає опцію Reset all у пункті File меню головного вікна. При цьому з”являється модальне вікно "Reset DLX" window”, яке вимагає підтвердження пункту OK, аби зачинитися.  Симулятор мусять привести до першостану (скинути) за допомогою щигля клавішею миші, коли її курсор позначає опцію Reset all у пункті File меню головного вікна. При цьому виникає модальне вікно "Reset DLX window”, яке вимагає підтвердження пункту OK або заборони скиду, аби зачинитися. WinDLX спроможний функціонувати в декількох конфігураціях. Проте від початку роботи з симулятором важливо переконатися у його стандартному конфігуруванні, а коли треба, тоді поновити таке конфігурування. Для цього викликають пункт меню Configuration / Floating Point Stages і переконуються про встановлення наступних значень кодів конфігурування “апаратних” засобів (якщо потрібно, тоді виправляють значення кодів на надані нижче значення). Count Delay:  Addition Units 1 2  Multiplication Units 1 5  Division Units 1 19  На завершення, за допомогою щигля мишею на OK зачиняють відчинене модальне вікно. Другим кроком, знову за допомогою пункту меню головного вікна Configuration / Memory Size, визначають місткість пам'яті як 0х8000 та відомим способом виходять з поточного модального вікна. Можна користуватися трьома іншими опціями меню Configuration , а саме -- Symbolic addresses, Absolute Cycle Count та Enable Forwarding . Завантаження тестових програм До початку симуляції, до WinDLX потрібно завантажити програми, що симулюються. Це виконується за допомогою пункту меню File / Load Code or Data. Вибирання цього пункту мишею викликає нове вікно, що містить файли із розширенням .S. Саме ці файли завантажують до симулятора. Нагадаємо, що програма fact.s вираховує значення факторіалу цілого числа. Допоміжна програма. input.s містить процедуру читання стандартного вводу (the keyboard) та зберігає отримане ціле число в регістрі загального призначення (the general purpose register) r1 DLX процесора. Аби завантажити ці два файли до пам'яті симулятора, потрібні наступні кроки: позначити мишею файл fact.s, натиснути мишею кнопку select, позначити мишею файл input.s, натиснути мишею кнопку select, натиснути мишею кнопку load. Послідовність натискання позначок екрану є суттєвою у визначенні коректної послідовності завантаження файлів-програм до пам'яті симулятора. Опрацювання повідомлення File(s) loaded successfully. Reset DLX? виконується натисканням клавіші OK. Після цього файли рахуються завантаженими до пам'яті симулятора. Стартові роботи завершено. Симулятор готовий до виконання програм. Симулювання Зараз ми бачимо у головному вікні симулятора шість іконок, які відповідають наступним робочим і допоміжним вікнам "Register", "Code", "Pipeline", "Clock Cycle Diagram", "Statistics" and "Breakpoints". Щиголь мишкою на кожній іконці перетворює її на відчинене вікно. Далі розглядаються призначення і функції цих вікон. 2.3.1. Конвейєрне вікно (Pipeline window) Перед усім, бажано унаочнити внутрішню структуру конвейєра DLX процесора. Зробимо клавішею миші щиголь на іконці Pipeline. Виникає дочірнє вікно, яке презентує класичний п’яти сходинковий конвейєр DLX зі сходинками IF, ID, EX, MEM, WB. Отримане вікно бажано зробити ширшим, або бачити послідовність опрацювання конвейєром стандартних і нестандартних (за часовими витратами) комп’ютерних інструкцій.  Наведений вище рисунок відтворює конвейєр DLX процесора та додаткові вузли виконання операцій з рухомою комою, а саме, рухомі addition / subtraction, multiplication та ціле division. 2.3.2. Кодове вікно (Сode window) Наступне вікно має назву Code window. Коли виконати подвійний щиголь на його іконці, тоді можна побачити трьох колонкове представлення пам'яті симулятора, у якому послідовно відтворено (в межах одного рядка) наступне: адресу (символьно чи чисельно); гексадецимальний машинний код інструкції; саму інструкцію, записану асемблерною мовою. $TEXT 0x20011000 addi r1, r0, 0x1000  Main+4 0x0c00003c jal InpUnSigned  Аби розпочати симулювання, потрібно викликати Execution з меню головного вікна. Результатом є поява нового меню типу pull down. Далі робимо щиголь на підфункції Single Cycle. Значно спрощує справу еквівалентне за дією натискання клавіші F7 клавіатурі, яке також спричинює один крок симуляції. Можна зауважити, що перше натискання F7 підсвічує у кодовому вікні лінію з адресою $TEXT жовтим кольором. Наступне натискання F7 спричинює другий крок симулювання і змінює підсвічування першої лінії на помаранчовий колір, тоді як друга лінія отримує жовте підсвічування. Тут барвами відтінюють процес просування інструкцій конвейєром DLX. Якщо вікно Pipeline , виявилося зачиненим, його треба відчинити подвійним щиглем на відповідній іконці. Якщо це вікно є недостатньо довгим і “приховує” частину лінії, яка відповідає за графічне представлення часових витрат на виконання інструкції, тоді це вікно мишкою подовжується в горизонтальному напрямку, аби побачити, що інструкція jal InputUnsigned розташована на сходинці IF тоді, як її попередник інструкція addi r1, r0, 0x1000 пересунулася вже на другу сходинку конвейєра ID. Інші блоки, позначені хрестом, свідчать про те, що на відповідних їм сходинках конвейєра інструкція не викликала жодних дій. Наступний натиск F7 змінює кольорове забарвлення кодового вікна – додається червоний колір, що свідчить про роботу третьої сходинки конвейєра з назвою intEX. Ще одне натискання F7 змінює кольорове забарвлення в цілому. Жовта лінія з”являється нижче і, ймовірно, є лише єдиною забарвленою лінією у вікні. Перегляд конвейєрного вікна інформує про те, що сходинки конвейєра IF, intEX and MEM використовуються, а сходинка ID не використовується. Чому? 2.3.3. Циклове вікно (Сlock Cycle window) Інші вікна надають додаткову інформацію про роботу конвейєра. Від моменту старту вони знаходяться у зменшеному стані, тобто виглядають як іконки. Розгортання іконок виконується за допомогою щигля клавішею миші за умови, що курсор миші знаходиться у відповідному місці головного (батьківського) вікна.  Бачимо, що симуляція знаходиться на 4-тому циклі. Перша інструкція (машинна команда) опрацьовується на сходинці MEM конвейєра, друга інструкція – на сходинці intEX (integer EX), третя – анульована, а четверта – на вхідній сходинці IF. Щодо третьої інструкції зауважимо наступне. Вона завантажилася до конвейєра “поза законом”, за “інерцією”, завдяки тому, що її попередником виявилася інструкція безумовного переходу. Анулювання третьої інструкції викликало, як кажуть, бульбашку (“bubble”) на конвейєрі (втрату часу, замість його корисного використання на виконання певних інструкцій в конвеєрному режимі). Цільова адреса переходу jal має назву "InputUnsigned". Аби визначити конкретне чисельне значення, що відповідає символічному запису адреси, треба викликати опцію Memory з меню головного вікна, а потім – опцію Symbols. Ми побачимо відповідність символічного і чисельного запису нашої та інших адрес. Отримані значення відповідності можна сортувати за назвами або за чисельними значеннями. Символ "G" після значення адреси позначає глобальну цільову адресу, а символ "L" -- локальну. Цільова адреса "InputUnsigned" розташована у модулі "input" , тому вона є глобальною. Завжди треба зачиняти викликане вікно натисканням на позначку ОК. Натискання на F7 просуває першу інструкцію addi на останню сходинку конвейєра. Що відбувається у середині конвейєра, можна зрозуміти за допомогою швидкого подвійного щигля мишею на тій лінії кодового вікна, де розташована інструкція addi. Це спричинює появу нового вікна, яке містить детальну інформацію про мікроподії на кожній сходинці конвеєра, що належать обраній інструкції. Нове вікно, що з’явилося? позначенj як "Information about ...". Зачиніть це вікно за допомогою миші і позначки OK . Швидкий подвійний щиголь на лінії з інструкцією movi2fp надає інформацію лише про першу сходинку виконання цієї інструкції з тої причини, що вона була анульована своїм наступником, тобто інструкцією jump. Зачиніть це вікно за допомогою миші і позначки OK. Інформаційне вікно викликається подвійним натиском на клавішу мишки за умови, що курсор миші розташовано або на лінії машинної інструкції у вікні коду, або на якійсь із сходинок конвеєрного вікна. 2.3.4. Вікно точок зупинки ( Breakpoint window) Ми виконували код (програми) крок за кроком, натискаючи клавішу F7 та, водночас, спостерігали за порядком вибирання інструкцій (команд) у кодовому (програмному) вікні. Зараз за допомогою кодового вікна бачимо, що мають виконуватися дві ідентичні інструкції збереження/завантаження (LW – Load Word, SW – Store Word), що завантажують 32-х бітові слова до регістрів. Проте число натисків на клавіші миши в режимі покрокового виконання є занадто великим. Це число можна зменшити застосування точок зупинки. Аби зробити це, позначимо лінію 0x0000015c в кодовому вікні, де міститься інструкція trap 0x5. Ця інструкція є системним викликом запису на екран. Пересуньте курсор миші на лінію в кодовому вікні з вказаною вище адресою та дайте щигля клавішею миші (колір лінії має інвертуватися). Потім дайте щигля на напису Code в меню головного вікна . Оберіть опцію Set Breakpoint за допомогою одноразового щигля. Тут треба бути певним, що потрібна інструкція у кодовому вікні вже позначена інвертуванням кольору. Має виникнути нове вікно "Set Breakpoint". Це дозволить Вам вказати на бажану сходинку конвейєра, де призупиниться виконання позначеної у кодовому вікні інструкції. Стандартно обирається сходинка ID. Аби припинити процес встановлення точки зупинки, дайте мишкою щигля на позначці OK . Вікно повинно зачинитися.  Зауважимо, що у кодовому вікні на позначеній нами лінії інвертування кольору зниклою. Проте з’явилася позначка-покажчик на точку зупинки, а саме “BID” біля інструкції системного виклику trap 0x5. Ця позначка свідчить про те, що автоматичне виконання програми загальмується на позначеній інструкції на сходинці (інші назви – це фаза чи цикл) декодування. Аби перевірити налаштування точки зупинки треба відчинити вікно Breakpoints. Це вікно містить опис нашої точки у формі інформаційного рядка. Точку можна скасувати. Якщо зробити щигля мишкою на рядку опису точки, тоді у меню головного вікна мусить виникнути опція Breakpoints ( якщо є позначеною лінія з описом точки зупинки). І зараз можна скасувати призначений нами breakpoint. Найшвидший спосіб продовжити виконання нашої програми в автоматичному режимі – це натиснути клавішу F5. Існує стандартний спосіб – викликати мишкою пункт меню головного вікна Execution / Run чи спрощено -- F5. За малий часовий інтервал виникне вікно, що інформує про виконання зупинки у призначеній точці -- "ID-Stage: reached at Breakpoint #1"; це вікно треба зачинити підтвердженням мишею на OK. Зараз потрібно звернутися до вікна Clock Cycle Diagram. Там ми побачимо суттєву особливість.Симуляція призупинилася на циклі 14, а лінія trap 0x5 виглядає так  Т-stall позначує пригальмування з причини виконання інструкції trap (пастка). Головний мотив, що унаочнено, полягає в скиданні конвейєра DLX за умови виконання trap-інструкції. Це не є найкращим способом перемкнення на іншу системну програму з погляду збереження продуктивності. Проте він спрощує роботу конвейєра та керування ним. Подія скидання (спорожнення) конвейєра фіксується в інформаційному вікні, яке викликається подвійним щиглем мишкою за умови розташування курсора мишки на рядку з інструкцією, поміченою як точка зупинки в кодовому вікні – “3 stall(s) because of Trap-Pipeline-Clearing!" in the IF stage”. Обов’язково зачиніть це вікно за допомогою щигля на OK. Інструкція trap 0x5 пише повідомлення на екрані. Це можна перевірити , коли дати щигля на опції Execute / Display DLX-I/O у меню головного вікна. Ясно, що потім треба підтвердити OK у вікні, що відчинилося. 2.3.5. Регістрове вікно (Register window ) Подальше ефективне використання симулятора пов’язане з регістровим вікном, яке треба відчинити за допомогою відповідного щигля мишкою. Спочатку у кодовому вікні перейдемо до лінії з адресою 0x00000194. Тут міститься інструкція lw r2, SaveR2(r0) завантаження слова з комірки пам'яті з базовою адресою SaveR2 та зсувом, що міститься у регістрі r0 [ address = base + offset = SaveR2 + (r0) ] до призначення, а саме, до регістра r2. Треба позначити лінію з цією інструкцією як точку зупинки. Зробіть мишею щигля на цій лінії та натисніть клавішу Ins ( це скорочений варіант подання вже відомого виклику послідовності Code / Set Breakpoint / OK). Ще одну точку зупинки треба поставити на лінії 0x000001a4 jar r31. Натиском F5 продовжить виконання програми в автоматичному режимі. На Вас чекає сюрприз. З’являється вікно уводу/виводу, що має назву “The DLX-Standard-I/O window”. У цьому вікні курсор миготить після повідомлення "An integer value >1:". Наберіть 20 і натисніть Enter. Симуляційне виконання нашої програми триватиме доти, доки не стане досяжною точка зупинки breakpoint # 2 (OK!). Схема у вікні the clock cycle diagram window (відчиніть це вікно, якщо потрібно) містить щось нове – червоні і зелені стріли поміж інструкціями (якщо цього не видно, прокрутіть інформацію у вікні доки не побачите симуляційні цикли з номерами 52, 53, 54, 55 та 56). Червоні стріли позначають необхідність пригальмування конвейєра (stall); причина такого пригальмування пояснюється в лінії, на яку показує стріла. У випадку, що розглядається, маємо так званий R-Stalls, тобто такий, який виникає за рахунок RAW-небезпеки (Read After Write, тобто порушено коректне виконання правила про те, що наступна інструкція не має права зчитувати значення операнда з цільового регістру ще до того, як його вмістиме поновлено результатом попередньою інструкцією). Зелена стріла символізує використання випереджувального пересилання операнда, потрібного другій інструкції, від попередньої по відношенню до неї інструкції, та ще до того, як формально завершилося виконання цієї попередньої інструкції з записом її результату до цільового регістру. Настав час перевірити вмістиме регістрів. Відчиніть вікно Register , яке може бути скороченим до іконки. У цьому вікні бачите значення, що зберігаються у регістрах. Зверніть увагу на регістри від R1 до R5. Виконуючи ще один крок симуляції до наступної точки зупинки (F5, OK) побачите, що деякі значення в регістрах змінилися. Пояснення цьому – інструкція lw , що завантажує значення з пам'яті до регістрів Можна виконувати симуляцію в інший спосіб, без використання точок зупинки. У меню головного вікна треба реалізувати послідовність дій Execute / Multiple Cycles чи одразу натиснути F8. Відчиниться вікно, у якому треба набрати 17 та натиснути Enter. У цьому випадку симуляція триватиме 17 циклів, доки не зупиниться (зупинка у випадку, що розглядається, не має за мету повне виконання програми обчислення факторіалу). Зробіть скролінг у вікні the clock cycle diagram доки не побачите цикли з номерами від 72 до 78, як мінімум. Дві операції з рухомою комою (multd та subd - multiply/subtract double) виконуються на окремих вузлах на сходинці EX конвеєра. Але вони обидві вимагають на опрацювання операндів не одного, а декількох тактів . З вказаної причини наступна після них інструкція (j Fact.Loop) може вибиратися, декодуватися та виконуватися. Але потім повинна пригальмуватися на один цикл, аби дозволити інструкції subd завершити власну MEM фазу. 2.3.6. Вікно статистики (Statistics window) Лишилося розглянути останнє вікно обчислення статистик програм, що симулюються. Дозволимо програмі завершити виконання натиском клавіші F5. Побачимо повідомлення "Trap #0 occurred" (OK), що свідчить про завершення виконання програми з останньою інструкцією trap 0 , яка виконалася в режимі симуляції. Пастка (Trap) з номером 0 не є визначеною. Вона застосовується, аби завершити виконання будь-якої програми. Зачиніть усі вікна та відчиніть Statistics. У вікні надано інформацію про найбільш важливі архітектурні аспекти нашої програми. Іншими словами, все симулюється заради формування вмістимого вікна статистки, де головним є число тактових імпульсів, витраченим на виконання (симулювання) програми. У вікні вказано число використаних циклів (тактових інтервалів) на виконання програми (менше циклів – менший час на виконання, значить, більша продуктивність), конфігурацію апаратної частини, пригальмування (stalls, інакше втрати циклів)) та причини їхнього виникнення, питомі ваги тяжких як для конвеєризації інструкцій умовних переходів, завантаження і і збереження, а також інструкцій з операціями рухомої коми і інструкцій-пасток (traps). Стандартно, всі характеристики подано відсотками, наприклад , “RAW stalls: 17(7.91 % of all Cycles)". Статистичні характеристики надзвичайно корисні у дослідженнях впливів зміни конфігурації апаратної частини на ефективність (продуктивність) RISC-машини. Розглянемо, наприклад, вплив випереджувального пересилання результату від попередньої інструкції-виробника до наступної інструкції-споживача цього результату. Іншими словами, надамо відповідь на питання – як змінюється час виконання програми з використанням випередження та без нього. Аби зробити це, занотуємо загальне число циклів (215) і число пригальмувань (stalls) -- 17 RAW, 25 Control, 12 Trap; 54 Total. Зачинимо вікно статистики та відчинемо вікно Configuration. Заборонимо випереджування (disable forwarding) щиглем на опції Enable Forwarding (видимий “гак” або “гава” мають зникнути). На наступне повідомлення-запитання симулятора "WARNING: OK resets automatically the processor! Disable Forwarding?" треба відповісти OK. Знищимо усі точки зупинок за допомогою розділа меню Breakpoints , де задамо опцію Delete All та завершимо знищення стандартним OK. Далі, викликаємо одноразову симуляцію усієї програми послідовністю F5, 20 Enter та натиснемо OK , коли виконається trap 0 . Другий перегляд вікна статистики повідомить про те, що кількість призупинок конвейєра типу Control stalls тa Trap stalls лишилася незмінною, але кількість RAW stalls зросла від 17 до 53 (це погано!), що збільшило загальне число симуляційних циклів нашої програми до 236 (було 215). Тобто виключення випередження збільшило час виконання програми на 236 / 215 = 1.098. Зрозуміло, що варіант DLXвипередж на 9.8 % скоріший від DLXневип на програмі fact.s). ПОДАЛЬШІ ЕКСПЕРИМЕНТИ Існує можливість виконання певної низки досліджень за допомогою симулятора. Можна змінювати конфігурацію апаратної частини машини, аби бачити, як ефективно використовується допоміжний суматор рухомої коми чи як змінюється продуктивність машини в цілому за рахунок використання прискореного вузла ділення (із зменшеним числом циклів на виконання операції). Потім можна дослідити ефекти від застосування оптимізуючого компілятора за допомогою сенсовної, тобто обгрунтованої, зміни порядку розташування інструкцій програми з метою зменшення числа загроз виду RAW-stalls. Бажано інтенсивно використовувати контекстно-залежну допомогу Help. Вона містить багато додаткової і детальної інформації про роботу і можливості симулятора. Далі подамо техніку дослідження виконання в симуляторі окремих інструкцій з фіксованою комою. Мовою асемблер записують програму, що містить вибрану машинну інструкцію. Блок даних програми можна записувати у наступній формі: .data 0x1000 first: .word 5 .word 4 .word 3 .word 2 .word 1 .word 0 Тут директива .data 0х1000 вказує на початокову адресу блоку даних у пам’яті симулятора. Мітка first надає можливість користування у кодовому (програмному) сегменті програми не абсолютною, а символічною адресою даних. Директива .word 4 резервує у пам’яті симулятора чотири байти (слово), які містять значення 4 цілого числа. Кодовий блок розпочинають директивою .text та завершують послідовністю двох інструкцій: trap #0 ; This means stop nop ; This means Delay Slot Детальний попередній опис інструкції отримують за допомогою опції HELP симулятора WinDLX. Потім симулюють програму на певних наборах даних. У дослідженні инструкції LHI можна застосувати наступну програму, де використано тестові десяткові і гексадецимальні безпосередні дані (прямий запис сегменту даних – відсутній). .text lhi r1,#42 lhi r2,#0x42 trap #0 nop Детальніше про систему інструкцій та директиви, оператори і опції асемблера DLX подано системою HELP симулятора WinDLX. Повний текст програми має міститися в ASCII-файлі з ім’ям filename.s. Асемблерна програма prog1.s .data 0x1000 ; Here comes some data (it will be positioned ; to start at address 0x1000 (in hexadecimal)). first:.word 5 .word 4 .word 3 .word 2 .word 1 .word 0 .text ; Here comes the program text (it could be ; positioned anywhere we want --- if we don't ; say where to put it then it is positioned ; at location 256 which is 0x100 (so to run ; this program in dlxsim you need to type ; "go 256")). addi r1,r0,first lw r2,0(r1) lw r5,4(r1) add r2,r2,r5 lw r5,8(r1) add r2,r2,r5 lw r5,12(r1) add r2,r2,r5 addi r2,r2,1 trap #0 ; This means stop. nop Асемблерна програма prog2.s .data 0x1000 first: .word 5 .word 4 .word 3 .word 2 .word 1 last: .word 0 .text addi r4,r0,last addi r1,r0,first add r2,r0,r0 loop: lw r5,0(r1) add r2,r2,r5 addi r1,r1,4 slt r3,r1,r4 bnez r3,loop nop trap #0 nop Перше завдання на симулювання Визначити функцію програм наданих програм. Дослідити щонайменше по дві машинні інструкції кожного типу – АЛП-інструкції, інструкції завантаження/збереження, умовні (branch) та безумовні (jump) переходи. По черзі утворити за допомогою текстового редактора файли prog1.s та prog2.s. Виправити в наведених програмах можливі помилки та записати розширені коментарі до асемблерних кодів. Завантажити за чергою програмні файли до симулятора, просимулювати коди і визначити статистичні характеристики цих програм. Скласти та захистити звіт з лабораторної роботи. СИМУЛЮВАННЯ ОПЕРАЦІЙ РУХОМОЇ КОМИ Симулювання програм за допомогою WinDLX має певні особливості, що пояснюються нижче прикладом виконання тестової програми. Інструкції рухомої коми маніпулюють з вмістимим регістрів рухомої коми та визначають тип рухомої операції так само, як і тип рухомих операндів: з одинарною або подвійною точністю. Рухомі операції з одинарною точністю докладають до будь-яких регістрів рухомої коми. Операції з подвійною точністю (double prezision) докладають лише до парно-непарної пари рухомих рнгістрів (наприклад, до F4,F5), що в коді інструкції зазначують позначенням парного регістра пари (в нас – F4). Далі подано перелік інструкцій, що працюють з даними формату рухома кома. ADDD Dd,Da,Db Add double-precision numbers ADDF Fd,Fa,Fb Add single-precision numbers SUBD Dd,Da,Db Subtract double-precision numbers SUBF Fd,Fa,Fb Subtract single-precision numbers. MULTD Dd,Da,Db Multiply double-precision Floating point numbers MULTF Fd,Fa,Fb Multiply single-precision Floating point numbers DIVD Dd,Da,Db Divide double-precision Floating point numbers DIVF Fd,Fa,Fb Divide single-precision Floating point numbers CVTF2D Dd,Fs Converts from type single-precision to type double-precision CVTD2F Fd,Ds Converts from type double-precision to type single-precision CVTF2I Fd,Fs Converts from type single-precision to type integer CVTI2F Fd,Fs Converts from type integer to type single-precision CVTD2I Fd,Ds Converts from type double-precision to type integer CVTI2D Dd,Fs Converts from type integer to type double-precision __D Da,Db Double-precision compares: "__" may be EQ, NE, LT, GT, LE or GE; sets comparison bit in FP status register __F Fa,Fb Single-precision compares: "__" may be EQ, NE, LT, GT, LE or GE; sets comparison bit in FP status register Текст програми, що опрацьовує в циклі числа з рухомими кодами з подвійною точністю, подано нижче. Подвійна точність фігурує в асемблерних програмах позначеннями парного регістра регістрової пари, що складається з двох регістрів рухомої коми одинарної точності (наприклад, f0.f1, f2.f3, f4.f5; в прогамі мають фігурувати лише молодші регістри пар, а саме, f0, f2, f4; коди операцій рухомої коми х подвійною точністю містять у символчних позначеннях літеру d наприкінці, наприклад ld, addd). Зауважимо, що сегмент даних .data починається від адреси 0х1000. Він містить перелічені в програмі десяткові числа з рухомою комою. Позначка last належить останньому числу в сегменті даних. Зауважимо, що наявність в програмі сегменту даних спрощує роботу з уводу даних. Сегмент даних може містити будь-яка програма. Сегмент коду (програми) розпочинається директивою .text, а перед ним розташовано директиву вирівнювання границі інструкцій на 4. Отже, кожна адреса інструкції повинна складатися з цілого числа четвірок. Директива .global проголошує позначку main входом програми. Перший варіант lab2_1.s асемблерної програми без вирівнювання адрес сегменту коду на кратність чотирьом подано нижче. Нагадаємо, що розташування сегменту даних починається від шістьнадцяткової адреси 0х1000. .data 0x1000 .double 1.5 .double 2.5 .double 3.5 .double 4.5 .double -4.5 .double -3.5 .double -2.5 last: .double -1.5 .align 4 .text .global main main: addi r1,r0,last ld f2,0(r1) sub r2,r1,#0x1000-0x8 loop: ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 subi r2,r2,8 bnez r2, loop trap #0 nop Другий варіант lab2_2.s асемблерної програми з вирівнюванням адрес сегменту коду на кратність чотирьом подано нижче. .data 0x1000 .double 1.5 .double 2.5 .double 3.5 .double 4.5 .double -4.5 .double -3.5 .double -2.5 last: .double -1.5 .align 4 .text .global main main: addi r1,r0,last ld f2,0(r1) sub r2,r1,#0x1000-0x8 loop: ld f0,0(r1) subi r2,r2,8 addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 bnez r2, loop trap #0 nop Подамо методику виконання програми засобами симулятора WinDLX. Спочатку до симулятора завантажують через селектування асемблерну програму lab2_2.s.  Вікно селектування і завантаження до симулятора програми Тут треба отримати та підтвердити (ОК) наступне повідомлення.  Модальне вікно підтвердження вдалого завантаження з вимогою приведення симулятора до першостану 2. Розпочинають покрокове виконання інструкцій програми (клавіша F7).  Вікно симулятора з цикловою діаграмою  Завантаження бази масиву даних до регістра фіксованої коми R1 Коли подивитися деталі виконання інструкції завантаження даних до регістрової пари подвійної точності f2.f3 = D2, де D2 є позначенням довгого, 64 бітового псевдорегістра рухомої коми подвійної точності, тоді побачимо наступне.  Результати (за сходинками конвеєра) виконання інструкції завантаження рухомого опнранда з комірки пам’яті. Рухомі дані (-1.5) завантажено до псевдорегістру подвійної точності D2, а не до регістра рухомої коми f2, як це випливає з тексту програми. В цьому можна ще раз переконатися, коли зробити щиголь мишою на відповідній інструкції в цикловому вікні. Отримуємо, що  Модальне вікно з вмістимим (операндом :-1.5) регістра D0 Відповідно, до D0 = f0.f1 завантажено рухоме число  Модальне вікно з вмістимим (операндом :-1.5) регістра D2 Далі, виконаємо програми доти, доки не завешиться double додавання з фіксацією результату в регістрі D4 = f4.f5 (дивись наступні рисунки). Отже, регістрами, де треба проглядати операнди і результати, є псевдорегістри класу D, а не регістри рухомої коми з одинарною точністю класу f.  Результат записано до рухомого регістра D4 Подамо циклову діаграму виконання по завершенню першої ітерації.  Циклова діаграма наприкінці першої ітерації Подамо далі третій варіант lab2_3.s програми, де цикл повністю розкручено засобами оптимізуючого компілятора, наприклад. .data 0x1000 .double 1.5 .double 2.5 .double 3.5 .double 4.5 .double -4.5 .double -3.5 .double -2.5 last: .double -1.5 .align 4 .text .global main main: addi r1,r0,last ld f2,0(r1) ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 ld f0,0(r1) addd f4,f0,f2 sd 0(r1),f4 subi r1,r1,8 trap #0 nop Ще один, вже четвертий і найбільш оптимізований варіант lab2_4.s програми, подано далі. .data 0x1000 first: .double 1.5 .double 2.5 .double 3.5 .double 4.5 .double -4.5 .double -3.5 .double -2.5 last: .double -1.5 .align 4 .text .global main main: addi r1,r0,last ld f2,0(r1) addi r1,r0,0x1000 ld f0,0(r1) addd f0,f0,f2 sd 0(r1),f0 ld f0,8(r1) addd f0,f0,f2 sd 8(r1),f0 ld f0,16(r1) addd f0,f0,f2 sd 16(r1),f0 ld f0,24(r1) addd f0,f0,f2 sd 24(r1),f0 ld f0,32(r1) addd f0,f0,f2 sd 32(r1),f0 ld f0,40(r1) addd f0,f0,f2 sd 40(r1),f0 ld f0,48(r1) addd f0,f0,f2 sd 48(r1),f0 ld f0,56(r1) addd f0,f0,f2 sd 56(r1),f0 trap #0 nop Аби здобути навичкі налагодження програм з рухомою комою, бажано самостійно (домашня контрольна робота) відсимулювати і порівняти отримані результати для всіх наведених варіантів програми з використанням даних вікна статистики. Домашня робота здається на перевірку викладачеві, що веде лабораторні роботи. ВСТУПНА ЛАБОРАТОРНА РОБОТА Завдання Скласти асемблерну програму додавання двох цілих чисел. Дослідити виконання цієї програми симулятором DLX. Пояснити та проаналізувати інформацію, отриману в результаті виконання обчислень за програмою. Скласти звіт та захистити його. Складання програми Нехай два доданки А та В містяться у головній пам’яті за наступними адресами та набувають наступних значень: Доданок Адреса Вмістиме  А 0х10 0хАА  В 0х14 0хВВ  Сума дорівнює 0хАА + 0хВВ = 0х165. Сума має замістити операнд за адресою 0х14. Зараз текст асемблерної програми подамо як: ; Assumtions: ; R1 initially holds the value 0 ; A is an integer, stored beginning at address 0x10 ; B is an integer array, stored beginning at address 0x14 ; lw r2,0x10(r1) ;get A value lw r3,0x14(r1) ;get B value add r2,r2,r3 ;update A=A+B sw 0x14(r1),r2 ;store new A trap 0 ;end Інструкцією trap #0 завершують усі програми у випадку відсутності в системі додаткових програмних засобів моніторингу та системного керування. Програму є текстовим файлом типу (my.s). Її текст зручно набирати засобами менеджера файлів FAR. Симулювання базисної програми Наступними рисунками подано зафіксовано стан симулятора на момент завершення виконання сходинки IF інструкції nop, що вже не належить до програми та є розташованою після інструкції trap #0. Іншими словами, виконання програми було припинено виконанням інструкції trap #0, яка надіслала модальне повідомлення “Trap #0 occurred!”, згашене щиглем миші. Наступний рисунок містить протокол роботи конвеєра машини.  Рис. 4.1. Протокол роботи конвеєра Усього опрацьовано повних 5 інструкцій. На перші чотири інструкції витрачено 9 циклів замість теоретично очікуваних 8-ми циклів. При цьому на виконання 3-ї та 4-ї інструкцій витрачено по шість циклів на кожну замість очікуваних п’яти. Це пояснюється затримкою конвеєра (R-stall, що доданий в інструкції 3) через RAW-залежність даних поміж інструкціями 2 та 3, і автоматично спричиненою цим затримкою (stall, що доданий в інструкції 4) на відповідний один цикл інструкції 4. Чітко видно випереджувальне пересилання даних до виконавчої сходинки інструкції додавання, що позначено стрілами. Тут дані надсилають не з регістрового файла, а з відповідних полів конвеєрних регістрів.  Рис. 4.2. Протокол вмістимого комірок головної пам’яті  Рис. 4.3. Протокол статистик Отриману суму, що дорівнює 0хАА + 0хВВ = 0х165 містить комірка з адресою 0х14. Це стверджує протокол зміни вмістимого комірок основної пам’яті (рис. 4.2). Видно, що другий доданок заміщено сумою. Рис. 4.3 містить протокол статистик, отриманих під час опрацювання програми. Характеристики цього протоколу визначено з врахуванням загалом 10-ти витрачених циклів. [Далі подають аналіз-роз’яснення щодо кожного розділу протоколу статистик із ручним прорахунком-підтвердженням наведених у машинному протоколі значень статистичних характеристик]. Експериментальна частина Скоректуємо асемблерний код нашої програми за правилами статичного планування, що реально виконує автоматично оптимізуючий компілятор уведенням інструкції nop аби розв'язати (скасувати залежності даних). Тоді отримуємо наступний текст програми. ; Compiler Scheduling. Example DLX code ; ; Assumtions: ; R1 initially holds the value 0 ; A is an integer, stored beginning at address 0x10 ; B is an integer array, stored beginning at address 0x14 ; lw r2,0x10(r1) ;get A value lw r3,0x14(r1) ;get B value nop ;compiler scheduling, cycle bypass add r2,r2,r3 ;update A=A+B sw 0x14(r1),r2 ;store new A trap 0 ;end Протокол роботи конвеєра подано рисунком 4.4.  Рис. 4.4. Протокол роботи конвеєра для експериментальної програми із статичним плануванням Бачимо, що пригальмування зникли. [Далі розглядаємо решту протоколів, як це було зроблено вище для базисної версії програми]. Зрозуміло, що наші пропозиції щодо усунення залежностей даних в спосіб статичної диспетчеризації підтверджено. Висновки А. Існування притаманих програмі залежностей даних спричинило виникнення залежності RAW, яку автоматично визначила та в спосіб затримки на один цикл знищила апаратна частина машини. При цьому втрата швидкодії склала 1 – 9/8 = - 12.5 %. В. Можливе скасування залежності даних уведенням інструкції nop після другої інструкції програми, що відповідає не динамічному, а статичному плануванню процесу виконання програми. С. У великих програмах зустрічаються випадки, коли при статистичному плануванні компілятор замість операції nop уводить корисну інструкцію, яка розташована ближче до початку програми, та за умови, коли її пересунення (після чергове опрацювання)не спотворює сенс програми. ЛАБОРАТОРНІ РОБОТИ Далі подано інформацію щодо тематики, обсягу та термінів виконання лабораторних робіт. Фактично кожна лабораторна робота містить дві частини, а саме, базову частину та експериментальну частину. Метою виконання базової частини кожної лабораторної роботи є опанування студентом технологій обробки потоку інструкцій конвеєром універсальних процесорів (на прикладі обробки програм певних типів) та отримання навичок з кількісного оцінювання ефективності мікроархітектур цих процесорів. Метою виконання експериментальної частини відповідної лабораторної роботи є прищеплення студентам навичок з самостійного планування експерименту та розв'язування інженерних задач, що при цьому виникають, з подальшим оцінюванням ефективності запропонованих та втілених ними пропозицій за обраними студентами критеріями. Лабораторні роботи розрізняють за типом програми, виконання якої симулюють. При цьому базова (Б) та експериментальна (Е) частини усіх лабораторних робіт мають формально збіжні завдання, як це подано нижче. Завдання до роботи 1Б. Завантажити базисну версію програми до симулятора. Спланувати використання комірок головної пам’яті та записати до них вихідні дані. Виконати програму у кроковому режимі. Перевірити результат виконання програми. Пояснити подані вікнами (циклове вікно, вікно статистик) симулятора протоколи виконання програми. Зробити висновки за результатами симуляції виконання програми. Оформити звіт Б та захистити його. Завдання до роботи 1Е. Запропонувати заходи з покращення ефективності використання апаратних засобів процесора та скласти відповідну експериментальну ...
Антиботан аватар за замовчуванням

12.11.2011 03:11-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!