2010-12-02 1 views
6

Я знаю, что некоторые процессоры терпят неудачу с несогласованными данными, а другие, такие как oh-so-common x86, будут только медленнее с этим.Почему выравнивание важно?

Мой вопрос: почему? Почему процессору x86 сложнее получить данные от указателя 0x12345679, чем от указателя 0x12345678? Чтобы быть ясным, я знаю, что ошибки страницы могут произойти, если данные находятся на нескольких страницах, и я понимаю, что больше данных может потребоваться извлечь из памяти (одна часть для начала значения и одна для конца) , но это не всегда верно, и это не то, о чем мой вопрос. Я спрашиваю, почему это всегда медленнее?

Предположим, что память начинается с 0x10000000. Почему процессору сложнее получить 2-байтовый short от 0x10000001, чем от 0x10000002? Почему сложнее получить 4-байтовый int от 0x10000001, чем от 0x10000000? И так далее.

+1

Знаете ли вы о линиях кеша и о предварительном изъятии? – Oded 2010-12-02 20:14:00

+0

Возможно, потому, что доступ к памяти одного размера не может перекрываться. Но, с другой стороны, доступ к памяти разных размеров по-прежнему может перекрываться, поэтому я не знаю, почему это так много. – CodesInChaos 2010-12-02 20:15:41

+0

И это не только ошибки страниц, но и ошибки кэша, а строки кэша обычно намного меньше (AFAIK 64 байта типичны), чем страницы. Но это все еще не объясняет поведение в кеш-линии. – CodesInChaos 2010-12-02 20:16:46

ответ

3

Процессор может получать доступ только к памяти по согласованному принципу. Это является следствием того, как взаимосвязь между процессором и памятью функционирует.

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

1

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

4

Поскольку шина данных шире, чем восемь бит.

Предположим, что шина данных составляет 32 бита. Чтобы получить 16 бит от адреса 0x10000001, он должен получить четыре байта, который начинается с 0x10000000, и сдвинуть значение, чтобы получить два байта в середине.

Чтобы получить 16 бит с адреса 0x10000003, он должен получить слова, начинающиеся с 0x10000000 и 0x10000004, и использовать один байт из каждого значения.

 Смежные вопросы

  • Нет связанных вопросов^_^