FMA (англ. Fused Multiply-Add, умножение-сложение с однократным округлением) — это набор опциональных 128- и 256-битных SIMD-инструкций для архитектур x86 и x86-64, предназначенный для выполнения операции умножения-сложения над числами в формате с плавающей запятой.

Существует два варианта расширений, добавляющих инструкции FMA:

Особенности

[править | править код]

У инструкций FMA3 и FMA4 почти идентичная функциональность, но они не являются совместимыми. Обе содержат SIMD-инструкции умножения-сложения для чисел с плавающей точкой. Их поддержка в компиляторах займёт некоторое время.

Проблема совместимости

[править | править код]

Разница между FMA3 и FMA4 заключается в том, сколько различных операндов есть у инструкции — 3 или 4. Операция FMA имеет вид:

Форма с 4 операндами (FMA4) позволяет a, b, c и d находиться в разных регистрах, тогда как форма с 3 операндами (FMA3) требует, чтобы d находился в одном из тех регистров, в которых находится a, b или c. Форма с 3 операндами делает код короче, а также её проще реализовать аппаратно, тогда как форма с 4 операндами обеспечивает большую гибкость программирования.

FMA3

[править | править код]

Процессоры с поддержкой FMA3

[править | править код]

Новые инструкции FMA3

[править | править код]
Инструкция Операнды Операция
VFMADD132PDy, VFMSUB132PDy ymm, ymm, ymm/m256 a = a·c ± b
VFMADD132PSy, VFMSUB132PSy
VFMADD132PDx, VFMSUB132PDx xmm, xmm, xmm/m128
VFMADD132PSx, VFMSUB132PSx
VFMADD132SD, VFMSUB132SD xmm, xmm, xmm/m64
VFMADD132SS, VFMSUB132SS xmm, xmm, xmm/m32
VFMADD213PDy, VFMSUB213PDy ymm, ymm, ymm/m256 a = b·a ± c
VFMADD213PSy, VFMSUB213PSy
VFMADD213PDx, VFMSUB213PDx xmm, xmm, xmm/m128
VFMADD213PSx, VFMSUB213PSx
VFMADD213SD, VFMSUB213SD xmm, xmm, xmm/m64
VFMADD213SS, VFMSUB213SS xmm, xmm, xmm/m32
VFMADD231PDy, VFMSUB231PDy ymm, ymm, ymm/m256 a = b·c ± a
VFMADD231PSy, VFMSUB231PSy
VFMADD231PDx, VFMSUB231PDx xmm, xmm, xmm/m128
VFMADD231PSx, VFMSUB231PSx
VFMADD231SD, VFMSUB231SD xmm, xmm, xmm/m64
VFMADD231SS, VFMSUB231SS xmm, xmm, xmm/m32

Кроме перечисленных в таблице основных инструкций, расширение FMA3 содержит ещё ряд инструкций, относящихся к следующим группам:

FMA4

[править | править код]

Процессоры с поддержкой FMA4

[править | править код]

Новые инструкции FMA4

[править | править код]
Инструкция Операнды Операция
VFMADDPDx xmm, xmm, xmm/m128, xmm/m128 a = b·c + d
VFMADDPDy ymm, ymm, ymm/m256, ymm/m256
VFMADDPSx xmm, xmm, xmm/m128, xmm/m128
VFMADDPSy ymm, ymm, ymm/m256, ymm/m256
VFMADDSD xmm, xmm, xmm/m64, xmm/m64
VFMADDSS xmm, xmm, xmm/m32, xmm/m32

История

[править | править код]

Несовместимость между FMA3 от Intel и FMA4 от AMD вызвана тем, что обе компании изменили свои планы без согласования деталей кодирования друг с другом. AMD изменила планы от FMA3 в сторону FMA4, тогда как Intel — от FMA4 в сторону FMA3, практически единовременно.

Поддержка компиляторами

[править | править код]

Различные компиляторы предлагают различный уровень поддержки FMA.

Поддержка в ассемблерах:

См. также

[править | править код]

Примечания

[править | править код]
  1. Striking a balance. Dave Christie, AMD Developer blogs (7 мая 2009). Дата обращения: 8 мая 2009. (недоступная ссылка)
  2. Maffeo, Robin AMD и the Visual Studio 11 Beta. AMD. Дата обращения: 8 декабря 2013. (недоступная ссылка)
  3. Руководство программиста по архитектуре AMD64. Том 6. 128-битные и 256-битные инструкции XOP, FMA4 и CVT16 (англ.). AMD (1 мая 2009). Дата обращения: 7 декабря 2013. Архивировано 20 мая 2009 года.
  4. Новые инструкции в "Bulldozer" and "Piledriver". Шаг вперёд для разработки высокопроизводительного ПО (англ.). AMD (октябрь 2012). Дата обращения: 7 декабря 2013. Архивировано 7 января 2013 года.
  5. [1] Архивная копия от 14 сентября 2017 на Wayback Machine "But with Zen being a clean-sheet design, there are some instruction set extensions found in Bulldozer processors not found in Zen/znver1. Those no longer present include FMA4 and XOP."
  6. [https://web.archive.org/web/20160304033017/https://sourceware.org/ml/binutils/2015-03/msg00078.html Архивная копия от 4 марта 2016 на Wayback Machine Gopalasubramanian, G - [PATCH] add znver1 processor]
  7. Вышел GCC 4.5. Дата обращения: 7 декабря 2013. Архивировано из оригинала 13 декабря 2013 года.
  8. Встроенные объекты FMA4, добавленные в Visual Studio 2010 с пакетом обновления 1 (SP1). Дата обращения: 7 декабря 2013. Архивировано 16 декабря 2013 года.
  9. Новое в x86 Open64 Compiler Suite v4.5.2. Архивировано 13 ноября 2013 года.

Ссылки

[править | править код]