Как процессор выполняет операцию, которая манипулирует данными, размер которых меньше размера слова - PullRequest
0 голосов
/ 04 июня 2019

Я читал, что когда процессор читает из памяти, он будет считывать размер слова памяти сразу (например, 4 байта или 8 байтов). Как процессор может достичь чего-то вроде:

 mov     BYTE PTR [rbp-20], al

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

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

0:  b8 00 00 00 00          mov    eax,0x0

имеет длину 5 байт (на x84) и

0:  31 c0                   xor    eax,eax

имеет длину 2 байта, они имеют различную длину.

если блок управления хочет получить эти инструкции, он делает это:

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

как насчет инструкций вроде:

0:  48 b8 5c 8f c2 f5 28    movabs rax,0x28f5c28f5c28f5c
7:  5c 8f 02

что превышает размер слова, как они обрабатываются процессором?

Ответы [ 4 ]

3 голосов
/ 04 июня 2019

x86 - это , а не словесно-ориентированная архитектура.Инструкции переменной длины без выравнивания.

«Размер слова» не является значимым термином в x86 ;некоторые люди могут использовать его для ссылки на ширину регистра, но выборка / декодирование инструкций не имеет ничего общего с целочисленными регистрами.

На практике на большинстве современных процессоров x86 выборка инструкций из кэша инструкций L1 происходит в выровненном16-байтовые или 32-байтовые блоки выборки.Более поздние этапы конвейера находят границы команд и декодируют до 5 команд параллельно (например, Skylake).См. запись Дэвида Кантера о Haswell для блок-схемы внешнего интерфейса, показывающей 16-байтовую выборку команд из кэша L1i.

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


См. Может ли современное оборудование x86 не хранить один байт в памяти? для получения дополнительной информации о том, как кэш поглощаетсохраняет в обычные области памяти (MTRR и / или PAT установлены на WB = тип памяти с обратной записью).

Логика, которая фиксирует хранилища из буфера хранилища в кэш данных L1 на современных процессорах Intel, обрабатывает любое хранилище любогоwidth до тех пор, пока он полностью содержится в одной 64-байтовой строке кэша.

Процессоры, отличные от x86, более ориентированные на слова (например, ARM), обычно используют чтение-изменение-запись кеша слова (4 или 8 байт) для обработки узких хранилищ.См. Существуют ли какие-либо современные процессоры, в которых хранилище кэшированных байтов на самом деле медленнее, чем хранилище слов? Но современные процессоры x86 расходуют транзисторы на то, чтобы сделать кэшированные хранилища байтов или невыровненные более широкие хранилища такими же эффективными, как и выровненные 8-байтовые.сохраняет в кеш.


с учетом ширины шины данных, равной ширине 64 бита

В современном x86 встроены контроллеры памяти, встроенные в ЦП.Эта шина DDR [1234] SDRAM имеет 64 строки данных, но одна команда чтения или записи инициирует пакет из 8 передач, передавая 64 байтов данных.(Не случайно 64 байта - это размер строки кэша для всех существующих процессоров x86.)

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

(или, если это не поддерживается (что может иметь место) , контроллеру памяти, возможно, придется прочитать старое содержимое и объединить, а затем сохранить всю строку. В любом случае, 4-байтовый или 8-байтные куски не значимая единица здесь. Передача пакета DDR может быть сокращена, но только до 32 байтов по сравнению с 64. Я не думаю, что 8-байтовая выровненная запись на самом деле очень особенная для DRAMуровень гарантированно будет «атомарным» в ISA x86, хотя даже в не кэшируемых регионах MMIO.)

Сохранение в не кэшируемый регион MMIO приведет к PCIeтранзакция соответствующего размера, до 64 байт.


Внутри ядра ЦП шина между кешем данных и исполнительными блоками может иметь ширину 32 или 64 байта.(Или 16 байтов на текущем AMD).Передача строк кеша между L1d и L2 кешем также осуществляется по шине шириной 64 байта в Haswell и более поздних версиях.

0 голосов
/ 06 июня 2019

Кеши обсуждаются в большинстве книг по компьютерной архитектуре.На уровне задаваемого вопроса «Цифровой дизайн и компьютерная архитектура» Harris & Harris или на этом уровне может быть достаточно.

Вы, вероятно, ищете блок-схему, подобную той, которую я прилагаю ниже, чтобыбыстро понять трубопровод и двигаться дальше.Я не знаю ни одной книги, которая бы сделала это.Я потратил <30 минут, чтобы нарисовать это (и строго для удовольствия) - возьмите это за то, что оно стоит.Но если вы обнаружите ошибки или внесете другие исправления, опубликуйте их здесь для будущих посетителей этой страницы. </p>

Where is the cache!

0 голосов
/ 04 июня 2019

Шина на краю процессора в наши дни, вероятно, 64 бит. но в любом случае 16, 32, 64 и т. д. Кроме того, проекты могут / действительно различаться, но вопрос, о котором вы спрашиваете, заключается в том, что процессор для чтения будет выдавать чтение размером с шину, поэтому для адреса 0x1001 произойдет чтение 0x1000 в некоторой форме (иногда контроллер памяти или кэш-контроллер или что-то еще на другой стороне этой шины будет тем, кто удалит младшие биты из адреса). Следующим слоем для чтения в идеале будет чтение слова или шины. Вы можете иметь или не иметь кеш здесь, не имеет значения в отношении этого вопроса, если так, то если попадание, то эта ширина будет считана и отправлена ​​обратно в ЦП, при пропущенном некотором количестве единиц, как правило, во много раз превышающем ширину шины. будет читаться как строка кэша, слово / или любой другой элемент будет отправлен обратно в процессор. при чтении процессор обычно изолирует число байтов суб-шины от этого чтения и потребляет их, игнорируя остальные. обратите внимание, что это не расточительно, а наоборот.

Пишет, где проблема с производительностью. Если вы записываете невыровненную или, конечно, меньшую ширину шины, вам нужно указать контроллеру памяти действительный из недопустимых битов или байтовых дорожек, как правило, байтовых дорожек в некоторой форме. Один из способов заключается в том, чтобы иметь байтовую маску, чтобы для 32-битной шины у вас было 4 байтовой маски, по одной, чтобы представить каждый из 8-битных байтов, проходящих по этой шине сразу. Затем контроллеру памяти или контроллеру кэша потребуется выполнить чтение-модификацию-запись (есть исключения, но в этом случае просто используйте их). Таким образом, запись одного байта в 0x1001 оставит процессор на этой внутренней / закрытой шине с этим адресом или 0x1000 в качестве адреса, байтовую маску 0b0010 и значение данных в виде 32-битного числа, из которых только второй байт У дорожки есть допустимые биты, остальные могут быть мусором, нулями или чем угодно. Для систем такого типа подобные вопросы / вопросы задаются о том, что к этим широким блокам обращаются к внешним слоям памяти, возможны байтовые разрешения, но предполагается, что они не используются. Сам кеш, скорее всего, состоит из широких кадров, 32-битный в этом случае был бы нормальным, поэтому для записи однобайтового местоположения в кэше кэша требуется чтение этих 32 битов, модификация 8 битов, которые меняются, а затем напишите местоположение срам. это не имеет абсолютно никакого отношения к сквозной записи в кэш или обратной записи или к чему-либо совершенно не относящемуся к делу. это внутренняя работа срам, похороненная глубоко в тайнике. это тратит впустую фишку на чипы для создания кеша из 8-битной памяти, а также умножает количество сигналов, в результате чего часть этого потраченного пространства направляет их, плюс логика для управления ими, все впустую. Так что более широкая память будет использоваться для несколько нормального дизайна. Возможно, например, шириной 39 или 40 бит, чтобы получить ecc на этих шрамах.

похоже, если не то же самое, если у вас нет кеша или кеш не включен. Вы можете скачать документацию Axi с ​​рук, вы можете посмотреть другие известные автобусы. внутренняя работа x86, хотя там, где эта активность была бы видимой, на самом деле не имела бы смысла документироваться за пределами intel или amd.

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

0 голосов
/ 04 июня 2019

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

mov     BYTE PTR [rbp-20], al

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...