FLOPS за цикл для песчаного моста и haswell SSE2/AVX/AVX2

Я запутался в том, сколько флопов за такт на ядро можно сделать с помощью Sandy-Bridge и Haswell. Насколько я понимаю, с SSE должно быть 4 флопа на такт на ядро для SSE и 8 флопс на такт на ядро для AVX/AVX2.

Кажется, это проверено здесь. Как мне достичь теоретического максимума 4 FLOP за цикл? и вот, спецификация процессора Sandy-Bridge.

Однако приведенная ниже ссылка указывает на то, что Sandy-bridge может делать 16 флопов за цикл на ядро, а Haswell 32 флопа на цикл на ядро http://www.extremetech.com/computing/136219-intels-haswell-is-an-unprecedented -вред-нвидиа-амд.

Может кто-то объяснить это мне?

Изменение: теперь я понимаю, почему я был смущен. Я думал, что термин FLOP относится только к одной с плавающей точкой (SP). Теперь я вижу, что тест на Как я могу достичь теоретического максимума 4 FLOP за цикл? фактически на двойной плавающей запятой (DP), поэтому они достигают 4 DP FLOP/цикл для SSE и 8 DP FLOP/цикл для AVX. Было бы интересно повторить этот тест на SP.

Ответ 1

Вот теоретические максимальные числа FLOP (на ядро) для ряда последних микроархитектур процессоров и объяснение того, как их достичь.

В общем, чтобы рассчитать это, посмотрите пропускную способность инструкции FMA, например, на https://agner.org/optimize/ или любом другом результате микробенчмарка, и умножьте
(FMAs per clock) * (vector elements/instruction) * 2 (FLOPs/FMA).
Обратите внимание, что для достижения этого в реальном коде требуется очень тщательная настройка (например, развертывание цикла), и почти нулевое отсутствие кеша, и никаких узких мест ни в чем другом. Современные процессоры обладают такой высокой пропускной способностью FMA, что нет других возможностей для других инструкций хранить результаты или вводить их. например, 2 загрузки SIMD за такт - это также предел для большинства процессоров x86, поэтому точечный продукт будет узким местом при 2 нагрузках на 1 FMA. Тем не менее, тщательно настроенное умножение плотных матриц может приблизиться к достижению этих чисел.

Если ваша рабочая нагрузка включает в себя какие-либо ADD/SUB или MUL, которые нельзя заключить в FMA, теоретические максимальные числа не являются подходящей целью для вашей рабочей нагрузки. У Haswell/Broadwell есть умножение SIMD FP на 2 такта (для блоков FMA), но только 1 добавление SIMD FP на такт (на отдельном векторном блоке FP с меньшей задержкой). Skylake отбросил отдельный сумматор SIMD FP, выполнив add/mul/fma то же самое с задержкой 4c, пропускной способностью 2 на такт для любой ширины вектора.

Intel

Обратите внимание, что версии последних микроархитектур Celeron/Pentium не поддерживают инструкции AVX или FMA, только SSE4.2.

Intel Core 2 и Nehalem (SSE/SSE2):

  • 4 DP FLOPs/цикл: добавление SSE2 шириной 2 + умножение SSE2 шириной 2
  • 8 SP FLOPs/цикл: добавление SSE 4 в ширину + умножение SSE 4 в ширину

Intel Sandy Bridge/Ivy Bridge (AVX1):

  • 8 DP FLOPs/цикл: добавление AVX по 4 в ширину + умножение AVX по 4 в ширину
  • 16 SP FLOPs/цикл: добавление AVX по всей ширине + умножение AVX по всей ширине

Intel Haswell/Broadwell/Skylake/Kaby Lake/Кофе/... (AVX + FMA3):

  • 16 DP FLOPs/цикл: две инструкции FMA (с многократным сложением)
  • 32 SP FLOPs/цикл: две инструкции FMA шириной 8 (с плавным добавлением)
  • (Использование 256-битных векторных инструкций может снизить максимальную тактовую частоту на некоторых процессорах.)

Intel Skylake-X/Skylake-EP/Каскадное озеро/и т.д. (AVX512F) с 1 блоком FMA: немного Xeon, бронза/серебро

  • 16 DP FLOPs/цикл: одна инструкция FMA (с умножением и сложением) шириной 8
  • 32 SP FLOPs/цикл: одна 16-кратная инструкция FMA (с плавным сложением)
  • Та же пропускная способность вычислений, что и для более узких 256-битных инструкций, но ускорения все еще возможны с AVX512 для более широких загрузок/хранилищ, нескольких векторных операций, которые не выполняются на блоках FMA, таких как побитовые операции, и более широких перемешиваний.
  • (Наличие 512-битных векторных инструкций в полете отключает вектор ALU на порту 1. Также снижает максимальную частоту турбо тактовой частоты, поэтому "циклы" не являются постоянными в ваших расчетах производительности.)

Intel Skylake-X/Skylake-EP/Cascade Lake/etc (AVX512F) с 2 модулями FMA: чипы Xeon Gold/Platinum и i7/i9 high-end для настольных ПК (HEDT).

  • 32 DP FLOPs/цикл: две инструкции FMA (с умножением и сложением) шириной 8
  • 64 SP FLOPs/цикл: две 16-разрядные инструкции FMA (с плавным сложением)
  • (Наличие 512-битных векторных инструкций в полете отключает вектор ALU на порту 1. Также снижает максимальную частоту турбо тактовой частоты.)

Будущее. Ожидается, что Intel Cooper Lake (преемник Cascade Lake) представит Brain Float, формат float16 для рабочих нагрузок нейронной сети, с поддержкой для него фактических вычислений SIMD, в отличие от текущего расширения F16C, которое поддерживает только загрузку/хранение с преобразование в float32. Это должно удвоить пропускную способность FLOP/цикл по сравнению с одинарной точностью на одном и том же оборудовании.

Текущие чипы Intel имеют фактические вычисления непосредственно на стандартном float16 в iGPU.


AMD

AMD K10:

  • 4 DP FLOPs/цикл: добавление SSE2 шириной 2 + умножение SSE2 шириной 2
  • 8 SP FLOPs/цикл: добавление SSE 4 в ширину + умножение SSE 4 в ширину

AMD Bulldozer/Piledriver/Steamroller/Excavator, на модуль (два ядра):

  • 8 DP FLOPs/цикл: FMA шириной 4
  • 16 SP FLOPs/цикл: FMA шириной 8

AMD Ryzen

  • 8 DP FLOPs/цикл: FMA шириной 4
  • 16 SP FLOPs/цикл: FMA шириной 8

х86 малой мощности

Intel Atom (Bonnell/45 нм, Saltwell/32 нм, Silvermont/22 нм):

  • 1.5 DP FLOPs/цикл: скалярное сложение SSE2 + скалярное умножение SSE2 через каждый второй цикл
  • 6 SP FLOPs/цикл: добавление SSE по 4 в ширину + умножение SSE по 4 в каждый второй цикл

AMD Bobcat:

  • 1.5 DP FLOPs/цикл: скалярное сложение SSE2 + скалярное умножение SSE2 через каждый второй цикл
  • 4 SP FLOPs/цикл: добавление SSE 4 в ширину каждый второй цикл + умножение SSE 4 в ширину каждый второй цикл

AMD Jaguar:

  • 3 DP FLOPs/цикл: добавление AVX по 4 в ширину каждый второй цикл + умножение AVX по 4 в четыре цикла
  • 8 SP FLOPs/цикл: добавление AVX по 8 в ширину каждый второй цикл + умножение AVX по 8 в каждый второй цикл


РУКА

ARM Cortex-A9:

  • 1.5 DP FLOPs/цикл: скалярное сложение + скалярное умножение каждый второй цикл
  • 4 SP FLOPs/цикл: добавление NEON по 4 раза в каждый второй цикл + увеличение NEON по 4 в ширину через каждый цикл

ARM Cortex-A15:

  • 2 DP FLOPs/цикл: скалярное FMA или скалярное умножение
  • 8 SP FLOPs/цикл: NEONv2 FMA шириной 4 или множитель NEON шириной 4

Qualcomm Krait:

  • 2 DP FLOPs/цикл: скалярное FMA или скалярное умножение
  • 8 SP FLOPs/цикл: NEONv2 FMA шириной 4 или множитель NEON шириной 4

IBM POWER

IBM PowerPC A2 (Blue Gene/Q) для каждого ядра:

  • 8 DP FLOPs/цикл: QPX FMA шириной 4 в каждом цикле
  • Элементы SP распространяются на DP и обрабатываются в тех же единицах

IBM PowerPC A2 (Blue Gene/Q), для каждого потока:

  • 4 DP FLOPs/цикл: QPX FMA по 4 в каждом цикле
  • Элементы SP распространяются на DP и обрабатываются в тех же единицах

Intel MIC/Xeon Phi

Intel Xeon Phi (Рыцарский уголок), на ядро:

  • 16 DP FLOPs/цикл: 8 FMA в каждом цикле
  • 32 SP FLOPs/цикл: FMA шириной 16 в каждом цикле

Intel Xeon Phi (Уголок рыцарей), по теме:

  • 8 DP FLOPs/цикл: FMA шириной 8 в каждом втором цикле
  • 16 SP FLOPs/цикл: FMA шириной 16 через каждый цикл

Intel Xeon Phi (Knights Landing), на ядро:

  • 32 DP FLOPs/цикл: два FMA шириной 8 каждый цикл
  • 64 SP FLOPs/цикл: два FMA по 16 в каждом цикле

Причина того, что для IBM Blue Gene/Q и Intel Xeon Phi (Knights Corner) существует базовая информация о потоках и ядрах, заключается в том, что эти ядра имеют более высокую скорость выдачи команд при запуске более одного потока на ядро.

Ответ 2

Пропускная способность для Haswell ниже для добавления, чем для умножения и FMA. Существует два блока умножения /FMA, но только один f.p. добавить блок. Если ваш код содержит в основном дополнения, вам необходимо заменить дополнения инструкциями FMA с коэффициентом 1,0 для максимальной пропускной способности.

Задержка команд FMA на Haswell равна 5, а пропускная способность - 2 на такт. Это означает, что вы должны поддерживать 10 параллельных операций, чтобы получить максимальную пропускную способность. Если, например, вы хотите добавить очень длинный список f.p. чисел, вам придется разбить его на десять частей и использовать десять регистров аккумулятора.

Это действительно возможно, но кто бы сделал такую ​​странную оптимизацию для одного конкретного процессора?