Ice Lake имеет AVX512, который дает нам 64-байтовые загрузки + хранилища, но не гарантирует атомарность 64-байтовых хранилищ.
Мы получаем 64-байтовые хранилища NT с movntps [mem], zmm
/ movntdq [mem], zmm
.Интересно, что магазины NT не поддерживают маскирование слиянием, чтобы оставить некоторые байты неписанными.Это, по сути, нанесло бы ущерб целям хранилищ NT, создав частичные записи, хотя.
Вероятно, в процессорах Ice Lake Pentium / Celeron все еще не будет AVX1 / 2, не говоря уже о AVX512 (возможно, поэтому они могут продавать чипыс дефектами в верхних 128 битах модулей FMA и / или файла регистра по крайней мере на одном ядре), поэтому только rep movsb
сможет внутренне использовать 64-байтовые загрузки / хранилища на этих процессорах.(IceLake будет иметь функцию «быстрого короткого повторения», которая может быть полезна даже для небольших 64-байтовых копий, полезна в коде ядра, который не может использовать векторные регистры.)
Возможно Intel не может (или не хочет) предоставить гарантию атомарности для своих основных процессоров, только для микросхем с низким энергопотреблением, которые не поддерживают несколько сокетов, но я не слышал никаких сообщений о разрывесуществующие в строке кэша на процессорах Intel.На практике я думаю, что кэшированные загрузки / хранилища, которые не пересекают границу строки кэша на текущих процессорах Intel, всегда атомарны.
(В отличие от AMD K10, где HyperTransport создавал разрывы на8B границы между сокетами, в то время как разрывы между ядрами в одном сокете не видны. Инструкции SSE: какие процессоры могут выполнять атомные операции с памятью 16B? )
В любом случае, нет никакого способаобнаружить это с помощью CPUID, и это не задокументировано, поэтому в принципе невозможно безопасно воспользоваться.Было бы неплохо, если бы существовал лист CPUID, который сообщал бы вам ширину атомности для системы и для одного сокета, поэтому реализации, которые разделяют 512-битные операции AVX512 на 256-битные половины, все равно будут разрешены ...
В любом случае, вместо того, чтобы вводить специальную инструкцию с гарантированной атомарностью хранилища, я думаю, что поставщики ЦП с большей вероятностью начнут документировать и обеспечить обнаружение CPUID более широкой атомарности хранилища для всех хранилищ степени 2,или только для хранилищ NT, или чего-то подобного.
Если для некоторой части AVX512 требуется атомарность 64 байта, то AMD будет намного труднее поддерживать, если они будут следовать своей текущей стратегии реализации вектора половинной ширины.(Zen2 будет иметь 256-битные векторные ALU, что делает инструкции AVX1 / AVX2 в основном однопользовательскими, но, как сообщается, у него не будет поддержки AVX512, к сожалению. AVX512 - очень хороший ISA, даже если вы используете его только на 256-битной ширине,заполнение большего количества пробелов в том, что можно сделать удобно / эффективно, например, unsigned int <-> FP и [u] int64 <-> double.)
Так что IDK, если возможно Intel согласился несделайте это или решили не делать этого по своим причинам.
Вариант использования для атомарности записи 64B:
Я подозреваю, что основной сценарий использования надежно создает 64-байтТранзакции PCIe , на самом деле не "атомарность" как таковая и не для наблюдения другим ядром.
Если вы заботитесь о чтении с других ядер, обычно вы хотите, чтобы кэш L3 поддерживал данные,не обойти это на DRAM.Seqlock - это, вероятно, более быстрый способ эмулировать 64-байтовую атомарность между ядрами процессора, даже если доступно movdir64B
.
Skylake уже имеет 12 буферов объединения записи (по сравнению с 10 в Haswell), так что это (может быть?) Не слишком сложно использовать обычные хранилища NT для создания полноразмерной транзакции PCIe, избегая ранних сбросов.Но, возможно, у процессоров с низким энергопотреблением меньше буферов, и, возможно, сложно надежно создать 64-битные транзакции для буфера NIC или чего-то еще.