x86 изобщо не е ориентирана към думи архитектура. Инструкциите са с променлива дължина без подравняване.
"Размер на думата" не е смислен термин на x86; някои хора може да го използват за позоваване на ширината на регистъра, но извличането/декодирането на инструкции няма нищо общо с целочислените регистри.
На практика при повечето модерни процесори x86 извличането на инструкции от L1 кеша за инструкции се извършва в подравнени 16-байтови или 32-байтови блокове за извличане. По-късните етапи на тръбопровода намират границите на инструкциите и декодират до 5 инструкции паралелно (напр. Skylake). Вижте описанието на David Kanter за 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