Під час компіляції

Статична диспетчеризація послідовності команд у програмі

Випереджувальне пересилання

Найпоширенішим способом запобігання конфліктам в конвеєрі команд, поява яких викликана залежностями між даними, є випереджувальне пересилання даних із попе­редніх ярусів конвеєра в яруси, де ці дані потрібні, минаючи проміжні яруси конвеєра. Розглянемо застосування випереджувального пересилання на кількох прикладах для конкретних фрагментів коду програми.

Випереджувальне пересилання даних з метою усунення конфлікту і пригальмову­вання конвеєра комп’ютера DLX для коду програми

 

 

Для забезпечення реалізації в конвеєрі випереджувального пересилання в ньому формуються додаткові канали пересилання даних з відповідними мультиплексорами для підключення входів функціональних блоків комп’ютера до цих каналів та додаткові буферні регістри.

 

У деяких комп’ютерах для зменшення кількості конфліктів за даними, аж до повної їх ліквідації, застосовують програмні методи, що передбачають створення оптимізуючих компіляторів, які орієнтовані на усунення можливості появи конфліктів у конвеєрі іще на стадії компіляції програми. Оптимізуючи компілятори, реорганізовують послідов­ність команд та створюють такий об’єктний код, щоб між конфліктуючими командами (командами, здатними до конфлікту) знаходилась достатня кількість неконфліктуючих команд. Якщо компілятору цього зробити не вдається, то він вставляє між конфлікту­ючими командами необхідну кількість команд типу «немає операції». Такий підхід ви­ключає необхідність призупинення роботи конвеєра і виконання випереджувального пересилання, яке вимагає додаткових затрат обладнання та ускладнює керування

Для виявлення конфліктуючих команд в оптимізуючому компіляторі потрібно реа­лізувати відповідні засоби аналізу команд. Ознаками наявності конфліктів за даними є наступні

- для конфліктів за даними типу RAW - наявність збіжностей в адресах читання попередніх команд та адресах запису наступних команд,

- для конфліктів за даними типу WAR - наявність збіжностей в адресах запису по­передніх команд та адресах читання наступних команд,

- для конфліктів за даними типу WAW - наявність збіжностей в адресах запису попередніх команд та адресах запису наступних команд

Тобто оптимізуючий компілятор повинен проводити аналіз на збіжність адрес запи­су і читання сусідніх команд, знаходити конфліктуючі команди, та розводити їх в часі Статична диспетчеризація послідовності команд у програмі під час компіляції ви­користовувалася, починаючи з 60-х років минулого століття, і викликала підвищений інтерес у 80-х роках, коли конвеєрні машини стали поширенішими

Нехай, наприклад, є послідовність операторів: a = b + c;d = e-f. Нижче наведена не оптимізована програма для виконання цих операторів

LW г2,0(г0)

LW гЗ,4(г0)

ADD r4, r2, r3


 

Вхідні дані та результати розміщені в тих же комірках пам’яті, приведених в табл. 5.1. Тоді діаграма виконання програми буде мати вигляд, як це приведено на рис. 5.10 (отри­мана з використанням симулятора WinDLХ).

Як наслідок, повністю усунені два блокування (стосовно регістрів гЗ і г4), та в двох блокуваннях (стосовно r6 і r7) забрано по одному такту затримки. Тобто в цілому забра­но 6 тактів. Залежності, які залишилися, можна забрати, використавши схеми обходу.

Відзначимо, що використання різних регістрів для першого і другого операторів було достатньо важливим для реалізації такого правильного планування. Зокрема, якби змінна е була б завантажена в той же самий регістр, що b або с, то таке планування не було б коректним. У загальному випадку планування конвеєра може вимагати збільше­ної кількості регістрів.

Статична диспетчеризація передбачає реорганізацію послідовності команд, серед яких відсутні команди переходу, за винятком початку і кінця цієї послідовності. Плану­вання такої послідовності команд здійснюється досить просто, оскільки в компіляторі передбачено, що кожна наступна команда виконуватиметься, якщо виконується перша з них. Тому можна побудувати граф залежностей цих команд і впорядкувати їх так, щоб мінімізувати кількість призупинень конвеєра. Для простих конвеєрів використання ста­тичної диспетчеризації дає цілком задовільні результати. Проте, коли довжина конвеєра збільшується і його затримки зростають, потрібні складніші алгоритми диспетчеризації.