Какие алгоритмы выигрывают больше от слияния множителей? - PullRequest
14 голосов
/ 28 августа 2010

fma(a,b,c) эквивалентно a*b+c, за исключением того, что оно не округляет промежуточный результат.

Не могли бы вы привести несколько примеров алгоритмов, которые нетривиально выигрывают от избежания этого округления?

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

Ответы [ 6 ]

6 голосов
/ 07 сентября 2010

taw хит одного важного примера;В более общем смысле FMA позволяет разработчикам библиотек эффективно реализовывать многие другие операции с плавающей запятой с правильным округлением.

Например, платформа, имеющая FMA, может использовать ее для реализации правильно округленного деления и квадратного корня (PPC и Itaniumпринял этот подход), который позволяет FPU быть в основном специализированной машиной FMA.У Питера Тана и Джона Харрисона (Intel) и Питера Маркштейна (HP) есть несколько статей, которые объясняют это использование, если вам любопытно.в отслеживании границ ошибок.Это позволяет вам представить произведение двух чисел с плавающей запятой в виде суммы двух чисел с плавающей запятой без какой-либо ошибки округления;это весьма полезно при реализации правильно округленных библиотечных функций с плавающей точкой.Книга Жана-Мишеля Мюллера или статьи о crlibm были бы хорошей отправной точкой, чтобы узнать больше об этих применениях.

FMA также широко используется в сокращении аргументов в процедурах стиля математической библиотеки для некоторых типов аргументов;когда кто-то сокращает аргументы, целью вычисления часто является член вида (x - a*b), где (a*b) очень близко равен самому x;в частности, результат часто имеет порядок ошибки округления в члене (a*b), если он вычисляется без FMA.Я считаю, что Мюллер также написал об этом в своей книге.

5 голосов
/ 28 августа 2010

Единственное, что я до сих пор нашел, это "безошибочные преобразования".Для любых чисел с плавающей запятой ошибки от a+b, a-b и a*b также являются числами с плавающей запятой (в режиме округления до ближайшего, при условии отсутствия переполнения / недостаточного заполнения и т. Д.).

Добавление (и, очевидно, вычитание) ошибку легко вычислить;если abs(a) >= abs(b), ошибка точно равна b-((a+b)-a) (2 флопа или 4-5, если мы не знаем, что больше).Ошибка умножения тривиальна для вычисления с fma - это просто fma(a,b,-a*b).Без fma это 16 флопов довольно неприятного кода.А полностью универсальная эмуляция правильно округленного fma еще медленнее, чем это.

Дополнительные 16 флопов отслеживания ошибок на флоп реальных вычислений - это огромное излишество, но с 1-5 дружественными конвейеру флопами это довольноразумно и для многих алгоритмов, основанных на этих 50% -200% накладных расходов на отслеживание ошибок и компенсацию, приводит к таким малым ошибкам, как если бы все вычисления выполнялись с удвоенным числом битов, которое они избегали, во многих случаях избегая некорректных условий.

Интересно, что fma никогда не используется в этих алгоритмах для вычисления результатов, просто для поиска ошибок, потому что обнаружение ошибки fma является медленным, поскольку ошибка поиска умножения была без fma.

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

2 голосов
/ 28 августа 2010

Некоторые примеры: продукты Vector dot. Преобразования Фурье. Цифровая обработка сигналов. Многочлены. Все виды вещей.

Это вопрос оптимизации и эксплуатации оборудования больше всего на свете. Сумма продуктов является очень распространенным требованием в численных методах, и этот способ позволяет вам дать явную инструкцию компилятору о том, как сделать что-то быстро и, возможно, с большей точностью. Если я не ошибаюсь, компилятор может заменить a = b * c + d инструкцией FMA, но он также не может этого делать. (если стандарт не требует округления, но реальные компиляторы обычно незначительно нарушают стандарты).

2 голосов
/ 28 августа 2010

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

1 голос
/ 16 июля 2014

В статье Википедии для FMA было довольно хорошо объяснено, что алгоритмы, имеющие отношение к накоплению продуктов , получают наибольшую выгоду от использования FMA:

A fast FMA can speed up and improve the accuracy of 
many computations that involve the accumulation of products:

 * Dot product
 * Matrix multiplication
 * Polynomial evaluation (e.g., with Horner's rule)
 * Newton's method for evaluating functions.
1 голос
/ 28 августа 2010

От макушки головы - умножение матриц, правило Ньютона, полиномиальная оценка, численные методы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...