Дают ли 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. (т.е. не считая AVX2 vpshufb, т.е. почти все с 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с. (MMX pshufb 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 моп и, следовательно, медленны. Агнер не проверял их с назначением памяти.

Другие вопросы по тегам