Почему процессор обращается к памяти на границе слова? - PullRequest
17 голосов
/ 07 сентября 2010

Я много слышал, что данные должны быть правильно выровнены в памяти для лучшей эффективности доступа.Память доступа к процессору на границе слова.

Таким образом, в следующем сценарии ЦП должен сделать 2 обращения к памяти, чтобы получить одно слово.

Supposing: 1 word = 4 bytes

("|" stands for word boundary. "o" stands for byte boundary)


|----o----o----o----|----o----o----o----|   (The word boundary in CPU's eye)
           ----o----o----o----              (What I want to read from memory)

Почему это должно произойти? Какова основная причина того, что ЦП может читать только на границе слова?

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

ADD 1

И даже больше, если мы признаем, что CPU должен читать на границе слова, почему the Граница начинается там, где я хочу читать?Кажется, что граница фиксирована в глазу процессора.

ADD 2

Согласно AndreyT , кажется, что настройка границы является аппаратной ион зашит аппаратным обеспечением доступа к памяти.Процессор невиновен в этом.

Большое спасибо ...

Ответы [ 4 ]

24 голосов
/ 07 сентября 2010

Значение «can» (в «... CPU может получить доступ ...») в этом случае зависит от аппаратной платформы.

Для инструкций CPU платформы x86 can получить доступ к данным, выровненным по абсолютно любой границе, а не только по "границе слова".Несовмещенный доступ может быть менее эффективным, чем согласованный доступ, но причины этого не имеют абсолютно никакого отношения к ЦП.Это связано с тем, как работает базовое низкоуровневое оборудование для доступа к памяти.Вполне возможно, что в этом случае аппаратное обеспечение, связанное с памятью, должно будет сделать два доступа к реальной памяти, но об этом инструкции CPU не знают и не должны знать.Что касается процессора, он может получить доступ к любым данным на любой границе.Все остальное реализовано прозрачно для инструкций процессора.

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

Что касается того, почему это так ... ну, именно так работает современное аппаратное обеспечение компьютерной памяти.Данные должны быть выровнены.Если он не выровнен, доступ либо менее эффективен, либо не работает вообще.

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

4 голосов
/ 07 сентября 2010

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

Все аргументы, которые выуслышать о «эффективности» - это глупости или, если быть более точным, вопрос напрашивается. Реальная причина заключается в том, что он просто экономит кремний в ядре процессора, если количество битов адреса можно уменьшить для операций. Любая неэффективность, возникающая из-за неправильного доступа(как и в мире x86) являются результатом решений по проектированию аппаратного обеспечения, а не присуще решению в целом.

Теперь, как говорится, для большинства случаев использования решение по проектированию аппаратного обеспечения имеет смысл.данные в двухбайтовых словах, большинствов общих случаях использования у вас есть доступ к offset, затем offset+2, затем offset+4 и так далее.Способность увеличивать адрес побайтно при доступе к двухбайтовым словам, как правило (как, конечно, в 99,44%), не то, что вы хотите делать.Таким образом, не мешает требовать, чтобы смещения адресов выравнивались по границам слов (это легкое, одноразовое неудобство при проектировании структур данных), но это действительно экономит ваш кремний.

Как историческийКроме того, я однажды работал над Interdata Model 70 - 16-разрядным мини-компьютером.Требуется, чтобы весь доступ к памяти был выровнен по 16 битам.К тому времени у меня было очень мало памяти, когда я работал над ней по меркам того времени.(Это было пережитком даже тогда.) Выравнивание слов использовалось, чтобы удвоить объем памяти, так как подключенный ЦП можно было легко взломать.Была добавлена ​​новая логика декодирования адреса, которая заняла 1 в младшем бите адреса (ранее была ошибка выравнивания при создании) и использовала его для переключения на второй банк памяти.Попробуйте это без логики выравнивания!:)

3 голосов
/ 07 сентября 2010

Потому что это более эффективно.

В вашем примере процессор должен выполнить две операции чтения: он должен прочитать в первой половине, затем прочитать во второй половине отдельно, а затем собрать их вместе для выполнения вычислений. Это намного сложнее и медленнее, чем чтение за один раз, если данные были правильно выровнены.

Некоторые процессоры, такие как x86, могут допускать неверно выровненный доступ к данным (поэтому вам все равно понадобятся все 32 бита) - другие, такие как Itanium, абсолютно не могут обрабатывать неправильно выровненные обращения к данным и будут жаловаться весьма эффектно.

2 голосов
/ 07 сентября 2010

Выравнивание слов поддерживается не только процессорами

На аппаратном уровне большинство модулей RAM имеют заданный размер Word относительно количества битов, к которым можно получить доступ за цикл чтения / записи.

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

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

Контроллер памяти, подключенный к этому чипу ОЗУ, может быть удален двумя способами: либо разрешить неограниченный доступ к чипу памяти, используя несколько циклов для разделения / объединения невыровненных данных в / из нескольких ячеек (с дополнительной логикой), либо наложить некоторые ограничения на доступ к памяти с уменьшенной сложностью.

Поскольку сложность может мешать ремонтопригодности и производительности, большинство дизайнеров выбрали последний [ необходимая ссылка ]

...