ЦП и выравнивание Данных

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

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

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

  3. Если для, например, выравнивание данных 4-байтовая граница, которая означает, что каждый последовательный байт расположен при 4 смещениях по модулю? Мое сомнение состоит в том, если данные - 4 байта, выровненные, который означает, что, если байт в 1 004 затем, следующий байт в 1 008 (или в 1 005)?

14
задан David Kay 23 July 2019 в 00:01
поделиться

4 ответа

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

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

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

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

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

14
ответ дан 1 December 2019 в 09:00
поделиться

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

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

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

4
ответ дан 1 December 2019 в 09:00
поделиться

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

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

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

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

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

Для получения дополнительных сведений перейдите сюда: http://en.wikipedia.org/wiki/Data_structure_alignment

6
ответ дан 1 December 2019 в 09:00
поделиться

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

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

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

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

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

2
ответ дан 1 December 2019 в 09:00
поделиться
Другие вопросы по тегам:

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