
- •Мови, рівні і віртуальні машини
- •Сучасні багаторівневі машини
- •Поняття архітектури пк
- •1.4. Розвиток комп’ютерної архітектури
- •Розвиток багаторівневих машин
- •Типи сучасних еом
- •Питання до лекції
- •2.1. Принципи розробки сучасних комп'ютерів
- •2.2. Паралелізм на рівні команд
- •2.3. Конвеєри
- •2.4. Суперскалярні архітектури
- •2.5. Паралелізм на рівні процесорів
- •2.6. Векторні комп'ютери
- •Блок управління
- •2.7. Мультипроцессори
- •2.8. Мультикомпьютери
- •Питання до лекції
- •3. Основи комп’ютерної організації : пам’ять
- •3.1. Ієрархічна структура пам'яті
- •3.2. Загальні відомості про пам'ять
- •3.4. Методи звертання до пам'яті
- •3.5. Модулі пам'яті
- •3.6. Ряди і банки пам'яті
- •3.8. Код з виправленням помилок
- •3. 9. Скільки потрібно пам'яті
- •Питання до лекції
- •4. Цифровий рівень побудови ом
- •4.1. Вентилі і булева алгебра
- •4.2. Булева алгебра
- •4.3. Реалізація булевих функцій
- •4.4. Еквівалентність схем
- •Основні цифрові логічні схеми Інтегральні схеми
- •4.5. Комбінаційні схеми
- •3 Входи і 8 виходів
- •4.6. Арифметичні схеми.
- •4.7. Тактові генератори
- •Питання до лекції
- •Цифровий рівень побудови ом.
- •5. Цифровий логічний рівень архітектури: пам’ять, мікропроцесори
- •5.2. Синхронні sr-защіпки
- •5.3. Синхронні d-защіпки
- •5.4. Тригери (flip-flops)
- •5.5. Регістри
- •5.6. Організація пам'яті
- •Тригер (б)
- •Кожний ряд представляє одне з 3-бітних слів. При операції зчитування і запису завжди зчитується або записується ціле слово
- •5.7. Мікросхеми пам'яті
- •5.9. Мікросхеми процесорів
- •Стрілочки указують вхідні і вихідні сигнали. Короткі діагональні лінії вказують на наявність декількох висновків.
- •Питання до лекції
- •6. Шини
- •6.1. Ширина шини
- •6.2. Синхронізація шини
- •6.3. Синхронні шини
- •6.5. Асинхронні шини
- •6.6. Арбітраж шини
- •6.7. Принципи роботи шини
- •Питання до лекції
- •7. Мікроархітектурний рівень
- •7.1. Приклад мікроархітектури
- •7.2. Тракт даних
- •В цьому розділі
- •Табліця 7.1. Деякі комбінації сигналів аллу і відповідні їм функції
- •7.3. Синхронізація тракту даних
- •7.4. Робота пам'яті.
- •7.5. Мікрокоманди
- •7.6. Управління мікрокомандами: Mic-1
- •7.7. Приклад архітектури команд: ijvm
- •7.8. Модель пам'яті ijvm
- •Питання до лекції
- •8. Рівень архітектури команд
- •8.1. Моделі пам'яті
- •8.2. Загальний огляд рівня архітектури команд
- •8.3. Властивості рівня команд
- •8.4. Регістри
- •8.5. Команди
- •8.6. Загальний огляд рівня команд машини Pentium II
- •8.8. Загальний огляд рівня команд системи ultrasparc II
- •8.9. Загальний огляд віртуальної машини Java
- •8.10. Типи даних
- •8.11. Числові типи даних
- •8.12. Нечислові типи даних
- •8.13. Типи даних процесора Pentium II
- •Підтримувані типи відмічені хрестом (х)
- •8.14. Типи даних машини UltraSparc II
- •8.16. Типи даних віртуальної машини Java
- •8.17. Формати команд
- •Питання до лекції
- •9. Адресація
- •9.1. Способи адресації
- •9.2. Безпосередня адресація
- •9.3. Пряма адресація
- •9.4. Регістрова адресація
- •9.5. Непряма регістрова адресація
- •Лістинг 9.1 - Програма на асемблері для обрахунку суми елементів масиву.
- •9.6. Індексна адресація
- •Листинг 9.2. Програма на мові асемблера для обчислення операції або від (Аі і Ві ) для масиву з 1024 елементів.
- •9.7. Відносна індексна адресація
- •9.8. Стекова адресація
- •9.9. Зворотній польський запис
- •9.10. Обчислення формул в зворотнім польськім записі
- •Питання до лекції
8.2. Загальний огляд рівня архітектури команд
Давайте почнемо вивчення рівня команд з питання про те, що він собою представляє. Це питання на перший погляд може показатися простим, але насправді тут є дуже багато складнощів. В наступному розділі ми обговоримо деякі з цих проблем. Потім ми розглянемо моделі пам'яті, регістрів і команд.
8.3. Властивості рівня команд
У принципі рівень команд — це те, яким представляється комп'ютер програмісту машинної мови. Оскільки зараз жодна нормальна людина не пише програми на машинній мові, ми переробили це визначення. Програма рівня архітектури команд — це те, що видає компілятор (в даний момент ми ігноруємо виклики операційної системи і символічну мову асемблера). Щоб виконати програму рівня команд, складач компілятора повинен знати, яка модель пам'яті використовується в машині, які регістри, типи даних і команди є в наявності і т.д. Вся ця інформація в сукупності і визначає рівень архітектури команд.
Відповідно до цього визначення такі питання, чи програмується мікроархітектура чи ні, конвейєризований комп'ютер чи ні, є він суперскалярним чи ні і т. д., не відносяться до рівня архітектури команд, оскільки складач компілятора не бачить всього цього. Проте це зауваження не зовсім справедливе, оскільки деякі з цих властивостей впливають на продуктивність, а продуктивність є видимою для програміста. Розглянемо, наприклад, суперскалярну машину, яка може видавати back-to-back команди в одному циклі, при умові що одна команда цілочисельна, а одна — з плаваючою крапкою. Якщо компілятор чергує цілочисельні команди і команди з плаваючою крапкою, то продуктивність помітно покращає. Таким чином, деталі суперскалярної операції видні на рівні команд, і межі між різними рівнями розмиті.
Для однієї архітектури рівень команд визначається формальним документом, який звичайно випускається промисловим консорціумом, для інших — немає. Наприклад, V9 SPARC(Version 9 SPARC) і JVM мають офіційні визначення [156, 85]. Мета такого офіційного документа — дати можливість різним виробникам випускати машини даного конкретного виду, щоб ці машини могли виконувати одні і ті ж програми і одержувати при цьому одні і ті ж результати.
У випадку з системою SPARC подібні документи потрібні для того, щоб різні підприємства могли випускати ідентичні мікросхеми SPARC, відмінні один від одного тільки продуктивністю і ціною. Щоб ця ідея працювала, постачальники мікросхем повинні знати, що робить мікросхема SPARC (на рівні команд). Отже, в документі говориться про те, яка модель пам'яті, які регістри присутні, які дії виконують команди і т. д., а не про те, що представляє собою мікроархітектура.
У таких документах містяться нормативні розділи, в яких висловлюються вимоги, і інформативні розділи, які призначені для того, щоб допомогти читачу, але не є частиною формального визначення. В нормативних розділах описані вимоги і заборони. Наприклад, такий вислів, як:
виконання зарезервованого коду операції повинне викликати системне переривання
означає, що якщо програма виконує код операції, який не визначений, то він повинен викликати системне переривання, а не просто ігноруватися. Може бути і альтернативний підхід:
результат виконання зарезервованого коду операції визначається реалізацією.
Це значить, що складач компілятора не може прорахувати якісь конкретні дії, надаючи конструкторам свободу вибору. До опису архітектури часто додаються тестові комплекти для перевірки, чи дійсно дана реалізація відповідає технічним вимогам.
Абсолютно ясно, чому V9 SPARC має документ, в якому визначається рівень команд: це потрібно для того, щоб всі мікросхеми V9 SPARC могли виконувати одні і ті ж програми. З тієї ж причини існує спеціальний документ для JVM: щоб інтерпретатори (або такі мікросхеми, як picoJava II) могли виконувати будь-яку допустиму програму JVM. Для рівня команд процесора Реntium II такого документа немає, оскільки компанія Intel не хоче, щоб інші виробники змогли запускати мікросхеми Реntium II. Компанія Intel навіть зверталася до суду, щоб заборонити виробництво своїх мікросхем іншими підприємствами.
Таким чином, існує реальна небезпека, що пам'ять не діятиме так, як очікується. Ситуація ускладнюється у випадку з мультипроцесором, коли кожен процесор посилає розділеній пам'яті потік запитів на читання і запис, які теж можуть бути переупорядковані.
Системні розробники можуть застосовувати один з декількох підходів до цієї проблеми. З одного боку, всі запити пам'яті можуть бути впорядковані в послідовність так, щоб кожний з них завершувався до того, як почнеться наступний. Така стратегія сильно шкодить продуктивності, та зате дає просту семантику пам'яті (всі операції виконуються в строгому програмному порядку).
З іншого боку, не дається взагалі ніяких гарантій. Щоб зробити звернення до пам'яті впорядкованими, програма повинна виконати команду SYNC, яка блокує запуск всіх нових операцій пам'яті до тих пір, поки попередні операції не будуть завершені. Ця ідея сильно ускладнює роботу тих, хто пише компілятори, оскільки для цього їм потрібно дуже добре знать, як працює відповідна мікроархітектура, та зате розробникам апаратного забезпечення надана повна свобода в оптимізації використання пам'яті.
Можливі також проміжні моделі пам'яті, в яких апаратне забезпечення автоматично блокує запуск певних операцій з пам'яттю (наприклад, тих, які зв'язані з RAW- або WAR-взаємозалежністю), при цьому запуск всіх інших операцій не блокується. Хоча розробка цих особливостей на рівні команд досить утомлива (принаймні, для укладачів компіляторів і програмістів на мові асемблера), зараз існує тенденція використовувати такий підхід. Ця тенденція викликана такими реалізаціями, як переупорядкування мікрокоманд, конвейєри, багаторівнева кеш-пам'ять і т.д. Інші неприродні приклади такого роду ми розглянемо в цьому розділі трохи пізніше.