Наивно, условно исполняемые инструкции кажутся мне отличной идеей.
Поскольку я читал больше о наборах команд ARM (и ARM-like) (Thumb2, Unicore, AArch64), я обнаружил, что им не хватает битов для условного выполнения.
Было ли условное исполнение ошибкой в то время или последующие изменения сделали его дорогостоящей тратой битов инструкций?
Ответ 4
Несколько неверно сказать, что условное исполнение отсутствует в ARMv8.
Проблема заключается в том, чтобы понять, почему вы не хотите выполнять некоторые инструкции.
Возможно, в ранние дни ARM фактическое неисполнение инструкций имело значение (для власти или что-то еще), но сегодня значимость этой функции заключается в том, что она позволяет вам избегать ветвей для небольших немых прыжков, например код вроде
a = (b > 0≤1: 2). Такого рода вещи более распространены, чем вы можете себе представить - концептуально это такие вещи, как MAX/MIN или ABS (хотя для некоторых процессоров могут быть инструкции для выполнения этих конкретных задач).
В ARMv8, хотя нет общих условно исполняемых инструкций, есть несколько инструкций, которые выполняют конкретную задачу, которую я описываю, а именно позволяю избегать ветвления для коротких немых прыжков; CSEL является наиболее очевидным примером, хотя существуют другие случаи (например, условная настройка условий) для обработки других общих паттернов (в этом случае шаблон оценки короткого замыкания на C).
ИМХО, что сделал ARM, вот что имеет наибольший смысл. Они извлекли особенность условного исполнения, которая остается ценной для современных процессоров (избегайте многих веток), изменяя детали реализации в соответствии с микро-архитектурой современных процессоров.
Ответ 7
"Почему условно исполняемых инструкций нет..." "Было ли условное выполнение ошибкой в то время, или последующие изменения сделали это дорогой тратой инструкций?"
Статья в Википедии на темуПредикатность - недостатки"содержит немного информации:
"Недостатки
Основной недостаток предиката в увеличенном пространстве кодирования. В типичных реализациях каждая инструкция резервирует битовое поле для предиката, определяющего, при каких условиях эта инструкция должна оказывать влияние. Когда доступная память ограничена, как на встроенных устройствах, эта стоимость может быть чрезмерной. Однако некоторые архитектуры, такие как Thumb-2, могут избежать этой проблемы (см. ниже). Другие вреды следующие:
- Предикат усложняет аппаратное обеспечение, добавляя уровни логики для критических путей и потенциально снижая тактовую частоту.
- Предикатный блок включает в себя циклы для всех операций, поэтому более короткие пути могут занять больше времени и быть оштрафованы.
Предикат наиболее эффективен, когда пути сбалансированы или когда наиболее часто выполняется самый длинный путь, но определить такой путь очень сложно во время компиляции, даже при наличии информации профилирования.
...
В архитектуре ARM исходный 32-битный набор команд обеспечивает функцию, называемую условным выполнением, которая позволяет большинству команд быть предикированными одним из 13 предикатов, которые основаны на некоторой комбинации четырех кодов условий, установленных предыдущей инструкцией. Набор команд ARM Thumb (1994) отбросил условное выполнение, чтобы уменьшить размер инструкций, чтобы они могли уместиться в 16 бит, но его преемник, Thumb-2 (2003), преодолел эту проблему, используя специальную инструкцию, которая не имеет никакого эффекта, кроме как предоставить Предикаты для следующих четырех инструкций. 64-битный набор команд, представленный в ARMv8-A (2011), заменил условное выполнение инструкциями условного выбора. ".
В статье Джозефа А. Фишера, Паоло Фарабоски и Клиффа Янга "Встроенные вычисления: подход VLIW к архитектуре, компиляторам и инструментам" на странице 172:
"... полное предопределение усложняет аппаратное обеспечение, ISA и компилятор. В отличие от спекуляций, которые благоприятствуют более глубоким конвейерам и более быстрым тактам, предикация добавляет уровни логики к критическим путям и потенциально снижает тактовую частоту. Операнды предикатов используют драгоценные биты кодирования во всех инструкции и обход операций с предикатными операндами значительно усложняет логику пересылки.Преимущества предиката для ациклического или "ориентированного на контроль" кода были предметом оживленной академической и коммерческой дискуссии, и до сих пор не решено, оправдывают ли преимущества предикации огромные затраты на оборудование для поддержки полной предикации.
Аргумент между полной предикацией и частичной предикацией еще более тонкий. Полная предикация более выразительна и позволяет компилятору предикатировать блоки, содержащие любую комбинацию операций. Частичная предикация требует агрессивной спекуляции и встраивает некоторые внутренние ограничения (например, она не может предикатировать блоки, содержащие операции вызова). С точки зрения сложности реализации, полное предикация предъявляет гораздо более высокие требования к кодировкам команд и микроархитектуре, как описано ранее, тогда как частичное предикация с операциями выбора хорошо подходит для большинства микроархитектур и путей данных и не влияет на сложность, площадь или скорость.,
Предикатирование во встроенном домене
Во встроенном домене трудно оправдать штраф за размер кода большого набора регистров предикатов. Полная предикация предполагает философию "предоплаты", в которой стоимость оборудования предиката должна оплачиваться независимо от того, как часто он используется. Например, добавление 6 битов предиката для адресации 64 предикатов помогло увеличить кодировку IPF до 42 битов. за операцию - подход, который будет чрезмерно дорогостоящим для встроенного процессора.... ".
Стоимость, TDP и патенты, даже уровень технической квалификации, необходимый для разработки конкурирующего продукта, - все это входит в игру. В этом случае это была экономическая выгода, полученная благодаря обновленным методам кодирования. То, что, как считалось, было необходимо, не использовалось в действительности или, по крайней мере, неэффективно (за счет затрат на его реализацию).
Как объяснено в другом ответе, руководство ARM мало говорит о причине, меньше о ней, чем руководство RISC, вот что ARM должен был сказать на странице 8 "Обзора набора инструкций ARMv8":
"3 A64 ОБЗОР
Набор команд A64 обеспечивает функциональность, аналогичную наборам команд A32 и T32 в AArch32 или ARMv7. Однако так же, как добавление 32-битных инструкций к набору команд T32 рационализировало некоторые из ARM ISA поведения, набор инструкций A64 включает дальнейшие рационализации. Основные моменты нового набора команд следующие:
...
3.2 Условные инструкции
Набор команд A64 не включает концепцию предикативного или условного выполнения. Сравнительный анализ показывает, что современные предикторы ветвлений работают достаточно хорошо, так что предикатное выполнение инструкций не дает достаточных преимуществ для оправдания значительного использования пространства кода операции и стоимости его реализации в расширенных реализациях.
Предоставляется очень небольшой набор инструкций "условной обработки данных". Эти инструкции выполняются безоговорочно, но используют флаги условия в качестве дополнительного ввода в инструкцию. Было показано, что этот набор полезен в ситуациях, когда условные ветки плохо предсказывают или иным образом неэффективны.
Дополнительная информация приведена в разделе "4.3. Коды условий", но она не объясняет, каким образом было принято решение.
Разработчики RISC-V ISA (не связанного недавно разработанного ISA) объясняют (http://riscv.org/spec/riscv-spec-v2.0.pdf на странице 23) кое-что из того, что входит в проектирование процессора:
"Условные ветки были разработаны для включения операций арифметического сравнения между двумя регистрами (как это также делается в PA-RISC, Xtensa и MIPS R6) вместо использования кодов условий (x86, ARM, SPARC, PowerPC) или для сравнения только одного регистр против нуля (Альфа, MIPS) или два регистра только для равенства (MIPS). Этот дизайн был мотивирован наблюдением, что объединенная команда сравнения и ветвления вписывается в обычный конвейер, избегая дополнительного состояния кода условия или использования временный регистр, уменьшает статический размер кода и трафик выборки динамических команд.
...
Как условное перемещение, так и предикатные инструкции добавляют сложность микроархитектурам с неупорядоченным порядком, добавляя неявный третий исходный операнд из-за необходимости копировать исходное значение целевого архитектурного регистра в переименованный физический регистр назначения, если предикат имеет значение false, Кроме того, статические решения во время компиляции использовать предикацию вместо ветвей могут привести к снижению производительности входных данных, не включенных в обучающий набор по компилятору, особенно с учетом того, что непредсказуемые ветки редки и становятся реже по мере совершенствования методов прогнозирования ветвей.
Мы отмечаем, что существуют различные методы микроархитектуры для динамического преобразования непредсказуемых коротких прямых ветвлений в код с внутренним предсказанием, чтобы избежать затрат на очистку конвейеров при неправильном предсказании ветвей [6, 10, 9], и они были реализованы в коммерческих процессорах [17].
Простейшие методики просто уменьшают штраф за восстановление после непредсказуемой короткой прямой ветки, просто сбрасывая команды в тени ветки вместо всего конвейера выборки, или выбирая инструкции с обеих сторон, используя широкие интервалы выборки команд или выборки свободных команд. Более сложные методы для ядер, вышедших из строя, добавляют внутренние предикаты для инструкций в тени ветвления, причем значение внутреннего предиката записывается инструкцией ветвления, что позволяет выполнять ветвь и следующие инструкции спекулятивно и не в порядке относительно другой код [17].
[6]
Тимоти Х. Хейл и Джеймс Э. Смит. Избирательное выполнение двух путей. Технический отчет, Uni- Версис Висконсин - Мэдисон, ноябрь 1996 года.
[9]
Хисун Ким, Онур Мутлу, Джаред Старк и Йель Н. Патт. Ветви желаний: объединение условного ветвления и предикации для адаптивного предикатного исполнения. В материалах 38-го ежегодного Международного симпозиума IEEE/ACM по микроархитектуре, MICRO 38, стр. 43–54, 2005.
[10]
А. Клаузер, Т. Остин, Д. Грюнвальд и Б. Колдер. Динамическое предопределение гамака для непредсказуемых архитектур набора команд. В материалах Международной конференции 1998 года по параллельным архитектурам и методам компиляции, PACT 98, Вашингтон, округ Колумбия, США, 1998.
[17]
Баларам Синхарой, Р. Калла, У.Дж. Старке, Ш.К.Ле, Р.Карнони, Дж.А. Ван Норстранд, Б.Дж. Рончетти, Дж. Стуэчели, Дж. Леенстра, Г.Л. Гатри, Д.К. Нгуен, Б. Бланер, К.Ф. Марино, Э. Реттер и П. Уильямс. Многоядерный серверный процессор IBM POWER7. IBM Journal of Research и Development, 55 (3): 1–1, 2011.
Удаление предикатных инструкций на 64-битном ARM освобождает четыре бита при кодировании каждой инструкции, это позволяет добавлять один бит к каждому полю регистров, таким образом удваивая количество регистров.
На мой взгляд, это ошибка - пропускать способность elison в серверном процессоре, прикрепленном к Fabric, но компромиссы сделаны. Это не ошибка (иметь хорошую реализацию), это дорого, это не пустая трата (биты умны и занимаются своим делом). Условия были проще/лучше.
Это как любое расширение процессора или добавление графического процессора; если вы можете умело использовать свои инструменты, тогда вам пора идти, иначе соберитесь с силами.
Цитата из Википедии: "Согласно различным оценкам, TSX может обеспечить примерно 40% более быстрое выполнение приложений в определенных рабочих нагрузках и в 4–5 раз больше транзакций базы данных в секунду (TPS)".
Это "дорого" (в некоторых ситуациях), но важно для текущего стиля программирования или, более пессимистично, для получения гораздо более высоких результатов в синтетических тестах.
Когда-нибудь это будет так же легко, как и у Lego, и вы сможете попросить "это" собраться и выполнить свою ставку; до этого Процессор ДОЛЖЕН поддерживать лени Программиста (и создателей компиляторов) - таким образом, редкость Программ, которые могут работать в основном на GPU (но мы добираемся туда).
Следовательно, удаление (замечательных) функций, которые считаются нежелательными или не были реализованы экономически эффективным и конкурентным способом.
Таким образом, TSX правил в настоящее время; но процессорам ARM тоже нужны модные потоки для их Fabric.
Ссылки на URL:
AMD: https://en.wikipedia.org/wiki/Advanced_Synchronization_Facility
Intel: https://en.wikipedia.org/wiki/Transactional_Synchronization_Extensions
,