stringtranslate.com

Код движения

В информатике движение кода , также известное как подъем кода, опускание кода, инвариантное к циклу движение кода или факторинг кода, представляет собой общий термин для любого процесса, который перемещает код внутри программы для повышения производительности или размера, и является общей оптимизацией . выполняется в большинстве оптимизирующих компиляторов . Различать разные типы движения кода может быть сложно из-за противоречивого значения окружающих его терминов.

Использование

Движение кода имеет множество применений и преимуществ, многие из которых перекрывают друг друга в своей реализации.

Удаление неиспользуемых/бесполезных операций

Диаграмма, изображающая оптимизирующий компилятор, удаляющий потенциально бесполезный вызов инструкции ассемблера «b», переводя его в точку использования.

Code Sinking , также известный как ленивое движение кода , — это термин, обозначающий метод, который уменьшает количество ненужных инструкций путем перемещения инструкций в ветки, в которых они используются: [1] Если операция выполняется перед ветвью и только один из путей ветвления использовать результат этой операции, тогда погружение кода влечет за собой перемещение этой операции в ветку, где она будет использоваться.

Этот метод является формой устранения мертвого кода в том смысле, что он удаляет код, когда его результаты отбрасываются или не используются, но в отличие от устранения мертвого кода он может удалять бессмысленные инструкции, даже если существует возможность использования результатов этой инструкции в путь выполнения кода.

Уменьшение размера программы

Диаграмма, демонстрирующая оптимизацию размера с использованием факторинга кода, при условии, что все операции не зависят от других операций, выполняющихся до нее.

Факторинг кода — это термин, обозначающий метод оптимизации размера, который объединяет общие зависимости в ветвях с веткой над ней. [2] Точно так же, как факторизация целых чисел разлагает число на наименьшие возможные формы (как факторы), факторизация кода преобразует код в наименьшую возможную форму путем объединения общих «факторов» до тех пор, пока не останутся дубликаты.

Уменьшение задержек в зависимости

Пример того, как компилятор может предотвратить зависание зависимостей в собранном коде при перемещении кода, наблюдая за графом зависимостей . Из -за улучшений выполнения вне очереди оптимизация может не иметь никакой пользы для современных процессоров.

Глобальное движение кода , локальное движение кода , планирование кода , планирование инструкций и подъем/опускание кода — все это термины, обозначающие метод, при котором инструкции перестраиваются (или «планируются») для повышения эффективности выполнения внутри ЦП. [3] [4] Современные процессоры способны планировать пять или более инструкций за такт. Однако ЦП не может запланировать инструкцию, основанную на данных текущей (или еще не выполненной) инструкции. Компиляторы будут чередовать зависимости таким образом, чтобы максимизировать количество инструкций, которые ЦП может обработать в любой момент времени. [5]

В несуществующей архитектуре Intel Itanium инструкция прогнозирования ветвления (BRP) вручную поднимается компилятором над ветвями, чтобы ЦП мог немедленно выполнить ветвь. Itanium полагается на дополнительное планирование кода со стороны ЦП для максимизации эффективности процессора. [6]

Движение кода, инвариантное к циклу

Диаграмма, изображающая движение инвариантного к циклу кода по графу выполнения. Это предполагает, что D инвариантен между выполнениями цикла.

Движение кода, инвариантного к циклу, — это процесс перемещения кода, инвариантного к циклу, в позицию вне цикла, что может сократить время выполнения цикла, предотвращая выполнение некоторых вычислений дважды для одного и того же результата.

Примеры компилятора

ЛЛВМ

LLVM имеет понижающий проход в своей единственной статической форме назначения. LLVM 15.0 не будет прерывать операцию, если какой-либо из ее путей кода содержит инструкцию сохранения или если она может выдать ошибку. [7] Кроме того, LLVM не помещает инструкцию в цикл.

GCC

Коллекция компиляторов GNU реализует перемещение кода под названием «факторинг кода» с целью уменьшения размера скомпилированной программы. [8] GCC переместит любой код вверх или вниз, если он «[не] аннулирует существующие зависимости и не вводит новые». [9]

ЛуаЖИТ

LuaJIT использует понижение кода под названием «Поглощение выделения», чтобы уменьшить количество времени, которое скомпилированный код тратит на выделение и сбор временных объектов в цикле. [10] Снижение выделения перемещает выделения на пути выполнения, где выделенный объект может избежать исполняемого кода и, таким образом, потребует выделения кучи . Все удаленные распределения заполняются пересылкой от загрузки к хранилищу по их полям. [11]

Смотрите также

Рекомендации

  1. ^ Крафт, Майкл; Оффут, Джефферсон (1994). «Использование методов оптимизации компилятора для обнаружения эквивалентных мутантов». Тестирование, проверка и надежность программного обеспечения . 4 (3): 131–154. дои : 10.1002/stvr.4370040303. S2CID  35717348 . Проверено 25 февраля 2022 г.
  2. ^ Локи, Габор и др. «Факторинг кода в GCC». Материалы Саммита разработчиков GCC 2004 г. 2004.
  3. ^ Фассе, Юстус и др. Преобразования кода для расширения возможностей планирования предварительного прохода в CompCert. Дисс. Магистерская диссертация. Университет Гренобля в Альпах. https://www-веримаг. изображение. fr/~ boulme/CPP_2022/FASSE-Justus-MSc-Thesis_2021. pdf, 2021.
  4. ^ Гупта, Раджив (1998). «Среда движения кода для глобального планирования инструкций». Конструкция компилятора . Конспекты лекций по информатике. 1383 : 219–233. дои : 10.1007/BFb0026434 . ISBN 978-3-540-64304-3.
  5. ^ Чанг, Похуа П. и др. «Важность планирования кода предварительного прохода для суперскалярных и суперконвейерных процессоров». Транзакции IEEE на компьютерах 44.3 (1995): 353–370.
  6. ^ Шарангпани, Х.; Арора, Х. (сентябрь 2000 г.). «Микроархитектура процессора Itanium». IEEE микро . 20 (5): 24–43. дои : 10.1109/40.877948. ISSN  1937-4143.
  7. ^ «LLVM: исходный файл lib/Transforms/Scalar/Sink.cpp» . llvm.org . Проверено 25 февраля 2022 г.
  8. ^ «Оптимизация факторинга кода - Проект GNU» . gcc.gnu.org . Проверено 25 февраля 2022 г.
  9. ^ «Саммит разработчиков GCC 2004 — Факторинг кода.pdf» (PDF) . gnu.org . Проверено 25 февраля 2022 г.
  10. ^ "Распределение распределения в git HEAD - luajit - FreeLists" . www.freelists.org . Проверено 25 февраля 2022 г.
  11. ^ «Оптимизация распределения распределения». wiki.luajit.org .