На момент видачі команди вона поміщується в кінець цієї черги, організованої за принципом FIFO. Єдиний спосіб досягти початку цієї черги – завершення виконання всіх попередніх операцій. При невпорядкованому виконанні деяка команда може завершити своє виконання, але все ще буде знаходитись у середині черги. Команда звільняє чергу, коли вона досягне початку та її виконання завершиться у відповідному функціональному пристрої. Якщо команда знаходиться у початку черзі, але її виконання у функціональному пристрої ще не закінчено, вона залишається у черзі. Такий механізм дозволяє підтримувати модель точних переривань, оскільки вся необхідна інформація міститься у буфері і дозволяє скоректувати стан процесора у будь-який момент часу.
Цей же буфер історії дозволяє виконувати умовне виконання команд що слідують за командою умовного переходу. Це особливо важливо для підвищення швидкодії суперскалярних архітектур. Якщо затримувати виконання всіх наступних за командою переходу команд, втрати можуть виявитись дуже високими. Якщо команди переходів складають 15-20% всіх команд, то у архітектурі що обробляє 4 команди одночасно в середньому у кожному другому такті виконується команда переходу. Механізм умовного виконання команд, що слідують за командою переходу, дозволяє вирішити цю проблему. Це умовне виконання пов‘язано з виконанням команд із заздалегідь передбаченої гілки переходу. Пристрій керування видає команду умовного переходу, прогнозує напрямок переходу та продовжує виконувати команди з цієї передбаченої гілки переходу.
Якщо прогнозування було вдалим, видача команд буде продовжуватися без зупинок. У противному випадку виконання умовних команд зупиняється та очищується буфер історії. Після цього починається обробка команд з правильної гілки переходу. Таким чином, буфер історії не тільки дозволяє вирішити проблему точного переривання, а ще й дозволяє суттєво покращити швидкодію суперскалярного процесора.
Архітектура машин із довгим командним словом (VLIW) дозволяє скоротити об‘єм обладнання, що потрібне для одночасної видачі декількох команд і потенційно чим більша кількість таких команд, тим більша економія апаратних засобів процесора. Наприклад, суперскалярна машина що забезпечує паралельну видачу 2 команд повинна паралельно аналізувати 2 коду операцій, 6 полів номерів регістрів. Хоча для виконання 2 паралельних команд потреби в апаратурі порівняно невеликі, у сучасних моделях процесорів використовується навіть можливість одночасної видачі 4 команд, при подальшому нарощенні кількості конвеєрів складність апаратури дуже сильно зростає.
Архітектура VLIW базується на багатьох незалежних функціональних пристроях. Замість того, щоб намагатися паралельно видавати у ці пристрой незалежні команди, у таких машинах декілька операцій компонуються в одну дуже довгу команду. При цьому відповідальність на вірно вибрані паралельні команди повністю перекладається на компілятор, а апаратні засоби необхідні для суперскалярної обробки відсутні.
VLIW-команда може включати, наприклад, 2 цілочисельні операції, 2 операції з ПК, 2 операції звернення до пам‘яті та операцію переходу. Така команда може мати довжину від 112 до 168 біт.
Розглянемо роботу циклу інкрементації елементів вектора на подібній машині, при цьому одночасно можуть виконуватись 2 операції звернення до пам‘яті, дві операції з плаваючою комою та одна цілочисельна операція чи команда переходу. Цикл було розгорнуто сім разів, що дозволило уникнути всі можливі зупинки конвеєра. Один прохід по циклу відбувається за 9 тактів та виробляє 7 результатів. Таким чином, на обчислення кожного результату витрачається 1.28 тактів.
Звернення до пам‘яті 1 | Звернення до пам‘яті 2 | Операція ПК 1 | Операція ПК 2 | Цілочисельна операція/перехід |
LD F0, 0(R1) | ||||
LD F10,-16(R1) | LD F6,-8(R1) | |||
LD F18,-32(R1) | LD F14,-24(R1) | ADD F4,F0,F2 | ||
LD F26,-48(R1) | LD F22,-40(R1) | ADD F12,F10,F2 | ADD F8,F6,F2 | |
SD 0(R1),F4 | SD –8(R1),F8 | ADD F20,F18,F2 | ADD F16,F14,F2 | SUB R1,R1,#48 |
SD –16(R1),F12 | SD –24(R1),F16 | ADD F28,F26,F2 | ADD F24,F22,F2 | BNEZ R1,LOOP |
SD –32(R1),F20 | SD –40(R1),F24 | |||
SD 0(R1),F28 |
Для машин з VLIW – архітектурою був розроблений новий метод планування видачі команд, так зване "трасировочне планування". При використанні цього метода з послідовності вихідної програми генеруються довгі команди шляхом перегляду програми за межами базових блоків.
З точки зору архітектурних ідей, машину з дуже довгим командним словом можна розглядати як розширення RISK- архітектури. Апаратні ресурси надані компілятору, та ресурси плануються статичною. В машинах з дуже довгим командним словом до цих ресурсів належать конвеєрні функціональні пристрої, шини та банки пам‘яті. Для підтримки високої пропускної здатності між функціональними пристроями та регістрами необхідно використовувати декілька наборів регістрів. Апаратне усунення конфліктів виключається і перевага надається простій логіці керування. На відміну від традиційних машин, регістри і шини не резервуються, а їх використання повністю визначається під час компіляції.
В машинах типу VLIW, крім того, цей принцип заміни керування під час виконання програми плануванням під час компіляції розповсюджений на планування використання пам‘яті. Для підтримки зайнятості конвеєрних функціональних пристроїв повинна бути забезпечена висока пропускна здатність пам‘яті. Одним із сучасних підходів до збільшення пропускної здатності пам‘яті є розшарування пам‘яті. Але у системі із розшарованою пам’яттю виникає конфлікт пам‘яті, якщо іде звернення до вже зайнятого шару пам‘яті. У звичайних машинах стан шарів пам‘яті керується апаратним чином. У машинах VLIW ця функція передана апаратним засобам. Можливі конфлікти банків перевіряє спеціальний модуль компілятора – модуль усунення конфліктів.
Виявлення конфліктів не є задачею оптимізації, це скоріше функція контролю коректності виконання операцій. Компілятор має визначати, що конфлікти неможливі, або у противному випадку припускати що може виникнути найгірша ситуація. У певних випадках, наприклад коли іде звернення до динамічного масиву і індекси обчислюються під час виконання програми, простого рішення немає. Якщо компілятор не може виявити конфлікти, операції доводиться виконувати та планувати послідовно, що веде до зменшення продуктивності.
Компілятор з трасіровочним плануванням виявляє ділянки програми без звернених дуг (переходів назад), які стають кандидатами для створення розкладу. Зверненні дуги наявні в програмах з циклами. Для збільшення тіла циклу широко використовується розгортання циклів, що веде до виникнення великих ділянок без зворотних дуг. Якщо дана програма, що має напрямки переходу тільки вперед, компілятор робить евристичне передбачення вибору умовних гілок. Шлях, що має найбільшу імовірність виконання називається трасою та використовується для оптимізації з урахуванням залежностей між даними та командами. Під час планування генерується довге командне слово. Всі операції довгого командного слова видаються одночасно та виконуються паралельно.
Після обробки першої траси планується наступний шлях, що має найбільшу імовірність виконання. Процес компонування команд продовжується до тих пір, доки не буде оптимізована вся програма.
Основною умовою досягнення ефективності VLIW-машини є коректне передбачення вибору умовних гілок. Відмічено, наприклад, що прогноз умовних гілок для наукових програм часто буває точним. Повернення назад присутні у всіх ітераціях циклу за виключенням останньої. Таким чином, прогноз, який дається вже самими командами переходу назад, у більшості випадків буде точним.
В основі реалізації ієрархії пам‘яті сучасних комп‘ютерів полягають 2 принципи: принцип локальності звернень та співвідношення вартість / швидкодія. Принцип локальності звернень говорить про те, що більшість програм не виконують звернень до всіх команд та даних рівноімовірно, а найчастіше звертаються до певної частини свого адресного простору.
Ієрархія пам‘яті сучасних комп‘ютерів будується на декількох рівнях, причому більш високий рівень менший по об‘єму, більш швидкий та має більшу вартість в перерахунку на один байт, ніж нижчий рівень. Усі рівні ієрархії взаємопов‘язані: дані на певному рівні можуть бути знайдені на більш низькому рівні та всі дані на більш низькому рівні можуть бути знайдені на ще нижчому і так далі, доки не буде досягнута основа ієрархії.
Архітектура пам‘яті складається з багатьох рівнів, але у кожний момент часу ми маємо справу тільки з двома сусідніми рівнями. Мінімальна одиниця інформації яка може бути присутня або відсутня у дворівневій ієрархії називається блоком. Розмір такого блоку може бути або фіксованим, або змінним. Якщо об‘єм фіксований, то об‘єм пам‘яті має бути кратним об‘єму блока.
Вдале чи невдале звернення до більш високого рівня називається відповідно попаданням (hit) або промахом (miss). Попадання це звернення до об‘єкта пам‘яті, який знайдено на даному рівні. Якщо об‘єкт не знайдено на даному рівні, така ситуація називається промахом. Коефіцієнт попадань (hit ratio) обчислюється як відносна кількість вдалого звернення до блока від загальної кількості звернень. Коефіцієнт промахів (miss ratio) – це відносна кількість промахів при зверненні до пам‘яті. Зрозуміло, сума цих коефіцієнтів повинна в результаті давати 1 або 100% якщо обчислення ведеться у процентах.