Есть ли результаты теста производительности для использования вероятных / маловероятных подсказок?
gcc содержит вероятные / маловероятные подсказки, которые помогают компилятору генерировать машинный код с лучшим предсказанием переходов.
Есть ли какие-либо данные о том, как правильное использование или неиспользование этих подсказок влияет на производительность реального кода в некоторых реальных системах?
2 ответа
Вопрос отличается, но ответ Питера Кордеса на этот вопрос дает четкий намек;) . Современные процессоры игнорируют статические подсказки и используют динамическое предсказание ветвлений.
Я не знаю какого-либо тщательного анализа таких конкретных намеков. В любом случае, это будет очень специфично для процессора. В общем, если вы уверены в вероятности (например, > 90%), то, вероятно, стоит добавить такие аннотации, хотя улучшения будут сильно различаться в зависимости от конкретного случая использования.
Современные настольные процессоры, как правило, имеют очень хороший прогноз ветвления. Если ваш код в любом случае находится на "горячем пути", динамический предсказатель ветвления быстро выяснит, что ветвь смещена сама по себе. Такие подсказки в основном полезны, чтобы помочь статическому предиктору, который срабатывает, если информация о динамическом переходе недоступна.
На x86 статический предиктор предсказывает, что прямые ветви не будут приняты, и обратные ветви будут приняты (так как они обычно указывают на циклы). Поэтому компилятор будет корректировать статическое расположение кода в соответствии с предсказаниями. (Это также может помочь поместить горячий путь в соседние строки кэша, что может помочь в дальнейшем.)
На PPC некоторые инструкции перехода должны немного предсказать их вероятность. Я не знаю, будет ли компилятор переставлять код тоже.
Я не знаю, как процессоры ARM предсказывают переходы. Как устройство с низким энергопотреблением, оно может иметь менее сложное прогнозирование ветвлений, а статическое прогнозирование может оказать большее влияние.
Вероятные / маловероятные подсказки работают за счет предварительной загрузки ICache с кодом ветвления, который программист считает в целом правильным. Предикторы ветвления по своей природе полагаются на ограниченные исторические данные, эффективны только в циклах (или небольших кодовых базах), и циклы не всегда являются проблемой в отношении производительности ветвления - например, в моделировании в реальном времени или в игре., где большое количество симуляторов / игровой логики необходимо обрабатывать для большого количества объектов с очень высокой скоростью. Предикторы ветвления не могут эффективно работать в этом контексте, и это серьезная проблема производительности для разработчиков симуляторов. Эта логика может состоять буквально из тысяч различных, неповторяющихся условных выражений в каждом кадре, что полностью отключает способность предсказателя ветвления работать эффективно.
Отвечая на исходный вопрос, компиляторы склонны предполагать, что условное выражение будет ложным при генерации кода для предварительной загрузки Icache. Вы должны проверить вывод сборки в своем коде, чтобы убедиться в этом, а затем вы сможете создать макрос для условных выражений, которые вы хотите предварительно загрузить производительным способом, если вы не хотите структурировать свой код в соответствии с конкретной архитектурой процессора..
Согласно некоторым исследованиям, современные игровые движки на современных процессорах тратят 60-80% своего времени на промахи в кэше, а неверные предсказания переходов составляют примерно 15% этих промахов. Чтобы приспособиться к современному игровому движку, предсказателю ветвления потребуются исторические данные для всего фрейма игровой логики, вероятно, включающие несколько мегабайт данных для каждого конвейера.