В вычислениях, особенно при цифровой обработке сигналов, операция умножения-накопления ( MAC) или умножения-сложения ( MAD) является обычным шагом, на котором вычисляется произведение двух чисел и складывается это произведение в сумматор. Аппаратный блок, выполняющий операцию, известен как умножитель-накопитель ( блок MAC); сама операция также часто называется операцией MAC или MAC. Операция MAC изменяет аккумулятор a:
Когда это делается с числами с плавающей запятой, это может быть выполнено с двумя округлениями (типично для многих DSP ) или с одним округлением. Когда выполняется с одним округлением, это называется объединенным умножением-сложением ( FMA) или объединенным умножением-накоплением ( FMAC).
Современные компьютеры могут содержать выделенный MAC, состоящий из умножителя, реализованного в комбинационной логике, за которым следует сумматор и регистр накопителя, в котором хранится результат. Выходной сигнал регистра возвращается на один вход сумматора, так что в каждом тактовом цикле выход умножителя добавляется к регистру. Комбинационные множители требуют большого количества логики, но могут вычислить произведение намного быстрее, чем метод сдвига и сложения, типичный для более ранних компьютеров. Перси Ладгейт был первым, кто задумал MAC в своей Аналитической машине 1909 года, и первым, кто использовал MAC для деления (используя умножение с засеваемым на обратное, через сходящийся ряд (1+ x) -1). Первыми современными процессорами, оснащенными блоками MAC, были цифровые сигнальные процессоры, но теперь этот метод также широко используется в процессорах общего назначения.
Когда выполняется с целыми числами, операция обычно точная (вычисляется по модулю некоторой степени двойки ). Однако числа с плавающей запятой обладают лишь определенной математической точностью. То есть цифровая арифметика с плавающей запятой обычно не является ассоциативной или распределительной. (См. Плавающая точка § Проблемы точности. ) Следовательно, для результата имеет значение, выполняется ли умножение-сложение с двумя округлениями или с одной операцией с одним округлением (объединенное умножение-сложение). IEEE 754-2008 указывает, что это должно выполняться с одним округлением, что дает более точный результат.
Слиты умножения-сложения ( ФМА или fmadd) является плавающей точкой умножения-сложения операция, выполняемая на одном этапе, с одним округлением. То есть, если несвязанное умножение – сложение будет вычислять произведение b × c, округлить его до N значащих битов, добавить результат к a и округлить обратно до N значащих битов, объединенное умножение – сложение вычислит все выражение a + ( b × c) до полной точности перед округлением конечного результата до N значащих битов.
Быстрая FMA может ускорить и повысить точность многих вычислений, связанных с накоплением продуктов:
Обычно для получения более точных результатов можно положиться на объединенное умножение – сложение. Однако Уильям Кахан указал, что при бездумном использовании он может вызвать проблемы. Если x 2 - y 2 оценивается как (( x × x) - y × y) (следуя предложенной Каханом нотации, в которой избыточные круглые скобки предписывают компилятору сначала округлить член ( x × x)) с использованием слитного умножения – сложения, тогда результат может быть отрицательным, даже если x = y из-за того, что первое умножение отбрасывает биты с низкой значимостью. Это может привести к ошибке, если, например, вычисляется квадратный корень из результата.
При реализации внутри микропроцессора FMA может быть быстрее, чем операция умножения, за которой следует сложение. Однако стандартные промышленные реализации, основанные на оригинальной конструкции IBM RS / 6000, требуют 2 N- битного сумматора для правильного вычисления суммы.
Еще одно преимущество включения этой инструкции состоит в том, что она обеспечивает эффективную программную реализацию операций деления (см. Алгоритм деления ) и извлечения квадратного корня (см. Методы вычисления квадратного корня ), что устраняет необходимость в специализированном оборудовании для этих операций.
Некоторые машины объединяют несколько слитных операций умножения и сложения в один шаг, например, выполнение скалярного произведения из четырех элементов на двух 128-битных регистрах SIMD a0×b0 + a1×b1 + a2×b2 + a3×b3
с пропускной способностью за один цикл.
Операция FMA включена в IEEE 754-2008.
Digital Equipment Corporation (DEC) VAX «s POLY
инструкция используется для вычисления полиномов с правилом Горнера, используя последовательность умножения и добавить шаги. В описаниях инструкций не указывается, выполняются ли умножение и сложение с использованием одного шага FMA. Эта инструкция была частью набора инструкций VAX с момента его первоначальной реализации 11/780 в 1977 году.
Стандарт +1999 на языке программирования Си поддерживает операцию FMA через fma()
стандартную функцию математической библиотеки, и стандартные псевдокомментарии ( #pragma STDC FP_CONTRACT
), управляющие оптимизации на основе FMA.
Операция слитного умножения-сложения была введена как «слияние умножения-сложения» в процессоре IBM POWER1 (1990), но с тех пор была добавлена во многие другие процессоры: