Как объединить несколько операций FMA вместе для повышения производительности?

Предполагая, что в некотором коде C или C ++ у меня есть функция с именем T fma( T a, T b, T c ) который выполняет 1 умножение и 1 сложение, так ( a * b ) + c ; как я должен оптимизировать несколько мул & добавлять шаги?

Например, мой алгоритм должен быть реализован с помощью 3 или 4 операций FMA, связанных и суммированных вместе. Как я могу написать это эффективный способ и какой части синтаксиса или семантики я должен уделить особое внимание?

Мне также хотелось бы получить несколько советов по поводу критической части: избегайте изменения режима округления ЦП, чтобы избежать очистки процессора. Но я совершенно уверен, что просто используя + операция между несколькими вызовами fma Я не должен это менять, я говорю «совершенно уверен» потому что у меня не так много процессоров, чтобы проверить это, я просто следую некоторым логическим шагам.

Мой алгоритм что-то вроде общего количества вызовов FMA

fma ( triplet 1 ) + fma ( triplet 2 ) + fma ( triplet 3 )

4

Решение

Недавно в Build 2014 Эрик Брумер выступил с очень приятной беседой на эту тему (посмотреть здесь).
Суть разговора была в том, что

Использование Fused Multiply Accumulate (FMA) повсеместно снижает производительность.

В процессорах Intel инструкция FMA стоит 5 циклов. Вместо этого выполнение умножения (5 циклов) и сложения (3 цикла) стоит 8 циклов. Используя FMA, вы получаете две операции в выигрыше одной (см. Рисунок ниже).

введите описание изображения здесь

Тем не менее, FMA, похоже, не является святым Граалем инструкций. Как вы можете видеть на картинке ниже, FMA может в определенных цитатах повредить производительности.

введите описание изображения здесь

Таким же образом, ваш случай fma(triplet1) + fma(triplet2) + fma(triplet 3) стоит 21 цикл, тогда как если бы вы делали те же операции без FMA, это стоило бы 30 циклов. Это 30% прирост производительности.

Использование FMA в вашем коде потребует использования встроенные функции компилятора. По моему скромному мнению, FMA и т. Д. Не должны беспокоить вас, если вы не программист на C ++. Если нет, то пусть оптимизация компилятора позаботится об этих технических особенностях. Как правило, в основе такого рода проблем лежит корень всего зла (то есть преждевременная оптимизация), чтобы перефразировать одно из великих (то есть Дональда Кнута).

7

Другие решения


По вопросам рекламы [email protected]