Можно ли использовать FMA вместо ADD для операций XMM/YMM FP на Intel Haswell?

Этот вопрос относится к упакованным операциям с плавающей запятой одинарной точности с регистрами XMM/YMM в Haswell.

Итак, в соответствии с потрясающей, потрясающей таблицей, составленной Агнером Фогом, я знаю, что MUL может быть выполнен на любом порту p0 и p1 (с recp thruput 0,5), в то время как только ADD выполняется только на порту p1 (с recp thruput 1). Я могу кроме этого ограничения, НО я также знаю, что FMA может быть сделано или на порте p0 или на p1 (с recp thruput 0.5). Поэтому меня смущает, почему обычный ADD будет ограничен только p1, когда FMA может использовать либо p0, либо p1, и это делает ADD и MUL. Я неправильно понимаю таблицу? Или кто-то может объяснить, почему это будет?

То есть, если мое чтение правильное, почему бы Intel не использовать FMA op в качестве основы как для простого MUL, так и для простого ADD, тем самым увеличивая производительность ADD, а также MUL. Кроме того, что помешало бы мне использовать две одновременные независимые операции FMA для эмуляции двух одновременных независимых операций ADD? Какие штрафы связаны с выполнением ADD-by-FMA? Очевидно, что используется большее количество регистров (2 reg для ADD против 3 reg для ADD by-FMA), но кроме этого?

1 ответ

Вы не единственный, кто запутался, почему Intel сделала это. Агнер Фог в своем руководстве по микроархитектуре пишет для Haswell:

Странно, что есть только один порт для сложения с плавающей запятой, но два порта для умножения с плавающей запятой.

На доске объявлений Агнера он также пишет

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

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

Он также обсуждает это в этом ответе здесь флоп-за-цикл-для-песочного-моста-и-хэсвелла-sse2-avx-avx2

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

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

Его ответ там в основном отвечает на ваш вопрос. Вы можете использовать FMA для удвоения пропускной способности сложения. Фактически я делаю это в своих тестах пропускной способности для сложения и действительно вижу, что это удваивается.

Подводя итог, можно сказать, что если ваш расчет связан с задержкой, не используйте FMA, используйте ADD. Но если это ограничено пропускной способностью, вы можете попробовать использовать FMA (установив множитель на 1,0), но вам, вероятно, придется использовать много регистров AVX, чтобы сделать это.

Я развернул 10 раз, чтобы получить максимальную пропускную способность в этом цикле, развертывающемся для достижения максимальной пропускной способности с ivy-bridge-and-haswell

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