Дают ли 128-битные кроссовые операции в AVX512 лучшую производительность?
При разработке перспективных алгоритмов для AVX256, AVX512 и однодневного AVX1024, а также при рассмотрении потенциальной сложности / стоимости реализации полностью универсальных перестановок для большой ширины SIMD я подумал, что лучше вообще придерживаться изолированных 128-битных операций даже в AVX512?
Особенно учитывая, что AVX имел 128-битные модули для выполнения 256-битных операций.
С этой целью я хотел знать, была ли разница в производительности между операциями перестановочного типа AVX512 по всем 512-битным векторам, в отличие от операций перестановочного типа внутри каждого 4x128-битного субвектора 512-битного вектора?
1 ответ
Как правило, да, на SKX задержка на линии все еще ниже (1 цикл против 3), но обычно не стоит тратить дополнительные инструкции, чтобы использовать их вместо мощных тасов, пересекающих полосы. Тем не мение, vpermt2w
и паре других тасов требуется несколько мопов с портами тасования, поэтому они стоят столько же, сколько и несколько более простых тасов.
Пропускная способность в случайном порядке очень легко становится узким местом, если вы не будете осторожны с последними процессорами Intel (только один исполнительный блок в случайном порядке на порту 5). Иногда даже стоит использовать две перекрывающиеся нагрузки вместо однократной загрузки и перестановки, то есть использовать невыровненную нагрузку в качестве перемешивания, поскольку кэш L1D работает быстро, как и обработка порта загрузки для невыровненных нагрузок. (Однако с AVX512 это не так, особенно потому, что каждая невыровненная загрузка 512b автоматически разделяется на строки кэша, поскольку векторы и строки кэша имеют размер 64 байта.)
Есть также команды поворота (новые в AVX512) и инструкции по сдвигу (не новые). 64-битные версии с размерами элементов могут перемещать данные между меньшими элементами, например, если вы используете счетчик сдвига или поворота 32 или 16. vprolq zmm, zmm, 32
имеет задержку 1с и работает на порте 0 (а также на порте 1 для версий xmm/ymm), заменяя каждый элемент своим соседом. Сдвиги / вращения не конкурируют за 5 порт на SKX.
Для горизонтальной суммы единственный реальный выбор - какой порядок перемешать. Обычно начинайте с extract
/ add
до 128b, затем используйте __m128
тасует (или целочисленные сдвиги) вместо использования vpermd/q
за каждый случай Или, если вы хотите, чтобы результат транслировался по всем элементам, используйте перетасовки внутри строки между первыми несколькими добавлениями, а затем перетасуйте в 128b, а затем фрагменты 256b с перестановками в полосе. (Тасование в блоках по 128b не быстрее, чем мелкие гранулы с непосредственным контролем, такие как vpermq z,z,imm8
на SKX, но это все, что вам нужно для hsum после того, как вы сделали vshufps
или же vpermilps
.)
На KNL важны не полосы, а перетасовки с 1 и 2 источниками. например vshufps dst, same,same, imm8
это половина пропускной способности vpermilps dst, src, imm8
, Перестановки с 1 источником с векторным управлением типа vpermd v,v,v
все еще быстр, хотя (1 источник + 1 вектор тасования).
Даже когда они только 1 моп, тасовки с задержкой 4-7c (2 входа) имеют пропускную способность хуже 2c. Я предполагаю, что это означает, что блок перемешивания KNL не полностью конвейеризован.
Обратите внимание, что некоторые будущие процессоры AMD, вероятно, разделят 512-битные операции на две 256-битные операции (или, возможно, четыре 128-битные операции). Перестановки переулков там значительно дороже. Четное vperm2f128
на Ryzen - 8 моп, пропускная способность 3c lat / 3c, против 1 моп на SKL. Перестановки внутри полосы, очевидно, довольно легко разлагаются на 1 моп на полосу, но пересечение полосы - нет.
Необработанные данные
Для Skylake-AVX512 (он же Skylake-X, он же SKL-SP или SKX) существуют результаты InstLatx64 (пропускная способность / задержка), и IACA его поддерживает. InstLatx64 имеет электронную таблицу (формат ODS OpenOffice/LibreOffice), объединяющую данные из IACA (только число uop и порты) и публикуемые Intel в формате PDF (пропускная способность / задержка) и из реальных экспериментальных испытаний на реальном оборудовании (пропускная способность / задержка). Проверьте главную страницу InstLat на наличие обновлений.
Таблицы инструкций Агнера Фога содержат данные для Knight's Landing Xeon Phi (KNL), и в его микроархиве PDF есть раздел об микроархитектуре на основе Silvermont. У него, к сожалению, пока нет результатов теста SKX.
Команды KNL имеют большую задержку, если их ввод поступает из одного и того же исполнительного устройства (например, shuffle -> shuffle) по сравнению с FMA -> shuffle. (См. Примечание в верхней части таблицы Агнера). Это то, о чем говорят цифры времени ожидания 4-7c. Транспонирование или что-то, выполняющее цепочку тасов, может видеть в основном число с более низкой задержкой. (Но у KNL, как правило, большие задержки, поэтому он использует четырехполосную гиперпоточность, чтобы попытаться их скрыть).
SKX: Skylake-AVX512 (и, вероятно, будущие основные процессоры Intel)
Все тасовки, пересекающие полосу движения, имеют в лучшем случае 1 мкс, 3 с задержкой, 1 с пропускной способностью Но даже сложные / мощные, такие как 2-вход vpermt2ps
так быстро Это включает в себя все тасования, которые тасуют целые дорожки, или вставляют / извлекают фрагменты 256b.
Все тасовки только на полосе имеют задержку 1с (за исключением версии xmm некоторых новых тасов, пересекающих полосы движения, в avx512). Так что используйте vpshufd zmm, zmm, imm8
или же vpunpcklqdq zmm, zmm, zmm
когда это все, что тебе нужно. Или же vpshufb
или же vpermilps
с входом векторного управления.
Как и Haswell и SKL (не avx512), SKX может запускать только случайные операции на порту 5. Как и в предыдущих процессорах, он может транслировать нагрузку, используя только порты загрузки, так что это так же дешево, как и обычная векторная загрузка. Широковещательные нагрузки AVX512 могут микросинхронизироваться, что делает вещание с использованием памяти дешевле (в терминах пропускной способности), чем источник регистра.
Четное vmovsldup ymm, [mem]
/ vmovshdup ymm, [mem]
используйте просто загрузочный моп для перемешивания 256b. ИДК около 512б; Instlat не тестировал источник памяти movsl/hdup, поэтому у нас есть только данные Агнера Фога. (И IIRC я подтвердил это на моем собственном SKL).
Обратите внимание, что при выполнении инструкций 512b векторные ALU на порте 1 отключены, поэтому максимальная пропускная способность равна 2 векторным мерам ALU за такт. (Но p1 все еще может запускать целочисленные вещи.) И векторный мент загрузки / хранения не требует p0 / p5, поэтому вы все еще можете узкое место во внешнем интерфейсе (4 мопа на тактовую проблему / переименование) в коде со смесью не -fused загрузки, хранилища, и ALU (и издержки целочисленного цикла, и копирование регистра vmovdqa, обработанное на этапе переименования с неопределяемым доменом uop).
Исключения из правила на SKX:
VPMOVWB ymm, zmm
и аналогичные усеченные или подписанные / беззнаковые насыщенные инструкции имеют значение 2 моп, 4 с задержкой. (Или 2c для версий xmm).vpmovqd
задержка 1 моп, 3c (или 1 c xmm), потому что его наименьшая гранулярность равна dword, и она только усекает, а не насыщает, поэтому она может быть реализована внутри с тем же оборудованием, которое необходимо дляpshufb
например.vpmovz/sx
инструкции по-прежнему только 1 моп.vpcompressd/q
(в левом пакете на основе маски) 2 мопа (p5), задержка 3c. (Или 6c в соответствии с тем, что публикует Intel; возможно, Instlat тестирует задержку вектора-> вектора, а Intel даетk
регистрация -> задержка вектора? Маловероятно, что это зависит от данных и быстрее с тривиальной маской.)vpexpandd
также 2 моп.AVX512BW
vpermt2w
/vpermi2w
составляет 3 мопа (p0 + 2p5), задержка 7c для всех трех размеров операндов (xmm/ymm/zmm). Широкие тасовки с малой гранулярностью стоят дорого в аппаратном обеспечении (см. Где VPERMB в AVX2? Включая комментарии). Это тасование 16-битных элементов с 2 источниками с управлением в 3-м векторе. Это может стать быстрее в конечном итоге в будущих поколениях, способpshufb
(и все перетасовки с полным регистром с гранулярностью менее 8 байт) были медленными в первом поколении Core2 Conroe / Merom, но быстро развивались в последующем поколении штамповки-сжатия (Penryn).AVX512BW
vpermw
(случайное слово, пересекающее полосу, с одним источником) - 2p5, задержка 6c, пропускная способность 2c, потому что это случайное слово, пересекающее полосу.ожидать AVX512VBMI
vpermt2b
быть таким же плохим или хуже на Cannonlake, даже если Cannonlake действительно улучшитсяvpermt2w
/vpermw
,vpermt2d/q/ps/pd
все они эффективны в SKX, потому что их гранулярность - dword (32-битная) или шире. (Но все равно очевидно задержка в 3c для версии xmm, поэтому они не собирали отдельное оборудование для ускорения версии с одной линией). Они даже более мощные, чем переулокshufps
: переменный элемент управления, без ограничений на то, из какого регистра источника происходит каждый элемент. Это полностью общий случай с двумя исходными кодами, когда вы индексируете в объединение двух регистров, перезаписывая индекс (vpermi2*
) или одна из таблиц (vpermt2*
). Есть только одно свойство, потому что компилятор обрабатывает распределение и копирование регистров, чтобы сохранить все еще необходимые значения.
Посадка Рыцаря:
Тасования выполняются только на порту FP0, но пропускная способность внешнего интерфейса составляет всего 2 мопа за такт. Таким образом, большая часть ваших общих инструкций может быть перемешана без узких мест (по сравнению с SKX), если только они не являются половинными.
В общем, 2-х входные тасовки вроде vperm2f128
/ vshuff32x4
или же vshufps
2c пропускная способность / 4-7c латентность, в то время как 1-входные тасовки, как vpermd
1 c пропускная способность / 3-6c латентность. (т. е. 2 входа занимают блок тасования для дополнительного цикла (половина пропускной способности) и стоят 1 дополнительный цикл задержки). Агнер не совсем понимает, каков эффект не полностью конвейеризованных тасов, но я предполагаю, что он просто связывает блок тасования, а не все на порте FP0 (как блок FMA).
Пересечение переулка или нет не имеет значения на KNL, например
vpermilps
а такжеvpermps
оба быстры (1 c пропускная способность, 3-6c латентность), ноvpermi2ps
а такжеvshufps
оба медленные (пропускная способность 2c, задержка 4-7c). Я не вижу каких-либо исключений к этому для инструкций, где KNL поддерживает версию AVX512. (т.е. не считая AVX2vpshufb
, т.е. почти все с 32-битной или большей гранулярностью).vinserti32x4
и т. д. (вставка / извлечение с гранулярностью не менее 128b) - это тасование с двумя входами для вставки, но оно быстрое: 3-6c lat / 1c tput. Но извлечение в память является множественным мопом и вызывает узкое место декодирования: например,VEXTRACTF32X4 m128,z
4 моп, один на 8c пропускной способности. (в основном из-за декодирования).vcompress/ps/d
,vpcompressd/q
а такжеv[p]expandd/q/ps/pd
1 моп, 3-6с латентность. (против 2 мопов на SKX). Но пропускная способность - только одна на 3c: Агнер не указывает, связывает ли это всю единицу перемешивания для 2c, или только эта часть не полностью конвейеризована.Перестановки байтов / слов в AVX2 очень медленны для размера операнда 256b:
pshufb xmm
пропускная способность 5 моп / 10с,vpshufb ymm
пропускная способность 12 моп / 12с. (MMXpshufb mm
равняется 1 моп, задержка 2-6c, пропускная способность 1 c, поэтому я думаю, что блок перемешивания байтовой гранулярности имеет ширину 64 b.)pshuflw xmm
1 моп быстро, ноvpshuflw ymm
4 моп, пропускная способность 8с.Кодирование видео на KNL едва ли стоит того с 128-битным AVX (
vpsadbw xmm
это быстро), но инструкции AVX2 ymm обычно медленнее, чем использование более 1 uop xmm инструкций.movss/sd xmm,xmm
является смесью, а не перемешиванием, и имеет пропускную способность 0,5 с / задержку 2 с.vpunpcklbw / wd очень медленные (кроме версии xmm), но DQ и QDQ - обычная скорость даже для размера операнда ymm / zmm. (Пропускная способность 2c / задержка 4-7c, потому что это тасование с двумя входами).
vpmovzx
задержка 3c (не 3-6c?) и пропускная способность 2c даже дляvpmovzxbw
,vpmovsx
медленнее: 2 мопа и, следовательно, узкое место декодирования, что делает его задержкой 8c и пропускной способностью 7c. Сужающие усеченные инструкции (vpmovqb
и т. д.) равны 1 моп, 3c широта / 1c tput, но инструкции по сужению насыщения равны 2 моп и, следовательно, медленны. Агнер не проверял их с назначением памяти.