Адресация слов - Word addressing

В компьютерной архитектуре словесная адресация означает, что адреса памяти на компьютере однозначно идентифицируют слова памяти. Обычно он используется в отличие от байтовой адресации , когда адреса однозначно идентифицируют байты . Почти все современные компьютерные архитектуры используют байтовую адресацию, а словесная адресация представляет в основном только исторический интерес. Компьютер, использующий адресацию слов, иногда называют машиной слов .

Таблицы, показывающие те же данные, организованные по байтовой и словарной адресации

Основы

Рассмотрим компьютер с 524 288 (2 19 ) битами памяти. Если эта память расположена в байтовой адресацией плоские адресного пространства с использованием 8-битных байта, то есть 65,536 (2 16 ) действительные адреса, от 0 до 65535, каждый из которых обозначая независимые 8 бит памяти. Если вместо этого она устроена в текстовой адресации плоских адресного пространства с использованием 32-битовые слов, то есть 16,384 (2 14 ) действительные адреса, от 0 до 16,383, каждого из которых обозначая независимый 32 бит.

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

Преобразование адресов, выполняемое виртуальной памятью, часто влияет на структуру и ширину адресного пространства, но не меняет MAU.

Компромиссы различных минимально адресуемых единиц

Размер минимальной адресуемой единицы памяти может иметь сложные компромиссы. Использование большего MAU позволяет покрыть тот же объем памяти меньшим адресом, что может существенно снизить требования к памяти программы. Однако использование меньшего MAU упрощает эффективную работу с небольшими элементами данных.

Предположим, программа хочет сохранить один из 12 традиционных знаков западной астрологии . Одиночный знак может храниться в 4-х битах. Если знак хранится в собственном MAU, то 4 бита будут потрачены на байтовую адресацию (эффективность 50%), а 28 битов будут потрачены впустую при адресации 32-битного слова (эффективность 12,5%). Если знак «упакован» в MAU с другими данными, его чтение и запись может быть относительно дороже. Например, чтобы записать новый знак в MAU, в который были упакованы другие данные, компьютер должен прочитать текущее значение MAU, перезаписать только соответствующие биты, а затем сохранить новое значение обратно. Это будет особенно дорого, если программе необходимо разрешить другим потокам одновременно изменять другие данные в MAU.

Более распространенный пример - строка текста . Общие строковые форматы, такие как UTF-8 и ASCII, хранят строки как последовательность 8-битных кодовых точек. При побайтовой адресации каждая кодовая точка может быть помещена в свой собственный MAU с независимой адресацией без дополнительных затрат. При адресации 32-битного слова размещение каждой кодовой точки в отдельном MAU увеличит использование памяти на 300%, что неприемлемо для программ, работающих с большими объемами текста. Упаковка соседних кодовых точек в одно слово позволяет избежать этих затрат. Однако многие алгоритмы работы с текстом предпочитают иметь возможность самостоятельно обращаться к кодовым точкам; чтобы сделать это с упакованными кодовыми точками, алгоритм должен использовать «широкий» адрес, который также сохраняет смещение символа внутри слова. Если этот широкий адрес необходимо сохранить в другом месте в памяти программы, он может потребовать больше памяти, чем обычный адрес.

Чтобы оценить эти эффекты в полной программе, рассмотрим веб-браузер, отображающий большую и сложную страницу. Некоторая часть памяти браузера будет использоваться для хранения простых данных, таких как изображения и текст; браузер, скорее всего, предпочтет хранить эти данные максимально эффективно, и они будут занимать примерно такой же объем памяти независимо от размера MAU. Другая память будет представлять модель браузера различных объектов на странице, и эти объекты будут включать множество ссылок: друг на друга, на изображение и текстовые данные и так далее. Объем памяти, необходимый для хранения этих объектов, будет сильно зависеть от ширины адреса компьютера.

Предположим, что если бы все адреса в программе были 32-битными, эта веб-страница занимала бы около 10 гигабайт памяти.

  • Если веб-браузер работает на компьютере с 32-битными адресами и памятью с байтовой адресацией, адресное пространство будет охватывать 4 гигабайта памяти, чего недостаточно. Браузер либо не сможет отобразить эту страницу, либо ему потребуется возможность произвольно перемещать некоторые данные в более медленное хранилище, что существенно снизит его производительность.
  • Если веб-браузер работает на компьютере с 64-битными адресами и памятью с байтовой адресацией, ему потребуется значительно больше памяти для хранения больших адресов. Точные накладные расходы будут зависеть от того, какая часть из 10 гигабайт является простыми данными, а какая - объектной и плотной со ссылками, но цифра в 40% не является неправдоподобной, так как в общей сложности требуется 14 гигабайт. Это, конечно, вполне в пределах возможностей 64-битного адресного пространства. Однако браузер обычно демонстрирует худшую локальность и хуже использует кеш-память компьютера внутри компьютера, предполагая равные ресурсы с альтернативами.
  • Если веб-браузер работает на компьютере с 32-разрядными адресами и памятью с адресацией 32-разрядных слов, вероятно, потребуется дополнительная память из-за неоптимальной упаковки и необходимости в нескольких широких адресах. Это влияние, вероятно, будет относительно небольшим, так как браузер будет использовать упаковку и неширокие адреса для наиболее важных целей, а brwoser удобно поместится в максимальном адресуемом диапазоне 16 гигабайт. Однако могут возникнуть значительные накладные расходы времени выполнения из-за широкого использования упакованных данных для изображений и текста. Что еще более важно, 16 гигабайт - это относительно низкий предел, и если веб-страница значительно вырастет, этот компьютер исчерпает свое адресное пространство и начнет испытывать некоторые из тех же проблем, что и компьютер с байтовой адресацией.
  • Если веб-браузер работает на компьютере с 64-разрядными адресами и памятью с адресацией 32-разрядных слов, он будет страдать от обоих вышеупомянутых накладных расходов времени выполнения: ему потребуется значительно больше памяти для размещения более крупных 64-разрядных адресов, что повредит locality, а также требует дополнительных затрат времени выполнения, связанных с обширной упаковкой текстовых и графических данных. Словесная адресация означает, что программа теоретически может адресовать до 64 эксабайт памяти вместо только 16 эксабайт, но, поскольку программе и близко не требуется столько памяти (а на практике ни один настоящий компьютер не может ее предоставить), это не дает никаких преимуществ. .

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

Доступ к вложенным словам и широкие адреса

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

Предположим, что четыре последовательных кодовых точки из строки UTF-8 необходимо упаковать в 32-битное слово. Первая кодовая точка может занимать биты 0–7, вторая 8–15, третья 16–23 и четвертая 24–31. (Если бы память была байтовой, это был бы порядок байтов с прямым порядком байтов.)

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

Предположим, что программа хочет прочитать третью кодовую точку в регистр r1из слова по адресу в регистре r2. При отсутствии какой-либо другой поддержки из набора команд программа должна загрузить полное слово, сдвинуть вправо на 16, чтобы отбросить первые две кодовые точки, а затем замаскировать четвертую кодовую точку:

  ldw  $r1, 0($r2)        # Load the full word
  srl  $r1, $r1, 16       # Shift right by 16
  andi $r1, $r1, 0xFF     # Mask off other code points

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

  ldw  $r1, 0($r2)        # Load the full word
  srlv $r1, $r1, $r3      # Shift right by the bit offset
  andi $r1, $r1, 0xFF     # Mask off other code points

Предположим вместо этого, что программа желает присвоить кодовую точку в регистре r1третьей кодовой точке в слове по адресу in r2. В отсутствие какой-либо другой поддержки из набора команд программа должна загрузить полное слово, замаскировать старое значение этой кодовой точки, сдвинуть новое значение на место, объединить значения и сохранить полное слово обратно:

  sll  $r1, $r1, 16       # Shift the new value left by 16
  lhi  $r5, 0x00FF        # Construct a constant mask to select the third byte
  nor  $r5, $r5, $zero    # Flip the mask so that it clears the third byte
  ldw  $r4, 0($r2)        # Load the full word
  and  $r4, $r5, $r4      # Clear the third byte from the word
  or   $r4, $r4, $r1      # Merge the new value into the word
  stw  $r4, 0($r2)        # Store the result as the full word

Опять же, если вместо этого смещение сохраняется r3, требуется более сложный подход:

  sllv $r1, $r1, $r3      # Shift the new value left by the bit offset
  llo  $r5, 0x00FF        # Construct a constant mask to select a byte
  sllv $r5, $r5, $r3      # Shift the mask left by the bit offset
  nor  $r5, $r5, $zero    # Flip the mask so that it clears the selected byte
  ldw  $r4, 0($r2)        # Load the full word
  and  $r4, $r5, $r4      # Clear the selected byte from the word
  or   $r4, $r4, $r1      # Merge the new value into the word
  stw  $r4, 0($r2)        # Store the result as the full word

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

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

В этих кодовых последовательностях дополнительное смещение должно быть сохранено вместе с базовым адресом, что фактически удваивает общие требования к хранению адреса. Это не всегда верно для машин слов, в первую очередь потому, что сами адреса часто не упакованы другими данными, чтобы сделать доступ более эффективным. Например, Cray X1 использует 64-битные слова, но адреса только 32-битные; когда адрес хранится в памяти, он сохраняется в собственном слове, и поэтому байтовое смещение может быть помещено в старшие 32 бита слова. Неэффективность использования широких адресов в этой системе - это всего лишь дополнительная логика для управления этим смещением и извлечения и вставки байтов в слова; он не влияет на использование памяти.

Связанные понятия

Минимальная адресуемая единица компьютера не обязательно совпадает с минимальным размером доступа к памяти набора команд компьютера. Например, компьютер может использовать байтовую адресацию без предоставления каких-либо инструкций для прямого чтения или записи одного байта. Ожидается, что программы будут эмулировать эти операции в программном обеспечении с помощью битовых манипуляций, как это делают приведенные выше примеры кодовых последовательностей. Это относительно часто встречается в 64-битных компьютерных архитектурах, разработанных как преемники 32-битных суперкомпьютеров или миникомпьютеров, таких как DEC Alpha и Cray X1 .

Стандарт C утверждает, что указатель должен иметь обычное представление адреса. C также позволяет формировать указатель на любой объект, кроме битового поля; это включает каждый отдельный элемент массива байтов. Компиляторы C для компьютеров, которые используют адресацию слов, часто используют разные представления для указателей на разные типы в зависимости от их размера. Указатель на тип, достаточно большой, чтобы заполнить слово, будет простым адресом, тогда как указатель, такой как char*или void*будет широким указателем: парой адреса слова и смещения байта в этом слове. Следовательно, преобразование между типами указателей не обязательно является тривиальной операцией и может привести к потере информации при неправильном выполнении.

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

Примеры

  • ERA 1103 использует слово адресации с 36-битными словами. Только адреса 0-1023 относятся к оперативной памяти; другие либо не отображены, либо относятся к памяти барабана.
  • PDP-10 использует слово адресации с 36-битовых слов и 18-битовых адресов.
  • Большинство суперкомпьютеров Cray 80-х и 90-х годов использовали 64-битную адресацию слов. Cray-1 и Cray X-MP использовать 24-разрядные адреса, в то время как большинство других используют 32-битные адреса.
  • В X1 Cray использует байты адресации с 64-битовыми адресами. Он не поддерживает напрямую доступ к памяти размером менее 64 бит, и такой доступ должен эмулироваться в программном обеспечении. Компилятор C для X1 был первым компилятором Cray, который поддерживал эмуляцию 16-битного доступа.
  • DEC Alpha использует байты адресации с 64-битовыми адресами. Ранние процессоры Alpha не обеспечивают прямой поддержки 8-битного и 16-битного доступа к памяти, и программы должны, например, загружать байт, загружая содержащееся 64-битное слово и затем отдельно извлекая байт. Поскольку Alpha использует байтовую адресацию, это смещение по-прежнему представлено в наименее значимых битах адреса (а не отдельно как широкий адрес), и Alpha удобно обеспечивает загрузку и сохранение невыровненных инструкций ( ldq_uи stq_u), которые игнорируют эти биты и просто загружают и сохраните содержащее выровненное слово. Более поздние расширения байтовых слов к архитектуре (BWX) добавили 8-битные и 16-битные загрузки и запоминания, начиная с Alpha 21164a. Опять же, это расширение было возможно без серьезных программных несовместимостей, потому что Alpha всегда использовала байтовую адресацию.

Смотрите также

использованная литература