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