Почему MASKMOVDQU не был расширен до 256-битных и 512-битных хранилищ? - PullRequest
0 голосов
/ 28 февраля 2019

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

Казалось бы, он работает с использованием тех же механизмов, что и хранилище NT: сдвиг строки кэша без предварительного выполнения RFO,В соответствии с руководством по разработке программного обеспечения Intel (выделено мной):

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

Однако, в отличие от других хранилищ NT, вы можетеиспользуйте маску, чтобы указать, какие байты действительно записываются.

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

В отличие от почти всех других полезных инструкций, Intel не расширила инструкции до 256 или 512 бит в AVX / AVX2 или AVX-512.Означает ли это, что использование этой инструкции больше не рекомендуется, возможно, не может быть эффективно реализовано на текущей или будущей архитектуре?


1 ... и ее 64-битном предшественникев MMX MASKMOVQ .

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Я подозреваю, что замаскированные хранилища векторов 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 с обратной записью в каждом сокете.

0 голосов
/ 02 марта 2019

Описание вводит в заблуждение.Невременный аспект MASKMOVQ заключается в том, что он не генерирует RFO, если вы напишите всю строку.Если вы используете маскированный аспект, вам все равно нужно RMW, в этом случае вы можете просто использовать регистр маски AVX-512.

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