BOOST_LIKELY и __builtin_expect по-прежнему актуальны?
Я понимаю, что объясняется здесь, а также они включают в себя подсказки для процессора для статического предсказания ветвления.
Мне было интересно, насколько они актуальны для процессоров Intel сейчас, когда процессоры Intel перестали поддерживать подсказки статического предсказания, как упомянуто здесь. Также, если я понимаю, как это работает сейчас, число инструкций ветвления в пути будет единственным, что может контролировать компилятор, и какой путь ветвления прогнозируется, выбирается и декодируется, определяется во время выполнения.
Учитывая это, существуют ли сценарии, в которых подсказки ветвления в коде все еще полезны для программного обеспечения, нацеленного на последние процессоры Intel, возможно, с использованием условного возврата или для избежания количества инструкций ветвления в критическом пути в случае вложенных операторов if / else?
Кроме того, если они все еще актуальны, приветствуются любые особенности gcc и других популярных компиляторов.
PS Я не за преждевременную оптимизацию и не заправляю код этими макросами, но мне интересна эта тема, так как я работаю с некоторым критичным по времени кодом и все еще хотел бы уменьшить помехи в коде, где это возможно.
Спасибо
1 ответ
Как и в разделе комментариев к вашему вопросу, вы правильно выясните, что:
- В процессорных картах Intel x86 больше нет подсказок по статическому предсказанию ветвлений в карте кодов операций;
- Динамическое предсказание ветвлений для "холодных" условных переходов имеет тенденцию предсказывать путь падения;
- Компилятор может использовать
__builtin_expect
переупорядочить, какой путь конструкции if-then-else будет размещен как случай падения в сгенерированной сборке.
Теперь рассмотрим кодовую базу, скомпилированную для нескольких целевых архитектур, а не только для Intel x86. Многие из них имеют либо статические подсказки ветвления, либо динамические предикторы ветвления различной сложности, либо и то и другое.
В качестве примера, архитектура Intel Itanium действительно предлагает обширную систему подсказок для прогнозирования для всех типов команд: поток управления, загрузка / хранение и т. Д. И Itanium был спроектирован так, чтобы компилятор полностью оптимизировал код со всеми этими статически назначенными слотами команд в связка и подсказки.
Следовательно, __builtin_expect
все еще актуален для (редких) случаев, когда 1) информация правильного предсказания ветвления была слишком трудной для автоматического определения компилятором, и 2) было также известно, что базовое оборудование, по крайней мере, на одной из целевых архитектур неспособно надежно прогнозировать их динамически. Учитывая, что некоторые маломощные процессоры включают в себя примитивные предикторы ветвления, которые не отслеживают историю ветвлений, но всегда выбирают путь перехода, это начинает выглядеть выгодно. Для современного оборудования Intel x86 не так уж и много.