Пропускная способность FMA и умножение на X86 Broadwell
Я подозреваю, что последняя архитектура Intel для выполнения мнемоники MUL
как FMA
но с нулевым дополнением (на архитектуре broadWell).
Подробно, я в настоящее время выполняю произведение четырехчленных полиномов (Пи), следуя шаблону.
P1*P2*P3*P4
Каждый многочлен Pi(x) = a + bX +cX^2 оценивается двумя последовательными FMA
, Однако, когда я измеряю пропускную способность моей проблемы, цифры очень низкие. В соответствии с таблицей Agner Fog Agner Fog на странице 242 пропускная способность FMA
а также MUL
0,5. Определение пропускной способности: время в [цикле] для выполнения новой идентичной мнемоники.
Так что я должен получить штраф между FMA
и MUL
Однако мое измерение является гладким. Я подозреваю, что процессор под капотом поменять местами MUL
по FMA
с нулевым дополнением или, по крайней мере, используйте идентичную часть схемы в FPU, что объясняет мои результаты.
Я могу быть совершенно неправ, но если инженер по аппаратному обеспечению может подтвердить или опровергнуть.
1 ответ
Так что я должен получить штраф между FMA и MUL
Да, из таблиц Agner Fog вы должны посмотреть, на каких портах выполнения работает инструкция. Обычно это все, что вам нужно, чтобы определить пропускную способность для последовательности различных инструкций. (На современных основных процессорах x86, таких как Broadwell, все исполнительные модули, кроме div/sqrt, полностью конвейерны (могут запускать новый цикл каждый такт), поэтому только некоторые странные микрокодированные инструкции, такие как loop
иметь меньшую пропускную способность, чем вы ожидаете от просмотра их мопов / портов.)
Фактические числа "пропускной способности" в таблицах Агнера в основном полезны как сводка или указание на какую-то странность, и обычно не используются непосредственно, особенно для эффективных однопользовательских инструкций, таких какvmulps
или жеvfma...ps
, См. Какие соображения относятся к прогнозированию задержки для операций на современных суперскалярных процессорах и как я могу рассчитать их вручную? некоторые подробности о том, как предсказать производительность для блока из нескольких инструкций с точки зрения задержки, узких мест внутреннего порта и узких мест пропускной способности входного потока.
однако мое измерение гладкое. Я подозреваю, что процессор под капотом заменяет MUL на FMA с нулевым добавлением или, по крайней мере, использует идентичную часть схемы в FPU, что объясняет мои результаты.
Я не понимаю Вы только что сказали, что думаете, что MUL и FMA должны конфликтовать друг с другом, но теперь вы говорите, что думаете, что запуск MUL на устройстве FMA что-то объясняет??
Я подозреваю, что последняя архитектура Intel выполняет мнемонический MUL как FMA, но с нулевым добавлением (на архитектуре broadWell).
Почти каждая операция FP, которая должна нормализовать результат FP (кроме добавления FP), выполняется на модуле FMA в Бродвелле.Но mul и add имеют задержку в 3 цикла в Broadwell, в то время как фактическая FMA имеет задержку в 5 циклов, поэтому очевидно, что существуют различные конфигурации для модуля FMA. MUL/FMA идентичны для пропускной способности, но не для задержки в Broadwell.
(В отличие от Skylake, где отдельный модуль добавления был отброшен, и оба устройства mul/add имеют одинаковую пропускную способность 4c / 0,5 c, что и FMA).
Наличие MUL с другой задержкой, чем у FMA в Broadwell, является необычным; большинство процессоров, которые оба запускают их с одинаковой производительностью, по-видимому, просто0.0
в ввод ввода, или что-то эквивалентное.
SIMD Integer умножение также использует множители в блоке FMA, как и целочисленное смещение. Его использует удивительное количество вещей, но в Skylake-X имеет смысл, что они будут максимально использовать преимущества этих транзисторов вместо того, чтобы иметь более 512-битных исполнительных блоков SIMD шириной.
В настоящее время я выполняю произведение четырехчленных полиномов (Пи), следуя шаблону.
P1*P2*P3*P4
Что вы делаете с результатами? Вы делаете только группы из 4 человек? Что вы делаете с результатом каждой группы?
Или вы умножаетемного квадратических полиномов в одну огромную цепочку умножений, создавая цепочку зависимостей мульп?
Это будет узким местом при 3 циклах на каждый многочлен с независимыми вычислениями каждого многочлена (2x FMA) для создания входных данных для этих операций, происходящих параллельно. В этом случае Broadwell - ваш идеальный процессор для этого, с 3-х тактным мулпом против 5-ти тактовым в Haswell и 4-х тактным Skylake.
Но если вы можете притворяться, что математика FP ассоциативна и имеет разные временные результаты, вы можете запустить 2, 3 или 4 цепочки умножений (или даже больше) и объединить в конце, используя развернутый цикл с несколькими векторами. например(P1*P3*P5*... ) * (P2*P4*P6*...)
с этим последним умножить вне цикла как часть очистки.
См. Почему Мулсс занимает всего 3 цикла в Haswell, в отличие от таблиц инструкций Агнера?больше о развертывании с несколькими аккумуляторами, чтобы скрыть задержку FP.