Как ЦП выполняет операцию по манипулированию данными, размер которых меньше одного слова

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

 mov     BYTE PTR [rbp-20], al

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

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

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

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


person Sayakura    schedule 04.06.2019    source источник
comment
Возможный дубликат Может ли современное оборудование x86 не сохранять в памяти ни одного байта?.   -  person Peter Cordes    schedule 04.06.2019


Ответы (4)


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

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

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

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


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

Логика, которая фиксирует сохранение из буфера хранилища в кэш данных L1 на современных процессорах Intel, обрабатывает любое хранилище любой ширины, если оно полностью содержится в одной 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. Это гарантировано быть "атомарным" в x86 ISA, хотя даже в некэшируемых регионах MMIO.)

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


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

person Peter Cordes    schedule 04.06.2019
comment
Согласно некоторые микросхемы DDR4 могут не поддерживать маски записи. В этом случае целевой 8-байтовый фрагмент считывается и объединяется с записываемыми данными. - person Hadi Brais; 04.06.2019

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

mov     BYTE PTR [rbp-20], al

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

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

person Chris Dodd    schedule 04.06.2019
comment
когда вы упомянули кеш, все это начало обретать смысл, однако, из-за отсутствия понимания кеша, я не могу четко визуализировать процесс who. Есть ли у вас какие-либо рекомендации / дополнительные материалы для чтения по кеш-памяти? Из источников, которые я читал, они кратко описывают его как быстрый банк памяти, но никогда не затрагивают связь между другими компонентами и кешем. - person Sayakura; 04.06.2019

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

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

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

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

person old_timer    schedule 04.06.2019

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

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

Где кеш!

person ShankarSwamy    schedule 06.06.2019