Влияет ли порядок учеников на скорость доступа? - PullRequest
3 голосов
/ 23 марта 2020

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

Итак, мой вопрос: зависит ли скорость доступа от позиции члена в классе? Я слышал, что самый важный член должен быть первым в объявлении члена, и это имеет смысл для меня, потому что это означает, что указатель this класса указывает на тот же адрес, что и важный член (при условии, что не виртуальные классы ). Принимая во внимание, что если бы важный элемент находился в любой другой позиции, ЦПУ должен был бы вычислить его позицию, добавив this и смещение в макете класса.

С другой стороны, я знаю, что компилятор представляет этот адрес как qword-ptr, который содержит информацию о смещении.

Итак, мой вопрос сводится к следующему: занимает ли разрешение qword-ptr постоянное время или оно увеличивается, если смещение не равно 0? Одинаково ли поведение на разных платформах?

1 Ответ

6 голосов
/ 23 марта 2020

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

На x86, [reg] против [reg + disp8] стоит 1 дополнительный байт для 8-битного смещение части режима адресации. На RIS C -подобных машинах, например, ARM, инструкции фиксированной ширины означают, что в инструкциях загрузки / сохранения всегда есть несколько бит для смещения (которые могут быть просто равны нулю для доступа к первому элементу при указателе на начало объекта ).


Сгруппируйте самые горячие элементы в начале класса, предпочтительно отсортировав их по размеру, чтобы избежать пробелов для заполнения ( Как организовать элементы в структуре так, чтобы тратить на них меньше места выравнивание? ) Надеюсь, все горячие элементы будут в одной строке кэша . (Если ваш класс / структура расширяется до 2-й строки кэша, мы надеемся, что большую часть времени в кеше должна оставаться только первая строка, что сокращает объем вашего рабочего набора.)

Если член не является на той же странице , что и в начале объекта, оптимизация поиска указателей в семействе Sandybridge может вызвать дополнительную задержку, если this также был загружен из памяти. Существует ли штраф, когда base + offset находится на странице, отличной от базовой? Обычно это уменьшает задержку использования нагрузки L1d с 5 до 4 циклов для режимов адресации, таких как [rdi + 0..2047], оптимистично используя только регистр значение в качестве входа в TLB, но нужно повторить попытку, если он угадал. (Не конвейерный грипп sh, просто повторная попытка этой загрузки без ярлыка.)


Обратите внимание, что указатели функций в основном зависят от предсказания ветвления, чтобы быть эффективными с доступом задержка имеет значение только для проверки прогноза (и запускает восстановление ветвления, если оно было неверным). т. е. спекулятивное выполнение + предсказание ветвлений скрывает зависимости управления задержкой в ​​процессорах с неработающим exe c.

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