Выравнивание памяти на 32-битном процессоре Intel

32-разрядные процессоры Intel, такие как Pentium, имеют 64-разрядную шину данных и, следовательно, получают 8 байтов на доступ. Исходя из этого, я предполагаю, что физические адреса, которые эти процессоры излучают на адресной шине, всегда кратны 8.

Во-первых, верен ли этот вывод?

Во-вторых, если это правильно, то необходимо выровнять элементы структуры данных по 8-байтовой границе. Но я видел людей, использующих 4-байтовое выравнивание вместо этих процессоров.

Как они могут быть оправданы в этом?

12 голосов | спросил Frederick The Fool 28 J0000006Europe/Moscow 2009, 14:18:51

5 ответов


0

Обычное практическое правило (прямо из руководств Intel и AMD по оптимизации) заключается в том, что каждый тип данных должен быть выровнен по своему размеру. int32 должен быть выровнен по 32-разрядной границе, а int64 на 64-битной границе и так далее. Символ будет хорошо вписываться в любом месте.

Еще одно практическое правило: «Компилятору сообщили о требованиях выравнивания». Вам не нужно беспокоиться об этом, потому что компилятор знает, как добавить правильные отступы и смещения, чтобы обеспечить эффективный доступ к данным.

Единственное исключение - при работе с инструкциями SIMD, когда вы должны вручную обеспечить выравнивание на большинстве компиляторов.

  

Во-вторых, если это правильно, то один   следует выровнять элементы структуры данных по   8-байтовая граница. Но я видела   люди, использующие 4-байтовое выравнивание   вместо этого на этих процессорах.

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

ответил jalf 28 J0000006Europe/Moscow 2009, 15:51:36
0

Физическая шина имеет ширину 64 бита ... кратная 8 -> да

ОДНАКО, есть еще два фактора, которые следует учитывать:

  1. Некоторые наборы команд x86 адресованы байтами. Некоторые выровнены по 32 битам (поэтому у вас есть 4 байта). Но ни одна (основная) инструкция не выровнена по 64 битам. Процессор может обрабатывать неправильный доступ к данным.
  2. Если вы заботитесь о производительности, вам следует подумать о строке кэша, а не о основной памяти. Строки кэша намного шире.
ответил J-16 SDiZ 28 J0000006Europe/Moscow 2009, 14:23:05
0

Они оправданы тем, что переход на 8-байтовое выравнивание будет представлять собой изменение ABI, а улучшение предельной производительности не стоит проблем.

Как уже сказал кто-то, кешлайны имеют значение. Все обращения к фактической шине памяти выполняются в виде строк кэша (64 байта в x86, IIRC). См. Документ «Что должен знать каждый программист о памяти», о котором уже упоминалось. Таким образом, фактический трафик памяти выровнен на 64 байта.

ответил janneb 28 J0000006Europe/Moscow 2009, 16:01:49
0

64-битная шина, на которую вы ссылаетесь, питает кеши. Как процессор, всегда читайте и записывайте целые строки кэша. Размер строки кэша всегда кратен 8, а его физический адрес действительно выровнен со смещением в 8 байтов.

Передачи из кэша в регистр не используют внешнюю шину данных, поэтому ширина этой шины не имеет значения.

ответил MSalters 6 PM00000030000004731 2009, 15:48:47
0

Для произвольного доступа и до тех пор, пока данные не выровнены (например, пересекают границу), я не думаю, что это имеет большое значение; правильный адрес и смещение в данных можно найти с помощью простой конструкции И в аппаратном обеспечении. Это становится медленным, когда одного доступа на чтение недостаточно, чтобы получить одно значение. По этой же причине компиляторы обычно помещают небольшие значения (байты и т. Д.), Потому что они не должны быть с определенным смещением; шорты должны быть на четных адресах, 32-разрядные на 4-байтовых адресах и 64-разрядные на 8-байтовых адресах.

Обратите внимание, что если у вас есть кэшированный доступ и линейный доступ к данным, все будет иначе.

ответил Lucero 28 J0000006Europe/Moscow 2009, 14:25:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132