stringtranslate.com

Планирование инструкций

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

Остановки конвейера могут быть вызваны структурными опасностями (ограничение ресурсов процессора), опасностями данных (выходные данные одной инструкции необходимы для другой инструкции) и опасностями управления (ветвление).

Опасности данных

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

  1. Чтение после записи (RAW или «True»): Инструкция 1 записывает значение, которое позже будет использовано Инструкцией 2. Инструкция 1 должна идти первой, иначе Инструкция 2 прочитает старое значение вместо нового.
  2. Запись после чтения (WAR или «Анти»): Инструкция 1 считывает место, которое позже перезаписывается Инструкцией 2. Инструкция 1 должна идти первой, иначе она прочитает новое значение вместо старого.
  3. Запись после записи (WAW или «Вывод»): две инструкции записывают одно и то же место. Они должны происходить в исходном порядке.

Технически существует четвертый тип: «Чтение после чтения» (RAR или «Ввод»): обе инструкции считываются из одного и того же места. Входная зависимость не ограничивает порядок выполнения двух операторов, но полезна при скалярной замене элементов массива.

Чтобы убедиться, что мы соблюдаем три типа зависимостей, мы строим граф зависимостей, который представляет собой ориентированный граф , в котором каждая вершина является инструкцией и существует ребро от I 1 до I 2 , если I 1 должно предшествовать I 2 из-за зависимость. Если зависимости, переносимые циклом, не учитываются, граф зависимостей представляет собой ориентированный ациклический граф . Тогда любой топологический вид этого графа является допустимым расписанием команд. На краях графика обычно указывается задержка зависимости. Это количество тактов, которое должно пройти, прежде чем конвейер сможет продолжить выполнение целевой инструкции без остановки.

Алгоритмы

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

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

Порядок фаз

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

Если планируемая архитектура имеет последовательности команд, которые имеют потенциально недопустимые комбинации (из-за отсутствия взаимоблокировок инструкций), инструкции должны быть запланированы после выделения регистров. Этот второй этап планирования также улучшит размещение кода разлива/заполнения.

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

Типы

Существует несколько типов планирования инструкций:

  1. Локальное ( базовое блочное ) планирование : инструкции не могут перемещаться через границы базового блока.
  2. Глобальное планирование : инструкции могут перемещаться через границы базовых блоков.
  3. Планирование по модулю : алгоритм создания программной конвейерной обработки , который является способом увеличения параллелизма на уровне команд за счет чередования различных итераций внутреннего цикла .
  4. Планирование трассировки : первый практический подход к глобальному планированию. Планирование трассировки пытается оптимизировать путь потока управления, который выполняется чаще всего.
  5. Планирование суперблоков : упрощенная форма планирования трассировки, которая не пытается объединить пути потока управления на «боковых входах» трассировки. Вместо этого код может быть реализован с помощью более чем одного расписания, что значительно упрощает генератор кода.

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

Коллекция компиляторов GNU — это один из компиляторов, который, как известно, выполняет планирование инструкций с использованием флагов -march(как набора команд, так и планирования) или -mtune(только планирования). Он использует описания задержек инструкций и того, какие инструкции могут выполняться параллельно (или, что эквивалентно, какой «порт» каждая использует) для каждой микроархитектуры для выполнения задачи. Эта функция доступна практически для всех архитектур, поддерживаемых GCC. [2]

До версии 12.0.0 планирование инструкций в LLVM /Clang могло принимать только переключатель -march(называемый target-cpuна языке LLVM) как для набора команд, так и для планирования. В версии 12 добавлена ​​поддержка -mtune( tune-cpu) только для x86. [3]

Источники информации о задержке и использовании портов включают:

LLVM llvm-exegesisследует использовать на всех машинах, особенно для сбора информации на машинах, отличных от x86. [6]

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

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

  1. ^ Су, Чинг-Лонг; Цуй, Чи-Ин; Деспейн, Элвин М. (1994). Методы проектирования и компиляции архитектуры малой мощности для высокопроизводительных процессоров (PDF) (Отчет). Лаборатория передовой компьютерной архитектуры. АКАЛ-ТР-94-01.( Холодное планирование )
  2. ^ «Параметры x86» . Использование коллекции компиляторов GNU (GCC) .
  3. ^ «⚙ D85384 [X86] Добавлена ​​базовая поддержка параметра командной строки -mtune в clang». Reviews.llvm.org .
  4. ^ «Ресурсы по оптимизации программного обеспечения. C++ и сборка. Windows, Linux, BSD, Mac OS X». Агнер Фог .
  5. ^ «Задержка инструкций x86, x64, задержка памяти и дампы CPUID» . instlatx64.atw.hu .См. также ссылку «Комментарии» на странице.
  6. ^ "llvm-exegesis - Тест машинных инструкций LLVM" . Документация LLVM 12 .

дальнейшее чтение