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