Опубликован: 19.04.2025 | Доступ: свободный | Студентов: 0 / 0 | Длительность: 01:25:00
Лекция 5:

Вопросы для самопроверки

< Лекция 4 || Лекция 5
  1. В архитектуре x86/amd64 присутствуют инструкции арифметических операций, а также инструкции ветвелния в зависмости от различных флагов переноса/переполнения, а эти флаги изменяются при выполнении арифметических операций. Какой категории инструкций относятся арифметические инструкции в x86/amd64?

    1. С единичным результатом
    2. С множественными результатами
    3. С не пересекающимися результатами
    4. Межблоковые
    5. Зависимые между собой
  2. Какой метод выбора инструкций препочтителен для компиляции исходного кода на языках C#/Kotlin в представление платформ .NET/JVM? Поясните свой ответ

    1. На основе макросов
    2. На основе деревьев
    3. На основе графов без циклов
    4. На основе графов
  3. Метод выбора инструкций А удачнее метода Б, потому что он позволяет смотреть на несколько инструкций целиком, а не по одной. Выберите наиболее подходящие А и Б (несколько вариантов).

    1. А = На основе графов, Б = на основе деревьев
    2. А = На основе деревьев, Б = на основе макросов
    3. А = На основе макросов, Б = на основе деревьев
    4. А = На основе графов с циклами и без, Б = на на основе макросов
  4. Существует метод потимизации инстуркций, когда просматривается некоторое "окно" длиною в N инструкций, и в нём происходят упрощения и переупорядочивания. Такой метод называется ...

    1. peephole оптимизацией
    2. динамическое программирование
    3. супероптимизации
    4. на основе сопоставления с образцами
    5. на основе покрытия графов
  5. Выберите правильное утверждение о "жадном" метода выбора инструкций на основе графа

    1. работает быстро, но дает неоптимальный результат
    2. работает медленно, и дает оптимальный результат
    3. работает быстро, и дает оптимальный результат
    4. некорректен для некоторых архитектур
  6. Как называется операция, проверяющая, что сумма чисел не выходит за некоторую границу, и возвращающая максимальный результат про выходе за эту границу

    1. сложение с умножением (fused multiply-add)
    2. SIMD операция сложения
    3. сложение с насыщением.
  7. В чем проблема осуществления выбора инструкций на основе динамического программирования?

    1. Дает неоптимальный результат из-за особенностей метода
    2. Некорректен для некоторых архитектур
    3. Предположение, что из оптимальных решений частей задачи можно получить глобальное оптимальное решение -- не верно.
  8. Что не так с выбором инструкций с помощью синтаксического анализа?

    1. Нет возможности принимать решения в зависимости от конкретных констант.
    2. Размер грамматик слишком большой
    3. Наличие неконфликтной и поддерживаемой грамматики не гарантировано
    4. Всё выше перечисленное.
  9. Что не так с выбором инструкций с помощью деревьев? (несколько вариантов ответов)

    1. Не годятся для представления графа потока управления, поэтому стоит применять только на линейных участках
    2. Инструкции с множественными выходами и непересекающимся выходами плохо моделируются, так как у деревьев только один корень.
    3. Не эффективны, так как не могут представлять общие подвыражения.
    4. Всё выше перечисленное.
  10. Что не так с выбором инструкций с помощью графов без циклов? (несколько вариантов ответов)

    1. Не годятся для представления графа потока управления, поэтому стоит применять только на линейных участках
    2. Инструкции с множественными выходами и непересекающимся выходами плохо моделируются, так как у деревьев только один корень.
    3. Не эффективны, так как не могут представлять общие подвыражения.
    4. Задача оптимального выбора инструкций вычислительно сложнее, чем для деревьев.
    5. Всё выше перечисленное.
  11. Что можно порекомендовать разработчикам компиляторов, если некоторые категории инструкций не ложатся в текущий алгоритм выбора инструкций? (несколько вариантов ответов)

    1. Использовать другой алгоритм выбора инструкций
    2. Не порождать инструкции данной категории
    3. Сделать отдельный проход для порождения инструкций данной категории

Заключение

Несмотря на полвека исследований алгоритмов порождения инструкций, компиляция в оптимизированный код является всё ещё не до конца решенной задачей. Существуют разные подходы, каждый из которых не является вполне универсальным. Из-за этого обход этих недостатков обычно делается с помощью отдельной фазы компиляции. Например, если выбор SIMD, NEON и векторных инструкций не поддерживается в фазе порождения кода, то стоит добавлять отдельный проходы, которые порождают такие инструкции, часто с помощью так называемых polyhedral оптимизаций, или используя super-word parallelism :cite:`Larsen2000`.

При порождении инструкций для заказных процессоров (англ. Application-specific instruction-set processor, ASIP) задача усложняется другим образом. Так как в процессор можно добавлять пользовательские инструкции, то шаблоны распознавания инструкций больше не становятся статически известными при сборке компилятора.

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

Также существуют методы порождения инструкций :cite:`Leather2019`, которые стоят особняком от выше упомянутых, так как они основаны на машинном обучении.

< Лекция 4 || Лекция 5