Подтвердить что ты не робот

Какие алгоритмы приносят наибольшую выгоду из добавленного многократного добавления?

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

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

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

4b9b3361

Ответ 1

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

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

Пример taw дает более широкое применение, чем просто отслеживание границ ошибок. Он позволяет представлять произведение двух чисел с плавающей запятой в виде суммы двух чисел с плавающей запятой без какой-либо ошибки округления; это очень полезно при реализации правильно-округленных функций библиотеки с плавающей запятой. Книга Жан-Мишеля Мюллера или документы на crlibm были бы хорошими отправными точками, чтобы узнать больше об этих целях.

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

Ответ 2

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

Ошибка сложения (и, очевидно, вычитания) легко вычисляется; if 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.

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Это было довольно хорошо объяснено в статье Википедии для 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 rule)
 * Newton method for evaluating functions.