Подтвердить что ты не робот

Почему память доступа к процессору на границе слова?

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

Итак, в следующем сценарии CPU должен сделать 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 eye)
           ----o----o----o----              (What I want to read from memory)

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

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

ADD 1

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

ADD 2

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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

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