ЦП и выравнивание данных - PullRequest
12 голосов
/ 11 июня 2010

Прошу прощения, если вы чувствуете, что на это отвечали много раз, но мне нужны ответы на следующие вопросы!

  1. Почему данные должны быть выровнены (на границах 4 байта / 8 байтов / 2 байта)? Здесь я сомневаюсь, что если у процессора есть адресные линии Ax Ax-1 Ax-2 ... A2 A1 A0, то вполне возможно последовательно обращаться к ячейкам памяти. Так почему же необходимо выровнять данные по определенным границам?

  2. Как найти требования к выравниванию, когда я компилирую свой код и генерирую исполняемый файл?

  3. Если, например, выравнивание данных имеет 4-байтовую границу, означает ли это, что каждый последовательный байт расположен по смещению по модулю 4? Я сомневаюсь, что если данные выровнены на 4 байта, значит ли это, что если байт находится на 1004, то следующий байт на 1008 (или на 1005)?

Ответы [ 7 ]

13 голосов
/ 11 июня 2010

ЦП ориентированы на слова, а не на байты. В простом ЦП память обычно конфигурируется так, чтобы возвращать одно слово (32 бита, 64 бита и т. Д.) На строб адреса, где две нижние (или более) адресные строки обычно не имеют значения биты.

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

Некоторые процессоры (инструкции ARM или Intel SSE) требуют согласованной памяти и имеют неопределенную работу при выполнении невыровненных обращений (или выдают исключение). Они экономят значительное пространство на кремнии, не реализуя гораздо более сложную подсистему загрузки / хранения.

Выравнивание зависит от размера слова CPU (16, 32, 64 бита) или в случае SSE - размера регистра SSE (128 бит).

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

6 голосов
/ 11 июня 2010

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

Прежде всего, скажем, вы читаете 4 байта данных одновременно. Скажем также, что ваш процессор имеет 32-битную шину данных. Допустим также, что ваши данные хранятся в байте 2 в системной памяти.

Теперь, так как вы можете загружать 4 байта данных одновременно, не имеет особого смысла, чтобы ваш адресный регистр указывал на один байт. Делая так, чтобы регистр вашего адреса указывал на каждые 4 байта, вы можете 4 раза манипулировать данными. Другими словами, ваш процессор может читать только данные, начиная с байтов 0, 4, 8, 12, 16 и т. Д.

Так вот в чем проблема. Если вы хотите, чтобы данные начинались с байта 2, а вы читаете 4 байта, то половина ваших данных будет в позиции адреса 0, а другая половина - в позиции 1.

Таким образом, в конечном итоге вы дважды попадете в память, чтобы прочитать свой 4-байтовый элемент данных. Некоторые процессоры не поддерживают такого рода операции (или заставляют загружать и объединять два результата вручную).

Более подробную информацию можно найти здесь: http://en.wikipedia.org/wiki/Data_structure_alignment

4 голосов
/ 11 июня 2010

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

2.) Какой язык, какая архитектура?Обратитесь к руководству по компилятору и / или к документации по архитектуре процессора.

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

2 голосов
/ 11 июня 2010

В общем, один из ответов на все три вопроса - «это зависит от вашей системы».Еще несколько подробностей:

  1. Возможно, ваша система памяти не адресуется по байту.Кроме того, вы можете понизить производительность, чтобы ваш процессор имел доступ к невыровненным данным.Некоторые процессоры (например, старые чипы ARM) просто не могут этого сделать.

  2. Прочтите руководство для вашего процессора и все спецификации ABI, для которых генерируется код,

  3. Обычно, когда люди ссылаются на данные, находящиеся в определенном выравнивании, это относится только к первому байту.Таким образом, если в спецификации ABI сказано, что «структура данных X должна быть выровнена на 4 байта», это означает, что X должен быть помещен в память по адресу, кратному 4..

    Что касается вашего конкретного примера, если данные выровнены по 4 байта, начиная с адреса 1004, следующий байт будет в 1005.

1 голос
/ 21 декабря 2013

Для архитектуры Intel, глава 4 ТИПЫ ДАННЫХ Руководство разработчика программного обеспечения для архитектуры Intel 64 и IA-32 отвечает на ваш вопрос 1.

1 голос
/ 18 августа 2013

ЦП требует выравнивания данных для повышения производительности.На веб-сайте Intel приведены подробные сведения о выравнивании данных в памяти

Выравнивание данных при переходе на 64-разрядную архитектуру Intel®

Одним из них является выравнивание элементов данных - их расположение в памяти по отношению к адресам, кратным четырем, восьми или 16 байтам.В 16-разрядной архитектуре Intel выравнивание данных мало влияло на производительность, и его использование было совершенно необязательным.В соответствии с IA-32 правильное выравнивание данных может быть важной оптимизацией, хотя его использование по-прежнему является необязательным, за очень немногими исключениями, где правильное выравнивание является обязательным.Однако 64-битная среда предъявляет более строгие требования к элементам данных.Выровненные объекты вызывают программные исключения.Чтобы элемент был правильно выровнен, он должен отвечать требованиям, предъявляемым 64-разрядной архитектурой Intel (обсуждается в ближайшее время), а также требованиям компоновщика, использованного для создания приложения.

Основное правило выравнивания данных заключается в том, чтосамый безопасный (и наиболее широко поддерживаемый) подход основан на том, что Intel называет «естественными границами».Это те, которые возникают, когда вы округляете размер элемента данных до следующего наибольшего размера в два, четыре, восемь или 16 байт.Например, 10-байтовое число с плавающей точкой должно быть выровнено по 16-байтовому адресу, тогда как 64-битные целые числа должны быть выровнены по восьмибайтовому адресу.Поскольку это 64-разрядная архитектура, размеры указателя имеют ширину восемь байтов, и поэтому они также должны выравниваться по восьмибайтовым границам.

Рекомендуется, чтобы все структуры размером более 16 байтов выравнивались по 16-байтовымграницы.В общем, для лучшей производительности выровняйте данные следующим образом:

  • Выровняйте 8-битные данные по любому адресу
  • Выровняйте 16-битные данные, которые должны содержаться в выровненном четырехбайтовомword
  • Выравнивание 32-битных данных так, чтобы его базовый адрес был кратным четырем
  • Выравнивание 64-битных данных так, чтобы его базовый адрес был кратным восьми
  • Align80-битные данные, так что его базовый адрес кратен шестнадцати
  • Выровнять 128-битные данные так, чтобы его базовый адрес был кратен шестнадцати

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

Правильное выравнивание данных в структурах может привести краздувание данных (из-за заполнения, необходимого для правильного размещения полей), поэтому, где это необходимо и возможно, полезно реорганизовать структуры так, чтобы поля, которые требуют наиболее широкого выравнивания, были первыми в структуре.Подробнее о решении этой проблемы читайте в статье «Подготовка кода для архитектуры IA-64 (Code Clean)».

1 голос
/ 11 октября 2010

Это полностью зависит от процессора, который вы используете!

Некоторые архитектуры работают только с 32 (или 36!) Битными словами, и вам нужны специальные инструкции для загрузки одиночных символов или случайных слов.

Некоторые процессоры (в частности, PowerPC и другие чипы IBM risc) не заботятся о выравнивании и загружают целые числа с нечетных адресов.

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

...