Как эволюция архитектуры ЦП повлияла на производительность вызовов виртуальных функций? - PullRequest
30 голосов
/ 30 августа 2011

Несколько лет назад я узнал о ассемблере x86, конвейерной обработке процессора, промахах кэша, предсказании ветвлений и прочем джазе.

Это была история о двух половинках.Я прочитал обо всех замечательных преимуществах длинных конвейеров в переупорядочении команд процессора, предварительной загрузке кэша, чередовании зависимостей и т. Д.

Недостатком было то, что любое отклонение от нормы было чрезвычайно дорогостоящим.Например, IIRC некоторый процессор AMD в эпоху раннего гигагерца имел штраф 40 каждый раз, когда вы вызывали функцию через указатель (!), И это было, по-видимому, нормально.

Это не пренебрежимо малое число «не беспокойтесь об этом»! Имейте в виду, что «хороший дизайн» обычно означает «максимально учитывать ваши функции» и «кодировать семантику втипы данных ", которые часто подразумевают виртуальные интерфейсы.

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

Я понимаю, что тенденция к длинному ЦП изменилась, поскольку мывойти в эру малой мощности.Вот мой вопрос:

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

1 Ответ

28 голосов
/ 01 сентября 2011

Процессор AMD в эпоху раннего гигагерца имел штраф в 40 циклов каждый раз, когда вы вызывали функцию

Да ... такой большой ..

СуществуетМетод «косвенного предсказания ветвления», который помогает предсказать скачок виртуальной функции, ЕСЛИ некоторое время назад произошел такой же скачок.Существует еще штраф за первый и неверно предсказанный вирт.функция jump.

Поддержка варьируется от простого «предсказанного правильно, если и только если предыдущая непрямая ветвь была точно такой же» до очень сложных двухуровневых десятков или сотен записей с обнаружением периодического чередования 2-3 целевых адресовдля одной косвенной инструкции jmp.

Здесь произошел большой прогресс ...

http://arstechnica.com/hardware/news/2006/04/core.ars/7

, впервые представленный в Pentium M: ...косвенный предсказатель ветвления.

косвенный предсказатель ветвления

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

http://www.realworldtech.com/page.cfm?ArticleID=rwt051607033728&p=3

Косвенное предсказание ветвлений было впервые введено с помощью микроархитектуры Prescott от Intel, а затем Pentium M.

между 16-50% всех ошибочных прогнозов ветвей были косвенными (в среднем 29%).Реальное значение косвенного неверного предсказания ветвлений для многих новых скриптовых языков или языков высокого уровня, таких как Ruby, Perl или Python, которые используют интерпретаторы.Другими распространенными косвенными распространенными ветвями являются виртуальные функции (используемые в C ++) и вызовы указателей на функции.

http://www.realworldtech.com/page.cfm?ArticleID=RWT102808015436&p=5

AMD приняла некоторые из этих усовершенствований;например, добавление косвенных массивов предикторов ветвлений в Барселоне и последующих процессорах.Тем не менее, K8 имеет более старые и менее точные предсказатели ветвления, чем Core 2.

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

3.12 Косвенные скачки на более старых процессорах Косвенныепереходы, косвенные вызовы и возвраты могут каждый раз переходить на другой адрес.Метод прогнозирования для косвенного перехода или косвенного вызова в процессорах старше, чем PM и K10, состоит в том, чтобы просто предсказать, что он достигнет той же цели, что и в прошлый раз, когда он был выполнен.

и тот жеpdf, стр. 14

Косвенное прогнозирование перехода Косвенный переход или вызов - это инструкция передачи управления, которая имеет более двух возможных целей.Программа на C ++ может генерировать косвенный переход или вызов с ... виртуальной функцией.Косвенный переход или вызов генерируется в сборке путем указания регистра, переменной памяти или индексированного массива в качестве пункта назначения инструкции перехода или вызова.Многие процессоры делают только одну запись BTB для косвенного перехода или вызова.Это означает, что всегда будет предсказано достижение той же цели, что и в прошлый раз.Поскольку объектно-ориентированное программирование с полиморфными классами стало более распространенным, существует растущая потребность в прогнозировании косвенных вызовов с несколькими целями.Это можно сделать, назначив новую запись BTB для каждой новой обнаруженной цели прыжка.Буфер истории и таблица истории паттернов должны иметь место для более чем одного бита информации для каждого инцидента перехода, чтобы различать более двух возможных целей.PM - первый процессор x86, который реализует этот метод.Правило предсказания на с.12, все еще применяется с модификацией, согласно которой теоретический максимальный период, который может быть точно спрогнозирован, равен mn, где m - количество различных целей на непрямой скачок, посколькуэто разные возможные подпоследовательности длины n.Однако этот теоретический максимум не может быть достигнут, если он превышает размер BTB или таблицы истории паттернов.

В руководстве Агнера имеется более подробное описание предиктора ветвления во многих современных ЦП и эволюции предиктора вЦП каждого производителя (x86 / x86_64).

Также много теоретических методов "косвенного предсказания ветвления" (см. Google исследователь);даже вики сказал несколько слов об этом http://en.wikipedia.org/wiki/Branch_predictor#Prediction_of_indirect_jumps /

Для атомов из микроагента Агнера:

Прогнозирование непрямых ветвлений У Атома нет предиктора шаблонов для непрямых ветвей в соответствии ск моим тестам.Предполагается, что непрямые ветви переходят к той же цели, что и в прошлый раз.

Таким образом, при малом энергопотреблении косвенное предсказание ветвления не настолько продвинуто.То же самое делает Via Nano:

Предполагается, что косвенные прыжки будут идти к той же цели, что и в прошлый раз.

Я думаю, что более короткий конвейер с малой мощностью x86 имеет меньший штраф,7-20 тиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...