Выравнивание памяти против выравнивания страницы

0

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

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

Поэтому, мой вопрос заключается в том, есть ли какое-то правило или пороговое значение, когда мы должны сознательно смещать данные, чтобы избежать проблемы выравнивания страниц; и когда это не так, чтобы получить преимущества стандартного выравнивания памяти?

  • 0
    «Ассоциативность кэша» является хорошим поисковым термином. Надеюсь, вы можете заменить свой второй абзац в своем мозгу лучшей моделью того, чего вы хотите избежать.
  • 0
    Это, безусловно, не имеет ничего общего с C #, C ++ или C. В частности, не C #.
Показать ещё 6 комментариев
Теги:
performance
caching

2 ответа

1
Лучший ответ

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

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

Наконец, даже "эмпирическое правило" о "выравнивании наших переменных с границей N-байта" подчиняется базовому оборудованию. Большинство новых архитектур x86 для настольных компьютеров (большинство из которых составлено примерно после 2011 года) предпочитают упакованные данные, а не выровненные данные, потому что стоимость загрузки слов, упакованных по границе кешлин, стала дешевле, чем загружать больше общих линий для представления одного и того же набора данных. Но на мобильном устройстве работает ARM? Выравнивание по-прежнему очень важно.

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

2

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню