stringtranslate.com

Операция умножения-накопления

В вычислительной технике , особенно в цифровой обработке сигналов , операция умножения с накоплением ( MAC ) или умножения с добавлением ( MAD ) является обычным шагом, который вычисляет произведение двух чисел и добавляет это произведение к аккумулятору . Аппаратный блок, который выполняет эту операцию, называется умножителем-аккумулятором ( блок MAC ); сама операция также часто называется операцией MAC или MAD. Операция MAC изменяет аккумулятор a :

При работе с числами с плавающей точкой это может быть выполнено с двумя округлениями (типично для многих DSP ) или с одним округлением. При выполнении с одним округлением это называется слитым умножением-сложением ( FMA ) или слитым умножением-накоплением ( FMAC ).

Современные компьютеры могут содержать выделенный MAC, состоящий из умножителя, реализованного в комбинационной логике, за которым следуют сумматор и регистр-аккумулятор, который хранит результат. Выход регистра подается обратно на один вход сумматора, так что на каждом такте выход умножителя добавляется к регистру. Комбинационные умножители требуют большого объема логики, но могут вычислять произведение гораздо быстрее, чем метод сдвига и сложения, типичный для более ранних компьютеров. Перси Ладгейт был первым, кто задумал MAC в своей Аналитической машине 1909 года [1] и первым, кто использовал MAC для деления (используя умножение, затравленное обратным числом, через сходящийся ряд (1+ x ) −1 ). Первыми современными процессорами, которые были оснащены блоками MAC, были цифровые сигнальные процессоры , но эта техника теперь также распространена в процессорах общего назначения. [2] [3] [4] [5]

В арифметике с плавающей точкой

При выполнении с целыми числами операция обычно точна (вычисляется по модулю некоторой степени двойки ). Однако числа с плавающей точкой имеют только определенную математическую точность . То есть цифровая арифметика с плавающей точкой, как правило, не является ассоциативной или дистрибутивной . (См. Арифметика с плавающей точкой § Проблемы точности .) Поэтому для результата имеет значение, выполняется ли умножение-сложение с двумя округлениями или за одну операцию с одним округлением (объединенное умножение-сложение). IEEE 754-2008 указывает, что оно должно выполняться с одним округлением, что дает более точный результат. [6]

Слитое умножение-сложение

Совмещенное умножение-сложение ( FMA или fmadd ) [7] — это операция умножения-сложения с плавающей точкой, выполняемая за один шаг ( связанная операция ) с одним округлением. То есть, там, где несвязанное умножение-сложение вычислило бы произведение b × c , округлило бы его до N значащих бит, добавило бы результат к a и округлило бы обратно до N значащих бит, совмещенное умножение-сложение вычислило бы все выражение a + ( b × c ) с полной точностью, прежде чем округлить окончательный результат до N значащих бит.

Быстрый FMA может ускорить и повысить точность многих вычислений, включающих накопление произведений:

Обычно можно положиться на объединенное умножение-сложение, чтобы получить более точные результаты. Однако Уильям Кахан указал, что оно может вызывать проблемы, если используется необдуманно. [8] Если x 2y 2 оценивается как (( x × x ) − y × y ) (следуя предложенной Кэханом нотации, в которой избыточные скобки указывают компилятору сначала округлить член ( x × x ) ) с использованием объединенного умножения-сложения, то результат может быть отрицательным, даже когда x = y из-за того, что первое умножение отбрасывает биты с низкой значимостью. Это может привести к ошибке, если, например, затем вычисляется квадратный корень результата.

При реализации внутри микропроцессора FMA может быть быстрее, чем операция умножения с последующим сложением. Однако стандартные промышленные реализации, основанные на оригинальной конструкции IBM RS/6000, требуют 2 N -битного сумматора для правильного вычисления суммы. [9]

Еще одним преимуществом включения этой инструкции является то, что она обеспечивает эффективную программную реализацию операций деления (см. алгоритм деления ) и извлечения квадратного корня (см. методы вычисления квадратных корней ), тем самым устраняя необходимость в выделенном оборудовании для этих операций. [10]

Инструкция по скалярному произведению

Некоторые машины объединяют несколько объединенных операций умножения и сложения в один шаг, например, выполняя четырехэлементное скалярное произведение на двух 128-битных регистрах SIMDa0×b0 + a1×b1 + a2×b2 + a3×b3 с производительностью в один цикл.

Поддерживать

Операция FMA включена в IEEE 754-2008 .

Инструкция VAX корпорации Digital Equipment Corporation (DEC) используется для оценки полиномов с помощью правила Хорнера , используя последовательность шагов умножения и сложения. Описания инструкций не уточняют, выполняются ли умножение и сложение с использованием одного шага FMA. [11] Эта инструкция была частью набора инструкций VAX с момента ее первоначальной реализации 11/780 в 1977 году.POLY

Стандарт языка программирования C 1999 года поддерживает операцию FMA через стандартную библиотечную функцию математики и автоматическое преобразование умножения с последующим сложением (сокращение выражений с плавающей точкой), которое может быть явно включено или отключено с помощью стандартных прагм ( ). Компиляторы GCC и Clang C выполняют такие преобразования по умолчанию для архитектур процессоров, которые поддерживают инструкции FMA. С GCC, который не поддерживает вышеупомянутую прагму, [12] это может глобально контролироваться параметром командной строки. [13]fma()#pragma STDC FP_CONTRACT-ffp-contract

Объединенная операция умножения-сложения была введена как «объединенная операция умножения-сложения» в процессоре IBM POWER1 (1990) [14] , но с тех пор была добавлена ​​во множество других процессоров:

Смотрите также

Ссылки

  1. ^ "Осуществимость аналитической машины Ладгейта". Архивировано из оригинала 2019-08-07 . Получено 2020-08-30 .
  2. ^ Ляхов, Павел; Валуева, Мария; Валуев, Георгий; Нагорнов, Николай (январь 2020 г.). «Метод повышения производительности цифрового фильтра на основе усеченных умножительно-накопительных блоков». Прикладные науки . 10 (24): 9052. doi : 10.3390/app10249052 .
  3. ^ Tung Thanh Hoang; Sjalander, M.; Larsson-Edefors, P. (май 2009 г.). "Устройство умножения-накопления с двойной пропускной способностью для усовершенствований процессоров FlexCore". 2009 IEEE International Symposium on Parallel & Distributed Processing . стр. 1–7. doi :10.1109/IPDPS.2009.5161212. ISBN 978-1-4244-3751-1. S2CID  14535090.
  4. ^ Кан, Чонсон; Ким, Тэван (2020-03-01). «PV-MAC: структура блока умножения и накопления, использующая изменчивость точности в сверточных нейронных сетях на устройстве». Интеграция . 71 : 76–85. doi : 10.1016/j.vlsi.2019.11.003. ISSN  0167-9260. S2CID  211264132.
  5. ^ "mad - ps". 20 ноября 2019 г. Получено 14 августа 2021 г.
  6. ^ Уайтхед, Натан; Фит-Флореа, Алекс (2011). «Точность и производительность: плавающая точка и соответствие IEEE 754 для графических процессоров NVIDIA» (PDF) . nvidia . Получено 31 августа 2013 г. .
  7. ^ "fmadd instrs". IBM .
  8. ^ Кахан, Уильям (31.05.1996). «Стандарт IEEE 754 для двоичной арифметики с плавающей точкой».
  9. ^ Quinnell, Eric (май 2007). Архитектуры с плавающей точкой Fused Multiply–Add (PDF) (диссертация) . Получено 28.03.2011 .
  10. ^ Маркштейн, Питер (ноябрь 2004 г.). Программное разделение и квадратный корень с использованием алгоритмов Гольдшмидта (PDF) . 6-я конференция по действительным числам и компьютерам. CiteSeerX 10.1.1.85.9648 . 
  11. ^ "VAX инструкция недели: POLY". Архивировано из оригинала 2020-02-13.
  12. ^ "Ошибка 20785 - Pragma STDC * (C99 FP) не реализована". gcc.gnu.org . Получено 2022-02-02 .
  13. ^ "Оптимизация параметров (использование коллекции компиляторов GNU (GCC))". gcc.gnu.org . Получено 2022-02-02 .
  14. ^ Монтойе, РК; Хокенек, Э.; Раньон, СЛ (январь 1990 г.). «Проектирование блока выполнения операций с плавающей точкой IBM RISC System/6000». IBM Journal of Research and Development . 34 (1): 59–70. doi :10.1147/rd.341.0059.Значок закрытого доступа
  15. ^ «Godson-3 эмулирует x86: новый китайский процессор, совместимый с MIPS, имеет расширения для трансляции x86».
  16. ^ Холлингсворт, Брент (октябрь 2012 г.). «Новые инструкции «Бульдозер» и «Пайледрайвер». AMD Developer Central.
  17. ^ "Intel добавляет 22-нм восьмиядерный 'Haswell' в дорожную карту ЦП". The Register . Архивировано из оригинала 2012-02-17 . Получено 2008-08-19 .
  18. ^ "Руководство по программированию микроконтроллеров STM32 Cortex-M33" (PDF) . ST . Получено 2024-05-06 .