предсказание ветвления на указателе функции

У меня есть цикл, который работает снова и снова. Логика внутри этого цикла зависит от режима, в котором находится программа. Чтобы повысить производительность, я подумал, что можно инициализировать массив указателей на функции, functionPtr [], чтобы просто вызывать functionPtrmode, которая запускает правильную логику. Цикл будет оставаться в одном и том же режиме в течение многих циклов (число неизвестно заранее, но многие тысячи). Программа работает только на компьютере Intel x64 и не требует переносимости.

Я надеялся, что ЦП будет использовать предсказание ветвления, но так как моя ветвь не является условной (на уровне сборки), но местоположение ветки действительно зависит от переменной (functionPtr + mode). Будет ли процессор пытаться вычислить режим functionPtr + и начнет вытягивать эти инструкции во время нахождения в конвейере?

4

Решение

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

Учитывая, что между сменой режима и параметрами команд достаточно времени, конвейер будет успешно извлекать правильную инструкцию каждый раз без каких-либо дополнительных усилий.

2

Другие решения

Да, достаточно недавние процессоры могут делать (по крайней мере что-то вроде) предсказание ветвления для косвенных переходов.

От Pentium (первого Intel, который сделал прогнозирование ветвления) до первого Pentium IV, все, что использовалось для непрямых ветвлений, — это целевой буфер ветвления (BTB). Это означало, что они «предсказывали» такие ветви правильно, когда (и только когда) цель была точно такой же, как и предыдущая цель — что звучит так, как будто это подходит для вашего случая.

Начиная с Pentium M / Prescott (последний Pentium IV), Intel улучшила предсказание ветвлений для косвенных скачков, используя двухуровневый адаптивный предиктор. Если я правильно понимаю ваш вопрос (т. Е. Ваш цикл будет выполняться с одной и той же целью на протяжении многих последовательных итераций, и это то, что вас волнует), даже просто BTB будет достаточно для ваших целей. Двухуровневый предиктор стал бы более полезным, если (например) вы разветвлялись на младший значащий бит последовательных чисел, поэтому у вас была предсказуемая схема перехода к одной цели за одну итерацию, а другой — на следующей итерации. С таким шаблоном только BTB всегда будет предсказывать ветвление неправильно, но двухуровневый предиктор в текущем процессоре будет предсказывать правильно (после первой пары итераций, чтобы шаблон мог быть обнаружен).

2

Из микроархитектуры процессоров Intel, AMD и VIA Руководство по оптимизации для программистов на сборках и производителей компиляторов

http://www.agner.org/optimize/microarchitecture.pdf

раздел 3.7 (для Sandy Bridge другие процессоры находятся в других разделах)
Распознавание образов для непрямых прыжков и звонков
Косвенные переходы и косвенные вызовы (но не возвраты) прогнозируются с использованием того же двухуровневого предиктора, что и инструкции перехода.

Указатель на функцию является косвенным вызовом.

1