Каково определение операций с плавающей точкой (FLOP) - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь оптимизировать свой код с помощью SIMD (на процессорах ARM) и хочу узнать его арифметическую интенсивность (флопс / байт, AI) и FLOPS.

Чтобы вычислить AI и FLOPS, мне нужно посчитать количество операций с плавающей запятой (FLOP). Однако я не могу найти точного определения FLOP.
Конечно, mul, add, sub, div явно являются FLOP, но как насчет операций перемещения, операций тасования (например, _mm_shuffle_ps), операций набора (например, _mm_set1_ps), операций преобразования (например, _mm_cvtps_pi32) и т. Д.?
Это операции, которые имеют дело со значениями с плавающей запятой. Должен ли я считать их как FLOP? Если нет, то почему?
Какие операции обычно учитывают такие профилировщики, как Intel VTune и Nvidia nvprof, или PMU?

EDIT:
Какие все операции включает FLOPS?
Этот вопрос в основном о математически сложных операциях.
Я также хочу знать стандартный способ работы с «нематематическими» операциями, которые принимают значения или векторы с плавающей запятой в качестве входных данных.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Когда дело доходит до оптимизации, обычной практикой является измерение FLOP только на горячих точках вашего кода, например, числа операций умножения и накопления с плавающей запятой в Convolution. Это происходит главным образом потому, что другие операции могут быть незначительными или незаменимыми и поэтому не могут быть использованы для какой-либо оптимизации.

Например, все инструкции в разделе Векторные инструкции с плавающей запятой в A4.13 в Справочное руководство ARMv7 подпадают под Операцию с плавающей запятой, поскольку FLOPs / Cycle для инструкции FPU обычно постоянны в процессоре.

Не только ARM, но и многие микропроцессоры имеют выделенный модуль с плавающей запятой, поэтому, когда вы измеряете FLOP, вы измеряете скорость этого блока. С этим и FLOPs / цикл вы можете более или менее рассчитать теоретическую пиковую производительность.

Но FLOP должны приниматься с небольшим количеством соли, поскольку они могут использоваться только для приблизительной оценки скорости вашего кода, поскольку они не учитывают другие условия, в которых работает ваш процессор. Вот почему подсчет FLOP только для ваших горячих точек (обычно арифметических операций) в большинстве случаев более или менее достаточен.

Сказав это, FLOP могут выступать в качестве сравнительной метрики для двух трудоемких частей кода, но сами по себе ничего не говорят о них.

0 голосов
/ 10 сентября 2018

Перемешивание / смешивание на значениях FP не считаются FLOP. Они просто накладывают расходы на использование SIMD не только для «вертикальных» задач , либо для проблем с ветвлением, которые вы выполняете без блендирования с помощью смеси.

Также нет FP И / ИЛИ / XOR. Вы можете попытаться оправдать подсчет абсолютного значения FP, используя andps (_mm_and_ps), но обычно оно не учитывается. FP abs не требует рассмотрения показателя степени / значимости или нормализации результата или каких-либо вещей, которые делают исполнительные блоки FP дорогими. abs (AND) / sign-flip (XOR) или сделать отрицательным (OR) являются тривиальными побитовыми операциями, а также не нужны


FMA обычно считается как две операции с плавающей запятой (mul и add), даже если это одна инструкция с одинаковой (или схожей) производительностью для SIMD FP add или mul. Самая важная проблема, с которой сталкиваются узкие места в raw FLOP/s, - это matmul, который нуждается в равном смешивании mul и add и может в полной мере использовать преимущества FMA.

Таким образом, FLOP / s ядра Haswell составляет

  • его ширина вектора SIMD (8 float элементов на вектор)
  • раз SIMD FMA за такт (2)
  • раз FLOPs на FMA (2)
  • тактовая частота (максимальная одноядерная турбина, которую он может выдержать при максимальном использовании обоих модулей FMA; длительный период зависит от охлаждения, кратковременный зависит только от пределов мощности).

Для целого ЦП, а не только для одного ядра: умножьте на количество ядер и используйте максимальную поддерживаемую тактовую частоту, когда все ядра заняты, обычно ниже, чем одноядерный турбо на процессорах, которые вообще имеют турбо.)

Intel и другие производители процессоров не учитывают тот факт, что их процессоры могут также поддерживать vandps параллельно с 2 vfma132ps инструкциями в такт, потому что FP abs не является сложной операцией.

См. Также Как мне достичь теоретического максимума 4 FLOP за цикл? . (На самом деле это больше, чем 4 на современных процессорах: P)


Пиковые FLOPS (FP операций в секунду или FLOP / s) недостижимы, если у вас много других служебных данных, занимающих полосу пропускания внешнего интерфейса или создающих другие узкие места. Метрика - это просто количество математики, которое вы можете использовать при работе по прямой, а не по какой-либо конкретной практической проблеме.

Хотя люди и думают, что глупо, если теоретические пиковые провалы намного выше, чем когда-либо тщательно подобранные вручную матмулы или Мандельброт, даже для задач с постоянным временем компиляции. например если передний конец не может идти в ногу с какими-либо магазинами, а также FMA. например если бы у Haswell было четыре исполнительных блока FMA, то он мог поддерживать только максимальные FLOP, если буквально каждая инструкция была FMA. Операнды в источнике памяти могут слиться воедино для нагрузок, но не будет места для хранения без ущерба для пропускной способности.

Причина, по которой у Intel нет даже 3 модулей FMA, заключается в том, что большинство реальных кодов испытывают проблемы с насыщением 2 модулей FMA, особенно только с 2 портами загрузки и 1 портом хранилища. Они будут потрачены впустую почти все время, а 256-битный модуль FMA требует много транзисторов.

...