Jump to content

Код движения

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

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

[ редактировать ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[ редактировать ]

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

Коллекция компиляторов 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 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c6b19439e2d22ced138ab5a3e1366b45__1697393700
URL1:https://arc.ask3.ru/arc/aa/c6/45/c6b19439e2d22ced138ab5a3e1366b45.html
Заголовок, (Title) документа по адресу, URL1:
Code motion - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)