Вопросы для самопроверки
-
В архитектуре x86/amd64 присутствуют инструкции арифметических операций, а также инструкции ветвелния в зависмости от различных флагов переноса/переполнения, а эти флаги изменяются при выполнении арифметических операций. Какой категории инструкций относятся арифметические инструкции в x86/amd64?
- С единичным результатом
- С множественными результатами
- С не пересекающимися результатами
- Межблоковые
- Зависимые между собой
-
Какой метод выбора инструкций препочтителен для компиляции исходного кода на языках C#/Kotlin в представление платформ .NET/JVM? Поясните свой ответ
- На основе макросов
- На основе деревьев
- На основе графов без циклов
- На основе графов
-
Метод выбора инструкций А удачнее метода Б, потому что он позволяет смотреть на несколько инструкций целиком, а не по одной. Выберите наиболее подходящие А и Б (несколько вариантов).
- А = На основе графов, Б = на основе деревьев
- А = На основе деревьев, Б = на основе макросов
- А = На основе макросов, Б = на основе деревьев
- А = На основе графов с циклами и без, Б = на на основе макросов
-
Существует метод потимизации инстуркций, когда просматривается некоторое "окно" длиною в N инструкций, и в нём происходят упрощения и переупорядочивания. Такой метод называется ...
- peephole оптимизацией
- динамическое программирование
- супероптимизации
- на основе сопоставления с образцами
- на основе покрытия графов
-
Выберите правильное утверждение о "жадном" метода выбора инструкций на основе графа
- работает быстро, но дает неоптимальный результат
- работает медленно, и дает оптимальный результат
- работает быстро, и дает оптимальный результат
- некорректен для некоторых архитектур
-
Как называется операция, проверяющая, что сумма чисел не выходит за некоторую границу, и возвращающая максимальный результат про выходе за эту границу
- сложение с умножением (fused multiply-add)
- SIMD операция сложения
- сложение с насыщением.
-
В чем проблема осуществления выбора инструкций на основе динамического программирования?
- Дает неоптимальный результат из-за особенностей метода
- Некорректен для некоторых архитектур
- Предположение, что из оптимальных решений частей задачи можно получить глобальное оптимальное решение -- не верно.
-
Что не так с выбором инструкций с помощью синтаксического анализа?
- Нет возможности принимать решения в зависимости от конкретных констант.
- Размер грамматик слишком большой
- Наличие неконфликтной и поддерживаемой грамматики не гарантировано
- Всё выше перечисленное.
-
Что не так с выбором инструкций с помощью деревьев? (несколько вариантов ответов)
- Не годятся для представления графа потока управления, поэтому стоит применять только на линейных участках
- Инструкции с множественными выходами и непересекающимся выходами плохо моделируются, так как у деревьев только один корень.
- Не эффективны, так как не могут представлять общие подвыражения.
- Всё выше перечисленное.
-
Что не так с выбором инструкций с помощью графов без циклов? (несколько вариантов ответов)
- Не годятся для представления графа потока управления, поэтому стоит применять только на линейных участках
- Инструкции с множественными выходами и непересекающимся выходами плохо моделируются, так как у деревьев только один корень.
- Не эффективны, так как не могут представлять общие подвыражения.
- Задача оптимального выбора инструкций вычислительно сложнее, чем для деревьев.
- Всё выше перечисленное.
-
Что можно порекомендовать разработчикам компиляторов, если некоторые категории инструкций не ложатся в текущий алгоритм выбора инструкций? (несколько вариантов ответов)
- Использовать другой алгоритм выбора инструкций
- Не порождать инструкции данной категории
- Сделать отдельный проход для порождения инструкций данной категории
Заключение
Несмотря на полвека исследований алгоритмов порождения инструкций, компиляция в оптимизированный код является всё ещё не до конца решенной задачей. Существуют разные подходы, каждый из которых не является вполне универсальным. Из-за этого обход этих недостатков обычно делается с помощью отдельной фазы компиляции. Например, если выбор SIMD, NEON и векторных инструкций не поддерживается в фазе порождения кода, то стоит добавлять отдельный проходы, которые порождают такие инструкции, часто с помощью так называемых polyhedral оптимизаций, или используя super-word parallelism :cite:`Larsen2000`.
При порождении инструкций для заказных процессоров (англ. Application-specific instruction-set processor, ASIP) задача усложняется другим образом. Так как в процессор можно добавлять пользовательские инструкции, то шаблоны распознавания инструкций больше не становятся статически известными при сборке компилятора.
Как было уже сказано ранее, оптимальное порождения инструкций должен производится вместе с другими фазами порождения кода. Переупорядочивание инструкций ради более грамотного использования конвейера особенно актуально для VLIW-процессоров. Другой проблемой является рематериализация при распределении регистров: иногда значения легче пересчитать заново, чтобы снизить количество занятых регистров и сократить пересылки между процессором и памятью.
Также существуют методы порождения инструкций :cite:`Leather2019`, которые стоят особняком от выше упомянутых, так как они основаны на машинном обучении.