В вычислениях , особенно в цифровой обработке сигналов , операция умножения-накопления является обычным шагом, на котором вычисляется произведение двух чисел и складывается это произведение в сумматор . Аппаратный блок, который выполняет операцию, известен как умножитель-накопитель ( MAC , или блок MAC ); сама операция также часто называется операцией MAC или MAC. Операция MAC изменяет аккумулятор a :
Когда это делается с числами с плавающей запятой , это может быть выполнено с двумя округлениями (типично для многих DSP ) или с одним округлением. Когда выполняется с одним округлением, это называется объединенным умножением-сложением ( FMA ) или объединенным умножением-накоплением ( FMAC ).
Современные компьютеры могут содержать выделенный MAC, состоящий из умножителя, реализованного в комбинационной логике, за которым следует сумматор и регистр накопителя, в котором хранится результат. Выходной сигнал регистра возвращается на один вход сумматора, так что в каждом тактовом цикле выход умножителя добавляется к регистру. Комбинационные множители требуют большого количества логики, но могут вычислить произведение намного быстрее, чем метод сдвига и сложения, типичный для более ранних компьютеров. Перси Ладгейт был первым, кто задумал MAC в своей Аналитической машине 1909 года [1] и первым использовал MAC для деления (с использованием умножения с засеянным на обратное через сходящийся ряд (1+ x ) -1 ). Первыми современными процессорами, оснащенными блоками MAC, были цифровые сигнальные процессоры , но теперь этот метод также широко используется в процессорах общего назначения. [2] [3] [4]
В арифметике с плавающей запятой
Когда выполняется с целыми числами , операция обычно точная (вычисляется по модулю некоторой степени двойки ). Однако числа с плавающей запятой обладают лишь определенной математической точностью . То есть цифровая арифметика с плавающей запятой обычно не является ассоциативной или распределительной . (См. Плавающая точка § Проблемы точности .) Следовательно, для результата имеет значение, выполняется ли умножение-сложение с двумя округлениями или с одной операцией с одним округлением (объединенное умножение-сложение). IEEE 754-2008 указывает, что это должно выполняться с одним округлением, что дает более точный результат. [5]
Слитное умножение – сложение
Слиты умножения-сложения ( ФМА или fmadd ) [6] является плавающей точкой умножения-сложения операция , выполняемая на одном этапе, с одним округлением. То есть, если несвязанное умножение – сложение будет вычислять произведение b × c , округлить его до N значащих битов, добавить результат к a и округлить обратно до N значащих битов, объединенное умножение – сложение вычислит все выражение a + ( b × c ) до полной точности перед округлением конечного результата до N значащих битов.
Быстрая FMA может ускорить и повысить точность многих вычислений, связанных с накоплением продуктов:
- Скалярное произведение
- Умножение матриц
- Полиномиальная оценка (например, с правилом Хорнера )
- Метод Ньютона для вычисления функций (по обратной функции)
- Свертки и искусственные нейронные сети
- Умножение в арифметике двойное-двойное
Обычно для получения более точных результатов можно положиться на объединенное умножение – сложение. Однако Уильям Кахан указал, что при бездумном использовании он может вызвать проблемы. [7] Если x 2 - y 2 оценивается как (( x × x ) - y × y ) (следуя предложенной Каханом записи, в которой избыточные круглые скобки предписывают компилятору сначала округлить член ( x × x ) ), используя объединенное умножение– сложить, то результат может быть отрицательным, даже если x = y из-за того, что первое умножение отбрасывает биты с низким значением. Это может привести к ошибке, если, например, вычисляется квадратный корень из результата.
При реализации внутри микропроцессора FMA может быть быстрее, чем операция умножения, за которой следует сложение. Однако стандартные промышленные реализации, основанные на оригинальной конструкции IBM RS / 6000, требуют 2 N- битного сумматора для правильного вычисления суммы. [8]
Еще одно преимущество включения этой инструкции состоит в том, что она обеспечивает эффективную программную реализацию операций деления (см. Алгоритм деления ) и извлечения квадратного корня (см. Методы вычисления квадратного корня ), что устраняет необходимость в специализированном оборудовании для этих операций. [9]
Инструкция по продукту Dot
Некоторые машины объединяют несколько слитных операций умножения и сложения в один шаг, например, выполнение скалярного произведения из четырех элементов на двух 128-битных регистрах SIMDa0×b0 + a1×b1 + a2×b2 + a3×b3
с пропускной способностью за один цикл.
Служба поддержки
Операция FMA включена в IEEE 754-2008 .
Digital Equipment Corporation (DEC) VAX «s POLY
инструкция используется для вычисления полиномов с правилом Горнера , используя последовательность умножения и добавить шаги. В описаниях инструкций не указывается, выполняются ли умножение и сложение с использованием одного шага FMA. [10] Эта инструкция была частью набора инструкций VAX с момента ее первоначальной реализации 11/780 в 1977 году.
Стандарт тысячи девятьсот девяносто девять из языка программирования Си поддерживает операцию FMA через fma()
стандартную функцию математической библиотеки, и стандартные псевдокомментарии ( #pragma STDC FP_CONTRACT
) , управляющие оптимизации на основе FMA.
Объединенная операция умножения-сложения была введена как «объединенная операция умножения-сложения» в процессоре IBM POWER1 (1990) [11], но с тех пор была добавлена во многие другие процессоры:
- HP PA-8000 (1996) и выше
- Hitachi SuperH SH-4 (1998 г.)
- SCE - Toshiba Emotion Engine (1999)
- Intel Itanium (2001 г.)
- Ячейка ИППП (2006)
- Fujitsu SPARC64 VI (2007 г.) и выше
- ( Совместимость с MIPS ) Loongson -2F (2008) [12]
- Эльбрус-8СВ (2018)
- процессоры x86 с набором инструкций FMA3 и / или FMA4
- AMD Bulldozer (2011, только FMA4)
- AMD Piledriver (2012, FMA3 и FMA4) [13]
- AMD Steamroller (2014)
- Экскаватор AMD (2015)
- AMD Zen (2017, только FMA3)
- Intel Haswell (2013, только FMA3) [14]
- Intel Skylake (2015, только FMA3)
- Процессоры ARM с VFPv4 и / или NEONv2:
- ARM Cortex-M4F (2010 г.)
- ARM Cortex-A5 (2012 г.)
- ARM Cortex-A7 (2013 г.)
- ARM Cortex-A15 (2012 г.)
- Qualcomm Krait (2012)
- Apple A6 (2012 г.)
- Все процессоры ARMv8
- Fujitsu A64FX имеет «FMA с четырьмя операндами с префиксной инструкцией».
- IBM z / Architecture (с 1998 г.)
- Графические процессоры и платы GPGPU:
- Графические процессоры Advanced Micro Devices (2009 г.) и новее
- TeraScale 2 "Evergreen" - серия на основе
- Графическое ядро Next на базе
- Графические процессоры NVidia (2010 г.) и новее
- На основе Ферми (2010)
- На основе Кеплера (2012)
- Основанный на Максвелле (2014)
- На основе Паскаля (2016)
- Основанный на Вольте (2017)
- Графические процессоры Intel со времен Sandy Bridge
- Intel MIC (2012 г.)
- ARM Mali T600 Series (2012) и выше
- Графические процессоры Advanced Micro Devices (2009 г.) и новее
- Векторные процессоры:
- NEC SX-Aurora TSUBASA
Рекомендации
- ^ «Возможность аналитической машины Ладгейта» . Архивировано 7 августа 2019 года . Проверено 30 августа 2020 .
- ^ Ляхов, Павел; Валуева Мария; Валуев, Георгий; Нагорнов, Николай (январь 2020 г.). «Метод повышения производительности цифрового фильтра на основе усеченных многократно-накапливаемых единиц» . Прикладные науки . 10 (24): 9052. DOI : 10,3390 / app10249052 .
- ^ Тунг Тхань Хоанг; Sjalander, M .; Ларссон-Эдефорс, П. (май 2009 г.). «Устройство умножения-накопления с двойной пропускной способностью для усовершенствований процессоров FlexCore» . 2009 Международный симпозиум IEEE по параллельной распределенной обработке : 1–7. DOI : 10.1109 / IPDPS.2009.5161212 . ISBN 978-1-4244-3751-1. S2CID 14535090 .
- ^ Канг, Джонгсун; Ким, Тэухан (01.03.2020). «PV-MAC: единичная структура умножения и накопления, использующая изменчивость точности в сверточных нейронных сетях на устройстве» . Интеграция . 71 : 76–85. DOI : 10.1016 / j.vlsi.2019.11.003 . ISSN 0167-9260 .
- ^ Уайтхед, Натан; Фит-Флореа, Алекс (2011). «Точность и производительность: соответствие с плавающей запятой и IEEE 754 для графических процессоров NVIDIA» (PDF) . nvidia . Проверено 31 августа 2013 .
- ^ "fmadd instrs" .
- ^ Кахан, Уильям (1996-05-31). «Стандарт IEEE 754 для двоичной арифметики с плавающей запятой» .
- ^ Куиннелл, Эрик (май 2007 г.). Архитектура умножения с плавающей запятой, объединенная с множителем (PDF) (кандидатская диссертация) . Проверено 28 марта 2011 .
- ^ Маркштейн, Питер (ноябрь 2004 г.). Отделение программного обеспечения и извлечение квадратного корня с использованием алгоритмов Гольдшмидта (PDF) . 6-я конференция по действительным числам и компьютерам. CiteSeerX 10.1.1.85.9648 .
- ^ «Инструкция недели VAX: POLY» . Архивировано из оригинала на 2020-02-13.
- ^ Монтой, РК; Hokenek, E .; Runyon, SL (январь 1990 г.). «Дизайн исполнительного устройства с плавающей запятой IBM RISC System / 6000». Журнал исследований и разработок IBM . 34 (1): 59–70. DOI : 10.1147 / rd.341.0059 .
- ^ «Godson-3 эмулирует x86: новый китайский процессор, совместимый с MIPS, имеет расширения для перевода x86» .
- ^ Холлингсворт, Брент (октябрь 2012 г.). "Новые" Бульдозер "и" Пиледривер "Инструкции" . Центр разработчиков AMD.
- ^ «Intel добавляет 22-нм восьмиъядерный процессор Haswell в план разработки процессоров» . Регистр . Архивировано из оригинала на 2012-03-27 . Проверено 19 августа 2008 .