Я только что прочитал AVX (Википедия), и у меня возник этот вопрос.
Каков наибольший объем данных, которые одна инструкция x86 будет считывать или записывать в кэш L1?
Ответы (2)
Я не уверен, что ваш вопрос полностью ясен, но я думаю, вы спрашиваете, сколько данных может быть передано в кэш L1 или из него при выполнении одной инструкции x86?
Если да, то это какой-то некорректный вопрос. Структура кэша и даже кэширование как концепция не являются частью спецификации x86. Это означает, что ответ полностью зависит от базового оборудования. Если вы имеете в виду конкретный процессор, вы, вероятно, сможете найти ответ в техническом описании. Что вам нужно знать, так это размер блока кеша, поскольку менеджеры кеша любят записывать и читать целые блоки за раз. Однако в расширениях x86 (таких как AVX и SSE) есть инструкции, специально предназначенные для больших транзакций памяти, и они могут записывать или читать кэш столько, сколько требуется/удобно.
wbinvd
сделает недействительной всю иерархию кеша, что приведет к многократной записи измененных строк, хранящихся там, поэтому, вероятно, будет записано наибольшее количество данных. Однако кажется, что вам нужен максимально возможный фрагмент, который может передаваться между кешем и исполнительными модулями, который в Haswell должен составлять 256 байт, а будущие процессоры могут увеличиться до 512 (см. software.intel.com/en-us/blogs/2013/avx-512-instructions)
- person Leeor; 06.03.2014
Вы никогда не читаете и не записываете в какой-либо уровень кэша явно, но при любой разумной интерпретации того, что вы имеете в виду, мне кажется, что если вы читаете из L1$, значение считывается в регистр, и если вы при записи в L1$ значение записывается из регистра, поэтому для всех практических целей основным ответом всегда будет «размер регистра, который вы используете» в качестве источника/назначения для рассматриваемой архитектурной инструкции.
На самом деле все немного сложнее, потому что зависит от ширины пути между MOB (буфер порядка памяти) и L1$, что является особенностью конкретной микроархитектуры. Недавно процессоры Intel (например, Core, Nehalem) имели 128-битные пути от MOB к L1$, но я не знаю, увеличили ли самые последние (например, Haswell) это до 256-бит, чтобы соответствовать размеру регистра AVX. Это одна из возможностей. Во-вторых, одно архитектурное хранилище 256-битного регистра AVX может декодироваться в две 128-битные µops (микрооперации) на бэкенде. Последнее кажется более вероятным для Sandy и Ivy Bridge из-за «двойного» использования двух 128-битных исполнительных блоков для выполнения 256-битных операций AVX. Я недостаточно знаю микроархитектуру Haswell, чтобы размышлять о том, что она может делать.
st
ring с префиксомREP
могут передавать произвольно большие объемы данных. Отбросив это в сторону, 64-разрядные процессоры без AVX имеютCMPXCHG16B
, что может вызвать в общей сложности 32 байта трафика (16 байтов чтения, 16 байтов записи). В AVX смещенное 32-байтовое хранилище может привести к чтению и записи двух строк кэша (CL). При сборе AVX2 можно было прочитать до 8 CL. Основные ЦП и более поздние версии имеютXSAVE
, что может сохранять более 512 байтов состояния ЦП. Но окончательным победителем для меня являетсяXEND
от TSX, который в принципе может фиксировать или откатывать КБ данных без ощущения обмана строковых операций. - person Iwillnotexist Idonotexist   schedule 06.03.2014