Я подозреваю, что замаскированные хранилища векторов NT больше не работают хорошо для многоядерных процессоров, поэтому, вероятно, даже 128-битная версия просто отстой на современном x86 для маскированных записей, если в полной 64-байтовой строке есть какие-либо неизмененные байты.
(Регулярные маскированные векторные хранилища возвращаются с удвоенной силой в векторах байтовой маски AVX512BW; маскированная фиксация в кэш-память L1d, по-видимому, эффективно поддерживается для этого, и маскирование dword / qword с помощью AVX1 vmaskmovps/pd
и целочисленного эквивалентаи AVX512F)
Протокол шины SDRAM (включая DDR4) поддерживает запись с байтовой маской (с 1 строкой маски на байт как часть передачи пакета строки кэша). Этот документ Intel (о FPGA или чем-то еще) включает в себя обсуждение сигналов DM
(маска данных), подтверждающих, что DDR4 все еще имеет их, с той же функцией, что и линии DQM, описанные в Википедии для SDRAM https://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory#SDR_SDRAM. (DDR1 изменил его только на маску записи, а не маску чтения.)
Итак, аппаратная функциональность есть, и, вероятно, современные процессоры x86 используют ее для однобайтовых операций записи в не кэшируемую память, дляпример.
Хранилища без RFO хороши, если мы пишем полную строку: мы просто аннулируем другие копии строки и сохраняем в памяти.
John "Dr.Пропускная способность "МакКалпин говорит , что обычные хранилища NT, которые сбрасываются после заполнения полной 64-байтовой строки , делают недействительными даже грязные строки, не вызывая обратную запись грязных данных.
Таким образом, в маске В хранилищах NT необходимо использовать другой механизм, потому что любые маскированные байты должны получать свое значение из грязной строки в другом ядре, не избелыйatever был в DRAM.
Если механизм для частичных хранилищ NT не эффективен , добавлять новые инструкции, которые его создают, неразумно.Я не знаю, является ли это более или менее эффективным, чем создание обычных хранилищ для части строки, или это зависит от ситуации и uarch.
Это не обязательно должен быть RFO, но это будет означать, что когда такое хранилище достигает контроллера памяти, ему нужно будет получить фильтр snoop, чтобы убедиться, что строка синхронизирована, или, возможно, объединить старое содержимое из кэша перед сбросом в DRAM.
Или ядро ЦП может выполнить RFO и выполнить слияние перед отправкой полной строки для записи иерархии памяти.
ЦП уже нужен какой-то механизм для очистки частичных хранилищ NT при возврате LFBна нем еще не записаны все 64 байта, и мы знаем, что это не так эффективно.(Но я забыл детали.) Но, возможно, именно так maskmovdqu
выполняется на современных процессорах, либо всегда, либо если вы оставляете какие-либо байты без изменений.
Эксперимент, вероятно, может выяснить.
Таким образом, TL: DR maskmovqdu
может быть эффективно реализован только в одноядерных процессорах.Он возник в Katmai Pentium III с MMX maskmovq mm0, mm1
;Системы SMP существовали, но, возможно, это не было основным соображением для этой инструкции при ее разработке.Системы SMP не имели общего кэша последнего уровня, но у них все еще был частный кэш L1d с обратной записью в каждом сокете.