2014-10-07 4 views
4

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

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

+0

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

+0

Я вижу, что вы используете C++. Не можете ли вы создать два класса, которые наследуются от одного и того же интерфейса, а затем создать правильный экземпляр в зависимости от режима? – Vincent

+0

Если есть только несколько случаев, вы можете сделать функцию в цикле параметром шаблона.Выберите во время выполнения (например, оператор switch), шаблонную функцию, содержащую цикл. Помните, что это увеличит размер кода. –

ответ

2

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

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

2

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

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

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

1

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

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

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

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