Почему на Ледовом озере MOVDIRx не похож на тремонт?У них уже есть лучшие? - PullRequest
0 голосов
/ 28 февраля 2019

Я заметил, что Intel Tremont имеет 64-байтовые инструкции хранения с MOVDIRI и MOVDIR64B.Это гарантирует атомарную запись в память, тогда как не гарантирует атомарность загрузки.Кроме того, запись слабо упорядочена, может потребоваться немедленное ограждение.Я не нахожу MOVDIRx в IceLake.Почему Ледяное озеро не нужны такие инструкции, как MOVDIRx?(Внизу страницы 15)Intel® ArchitectureInstruction Set Расширения и будущие функции Справочник по программированиюhttps://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf#page=15

1 Ответ

0 голосов
/ 28 февраля 2019

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 или чего-то еще.

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