Почему некоторые задержки Haswell AVX объявлены Intel в 3 раза медленнее, чем Sandy Bridge?
В веб-приложении In tel intrinsics некоторые операции, от Sandy Bridge до Haswell, ухудшились. Например, многие операции вставки, такие как _mm256_insertf128_si256, показывают таблицу затрат, как показано ниже:
Performance
Architecture Latency Throughput
Haswell 3 -
Ivy Bridge 1 -
Sandy Bridge 1 -
Я нашел эту разницу удивительным. Это различие, потому что есть новые инструкции, которые заменяют эти или что-то, что компенсирует это (какие)? Кто-нибудь знает, изменяет ли Skylake эту модель дальше?
1 ответ
TL: DR: все перестановки / вставки / выдержки, пересекающие полосу, имеют задержку 3c на Haswell/Skylake, но задержку 2c на SnB/IvB, согласно тестированию Agner Fog.
Вероятно, это 1c в исполнительном блоке + неизбежная задержка обхода некоторого рода, потому что фактические исполнительные блоки в SnB через Broadwell имеют стандартизированные задержки 1, 3 или 5 циклов, а не 2 или 4 цикла. (SKL делает несколько мопов в 4с, включая FMA / ADDPS / MULPS).
(Обратите внимание, что на процессорах AMD, которые выполняют AVX1 с 128b ALU (например, Bulldozer/Piledriver/Steamroller), insert128/extract128 намного быстрее, чем тасования, такие как VPERM2F128.)
Внутреннее руководство иногда содержит фиктивные данные. Я предполагаю, что это предназначено для reg-reg формы инструкций, за исключением случая загрузки load. Даже когда это правильно, руководство по внутренним характеристикам не дает очень детальной картины производительности; см. ниже для обсуждения таблиц / руководства Агнер Фог.
(Одна из моих любимых мозолей - это то, что ее трудно использовать PMOVZX
/ PMOVSX
в качестве нагрузки, потому что единственные встроенные функции принимают __m128i
источник, хотя pmovzxbd
загружает только 4B или 8B (мм). Это и / или широковещательные нагрузки (_mm_set1_*
с AVX1/2) отличный способ сжать константы в памяти. Должны быть присущие const char*
(потому что это разрешено псевдонимом что угодно)).
В этом случае измерения Agner Fog показывают, что SnB / IvB имеют задержку 2c для reg-reg vinsertf128
/ vextractf128
в то время как его измерения для Haswell (задержка 3c, один на 1c tput) согласуются с таблицей Intel. Так что это еще один случай, когда цифры в руководстве по встроенным функциям Intel неверны. Это отлично подходит для поиска правильной внутренней, но не хороший источник для надежных показателей производительности. Он ничего не говорит вам о портах выполнения или общем количестве мопов, и часто пропускает даже числа пропускной способности. В любом случае задержка часто не является ограничивающим фактором в векторном целочисленном коде. Вероятно, поэтому Intel позволила увеличить время ожидания для Haswell.
Форма reg-mem значительно отличается. vinsertf128 y,y,m,i
имеет широту / возвратность: IvB:4/1, Haswell/BDW:4/2, SKL:5/0,5. Это всегда инструкция с 2 мопами (слитый домен), использующая одну меру ALU. ИДК, почему пропускная способность такая разная. Может быть, Агнер проверял немного по-другому?
Что интересно, vextractf128 mem,reg, i
не использует ALU Uops. Это инструкция 2-fused-domain-uop, которая использует только порты store-data и store-address, а не блок случайного перемешивания. (В таблице Агнера Фога указано, что в SnB используется один p015 uop, в IvB - 0, но даже в SnB нет метки в каком-либо конкретном столбце, поэтому IDK - правильный.)
Глупо что vextractf128
тратит байт на непосредственный операнд. Я думаю, они не знали, что собираются использовать EVEX для следующего расширения длины вектора, и готовились к немедленному переходу от 0..3. Но для AVX1 / 2 вы никогда не должны использовать эту инструкцию с немедленным = 0. Вместо этого просто movups mem, xmm
или же movaps xmm,xmm
, (Я думаю, что компиляторы знают это, и делают это, когда вы используете внутреннее с index = 0, как они делают для _mm_extract_epi32
и так далее (movd
).)
Задержка является более частым фактором в коде FP, а Skylake является монстром для ALU FP. Им удалось снизить задержку для FMA до 4 циклов, поэтому mulps/addps/fma...ps имеют задержку 4 c с пропускной способностью один на 0,5 c. (Бродвелл был задержкой по протоколу mulps/addps = 3c, латентность по fma = 5c. Haswell был задержкой по адресу addps = 3c, mul/fma=5c). Скайлэйк отбросил отдельную единицу добавления, поэтому количество надстроек фактически ухудшилось с 3с до 4с, но с удвоенной пропускной способностью. (Haswell/BDW создавал только addps с одной пропускной способностью на 1c, что вдвое меньше, чем у mul/fma.) Поэтому использование большинства векторных аккумуляторов является существенным в большинстве алгоритмов FP для поддержания 8 или 10 FMA в полете одновременно, чтобы насытить пропускную способность, если есть переносимая петлей зависимость. В противном случае, если тело цикла достаточно мало, выполнение вне порядка будет иметь несколько итераций в полете одновременно.
Целочисленные операции на линии, как правило, имеют задержку всего в 1с, поэтому для достижения максимальной пропускной способности требуется гораздо меньший параллелизм (и не ограничиваться задержкой).
Ни один из других вариантов получения данных в верхнюю половину ymm не лучше
vperm2f128
или AVX2 vpermps
дороже. Работа с памятью приведет к ошибке пересылки хранилища -> большая задержка для вставки (2 узких хранилища -> широкая загрузка), так что это явно плохо. Не пытайся избежать vinsertf128
в тех случаях, когда это полезно.
Как всегда, старайтесь использовать самые дешевые последовательности команд. например, для горизонтальной суммы или другого сокращения, всегда сначала уменьшайте до вектора 128b, потому что тасования между полосами медленные. Обычно это просто vextractf128
/ addps xmm
Тогда обычный горизонтальный 128b.
Как упомянул Mysticial, Haswell и более поздние имеют половину пропускной способности векторного перестроения в полосе SnB / IvB для 128b векторов. SnB/IvB может pshufb
/ pshufd
с одним на 0,5 c пропускной способности, но только один на 1c для shufps
(даже версия 128b); то же самое для других перемешиваний, которые имеют версию ymm в AVX1 (например, vpermilps
, который, очевидно, существует только для того, чтобы загрузка-и-перемешивание FP могла быть выполнена в одной инструкции). Haswell полностью избавился от устройства shuffle 128b на port1, вместо того, чтобы расширить его для AVX2.
Re: Skylake
Таблицы руководств / инснов Agner Fog были обновлены в декабре и теперь включают Skylake. Смотрите также вики-тег x86 для получения дополнительных ссылок. Форма reg, reg имеет те же характеристики, что и в Haswell/Broadwell.