Стоимость полиморфизма

Я смотрю на вызов виртуального метода ниже в x86-64:

mov     rcx, qword ptr [x]   
mov     rax, qword ptr [rcx]
call    qword ptr [rax+8]

а также таблицы задержки Агнера Фога:

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

Поскольку я использую процессор Ivy Bridge, я просматриваю страницу 175.

  1. Прав ли я в том, что первые две инструкции MOV занимают только 2 (они обе перемещают память для регистрации) цикла процессора? Я думал, что вызов виртуального метода был медленнее, чем это?

  2. На странице 178 таблицы задержки команд указано, что задержка этого вызова составляет 2 цикла ЦП (я так думаю?). Что означает CALL "рядом" в отличие от CALL 'r' (регистр) и CALL 'm' (память)?

  3. Так что, согласно буклету Fog, вышеупомянутый ASM требует 6 циклов ЦП, я ничего не понял неправильно?

РЕДАКТИРОВАТЬ: я изменил вызов виртуальной функции на второй в vtable.


person user997112    schedule 08.03.2014    source источник
comment
Не забывайте, что любой из этих обращений к памяти может быть пропущен. И вызов может также вызвать неверное предсказание цели перехода.   -  person Mysticial    schedule 08.03.2014
comment
@Mysticial полностью понял. Просто пытался посмотреть на гарантированный минимум стоимости.   -  person user997112    schedule 08.03.2014
comment
Поскольку единственная зависимость от перемещений - это подтверждение предсказания цели вызова, для правильного предсказания задержка операций будет скрыта из-за выполнения вне очереди (будут накладные расходы на выборку, декодирование и выполнение). Однако задержки ходов увеличивают штраф за неправильное предсказание, поскольку истинное значение будет доступно позже, чем если бы адрес вызова уже был в регистре.   -  person Paul A. Clayton    schedule 08.03.2014
comment
@ PaulA.Clayton, но все вышеперечисленные инструкции зависят друг от друга - значит, они должны выполняться именно в таком порядке? 3-й зависит от 2-го, а 2-й зависит от 1-го?   -  person user997112    schedule 09.03.2014
comment
Да, они зависимы (что увеличивает штраф за неверное предсказание цели). Однако эти зависимости не связаны ни с чем другим (при условии правильного предсказания цели), поэтому механизм OoO может продолжать выполнение инструкций. Они будут занимать пространство ROB (и выдавать слоты очереди для последних двух) и задерживать последующие инструкции фиксация, но если исключить неверное предсказание (которое может быть обычным для косвенных вызовов), это будет аналогично стоимости равное количество зависимых нагрузок и (зависимая) добавка, результат которой никогда не используется.   -  person Paul A. Clayton    schedule 09.03.2014
comment
@ user997112: вызовы near и far различаются тем, находится ли целевая функция в одном и том же сегменте памяти (ужасная штука, придерживайтесь x86-64 и вы не встретите этого ужаса), в то время как вызовы register (r) или memory (m) различаются уровнем косвенности. Есть также относительные звонки, и они, вероятно, самые распространенные.   -  person EOF    schedule 09.03.2014
comment
первые две инструкции MOV занимают всего 2 ... цикла процессора? - НЕТ, потому что они загружаются из памяти. Если целевые значения нагрузки кэшированы, для каждой из них потребуется 3-4 цикла для загрузки данных даже из L1, дюжина циклов из L2 и сотни в случае доступа к памяти. Если у вас много разных непрямых звонков, вероятность промахов выше. И OoO не завершит (удалит) любую инструкцию от предсказанной цели (даже если предсказанная правильная цель) до проверки реальной цели (она будет ждать всех обращений к кешам и / или к памяти). Итак, стоимость оцениваю в несколько раз   -  person osgx    schedule 15.03.2014


Ответы (1)


Прав ли я в том, что первые две инструкции MOV занимают только 2 (они обе перемещают память для регистрации) цикла ЦП? Я думал, что вызов виртуального метода был медленнее, чем это? На странице 178 таблицы задержки команд указано, что задержка этого вызова составляет 2 цикла ЦП (я так думаю?).

Нет, 2 цикла ЦП только с минимальной задержкой.

Давайте проверим таблицы Агнера http://www.agner.org/optimize/instruction_tables.pdf

Целочисленные инструкции.

Инструкция Операнды uops слитый домен uops nonused domain (p015 p0 p1 p5 p23 p4) Задержка Взаимная пропускная способность Комментарии

Inst   Oper        fus p23 p4  Latency Rec.
MOV r32/64,m32/64   1   1        2     0.5

Чтобы узнать время, когда инструкция даст свой результат, используйте столбец «Задержка». И задержка составляет 2 цикла для каждого mov, и указано только минимальное значение (проверьте текст в «Объяснение заголовков столбцов» - «Задержка - это задержка, которую инструкция генерирует в цепочке зависимостей. Числа являются минимальными значениями. Отсутствует кеш , несовпадение, ... может значительно увеличить счетчик часов. ")

Если у вас много разных полиморфных вызовов, необходимая для них память может не кэшироваться. Нам известны задержки кеширования и памяти из различных обзоров, и все они были измерены с помощью длинная цепочка зависимых MOVs, например mov eax, [eax]; mov eax, [eax]; mov eax, [eax]; .... Значения для Ivy: попадание в L1 = 4 цикла, попадание в L2 = 11 циклов, попадание в L3 = 30-40 циклов, промах в кеш-памяти и доступ к памяти = 32 цикла + 60 нс (на 3 ГГц с 3 циклами на нс> 200 циклы). Нет даже простого случая, чтобы получить задержку в 2 цикла (что ближе к ALU, чем L1? Только буфер загрузки с 72 записями для переупорядоченных загрузок?), И не будет шансов получить задержку в 2 цикла на втором mov (его операнде является результатом первого мова, поэтому нет ничего, что могло бы выполнить не по порядку перед удалением первого мова).

В таблицах http://instlatx64.atw.hu/, ссылки на которые есть на Ссылки Агнера есть отчет для Айви InstLatX64 для Intel Core i7-3770K, 3700 МГц, созданный с помощью aida_bench64.dll

27 AMD64: MOV r64, [m64] L: 1,14 нс = 4,0c T: 0,14 нс = 0,50c

И эта таблица показывает реальную задержку (L) для попадания в кэш L1, 4 цикла.

Те же данные (4c для L1, ~ 12c для L2, 26-31c для L3) в 64-ia-32-architecture-optimisation-manual.pdf стр. 46 раздел« 2.2.5.1 Обзор операций загрузки и сохранения ", Таблица" 2-10 Порядок поиска и задержка загрузки "

Так что, согласно буклету Fog, вышеупомянутый ASM требует 6 циклов ЦП, я ничего не понял неправильно?

В лучшем случае, когда первая загрузка была выполнена раньше с Out-of-order = 2 цикла на критическом пути; второе попадание нагрузки в L1 = 4 цикла на критическом пути; 2 цикла на исполнение call; BTB (прогнозирование цели ветвления / косвенная цель ветвления) было успешным, что более вероятно, когда с одного адреса вызова вы всегда переходите к одной и той же цели (или к небольшому количеству целей с периодическими шаблонами) - у вас будет 8 циклов для подтверждения эта ветвь была предсказана правильно, что может быть частично скрыто OoO выполнением целевой функции.

Если какая-либо нагрузка отсутствует в L1 / L2, вы должны добавить соответствующую задержку кэша. Если L3 отсутствует, добавьте 200 циклов.

Если BTB пропустит, у вас будет как минимум 15 штрафных циклов (см. Microarchitecture.pdf Агнера , стр. 27 «3.7 Предсказание переходов в Intel Sandy Bridge и Ivy Brindge; штраф за неправильное предсказание») - для кэшированных мопов; больше для цели в L1i. Вы можете прочитать о более старых BTB на той же странице microarchitecture.pdf, стр. 25 «3.5 Прогнозирование переходов в PM и Core2; Распознавание образов для непрямых переходов и вызовов» и «Организация BTB .. для непрямых переходов и непрямых вызовов».

Очень полезный документ взят из Intel: "Справочное руководство по оптимизации архитектур Intel® 64 и IA-32" 64-ia-32-architecture-optimisation-manual.pdf. В нем есть как предложения по настройке, так и информация о счетчиках производительности, которые помогут вам получить реальные задержки и частоту пропусков для вашего кода (см. Раздел B.6.3.2 «Виртуальные таблицы и косвенные вызовы»).

person osgx    schedule 15.03.2014
comment
Блок из 3 или 4 мкопов должен быть эффективно полностью скрыт (а не частично скрыт OoO выполнением целевой функции) на Ivy Bridge с ›50 записями в очереди задач и› 100 записями ROB - при правильном прогнозе цели - поскольку нет < i> данные зависимости от вызова. Кстати, прокомментировал ОП. Просто пытался посмотреть на гарантированную минимальную стоимость. (возможно, это следует отредактировать в вопросе), поэтому дополнительная информация будет приятной и полезной, но не строго необходимой для ответа на вопрос. - person Paul A. Clayton; 15.03.2014