Розмотування циклуРозмотування циклу (англ. loop unrolling, loop unwinding) — спосіб, в який намагаються оптимізувати швидкодію програми за рахунок розміру двійкового файлу. Зміни в програмі може робити програміст або оптимізувальний компілятор. Метою розмотування циклу є збільшення швидкодії програми шляхом зменшення (або виключення) інструкцій контролю за циклом, таких як арифметика вказівників і перевірка на завершення циклу на кожній ітерації[1], зменшення витрат на галуження, а також «приховування латентності, особливо, затримку в читанні даних з пам'яті»[2]. Цикли можуть бути перезаписані як послідовності подібних незалежних інструкцій, і таким чином можуть бути усунені накладні витрати обчислення.[3] ПеревагиВитрати в «строгих» циклах часто містять інструкції збільшення вказівника або перехід на наступний елемент у масиві (арифметика вказівників), а також перевірка завершення циклу. Якщо оптимізувальний компілятор або асемблер у стані преобчислити зсув для кожної індивідуально вказаної змінної масиву, вони можуть бути вбудовані в машинний код напряму, отже не потрібно додаткових арифметичних дій під час виконання (зауважте, що в прикладі поданому нижче так не відбувається).
Оптимізувальні компілятори іноді можуть виконувати розмотування циклу автоматично або за запитом. Недоліки
Статичне / Ручне розмотування циклуРучне (або статичне) розмотування циклу вимагає від програміста розбору циклу і перетворення ітерацій як послідовність інструкцій, які зменшать накладні витрати циклу. Динамічне розмотування виконується компілятором. Простий приклад ручного розмотування в СіПідпрограма видаляє 100 елементів з колекції.
Розмотування WHILE циклів
Розмотаний швидше, бо ENDWHILE (який буде скомпільований в перехід на початок циклу) буде виконуватись на 66 % менш часто. Навіть краще, приклад із «вивертом», який може бути виконаний деякими оптимізувальними компіляторами автоматично, виключає всі безумовні переходи. Примітки
Джерела
|
Portal di Ensiklopedia Dunia