FMA

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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

  • FMA4 поддерживается процессорами AMD начиная с архитектуры Bulldozer. FMA4 было реализовано ранее FMA3.
  • FMA3 поддерживается процессорами AMD начиная с архитектуры Piledriver и процессорами Intel начиная с архитектуры Haswell.

Особенности[править | править исходный текст]

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

Проблема совместимости[править | править исходный текст]

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

d=a+b\times c

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

FMA3[править | править исходный текст]

Процессоры с поддержкой FMA3[править | править исходный текст]

  • Intel
    • Intel представила аппаратную реализацию FMA3 в процессорах, основанных на архитектуре Haswell в 2013 году.
  • AMD
    • Процессоры AMD получили поддержку FMA3 в архитектуре Piledriver в 2012 году.[1][2].

Новые инструкции FMA3[править | править исходный текст]

Инструкция Операнды Операция
VFMADD132PDy ymm, ymm, ymm/m256 $0 = $0×$2 + $1
VFMADD132PSy
VFMADD132PDx xmm, xmm, xmm/m128
VFMADD132PSx
VFMADD132SD xmm, xmm, xmm/m64
VFMADD132SS xmm, xmm, xmm/m32
VFMADD213PDy ymm, ymm, ymm/m256 $0 = $1×$0 + $2
VFMADD213PSy
VFMADD213PDx xmm, xmm, xmm/m128
VFMADD213PSx
VFMADD213SD xmm, xmm, xmm/m64
VFMADD213SS xmm, xmm, xmm/m32
VFMADD231PDy ymm, ymm, ymm/m256 $0 = $1×$2 + $0
VFMADD231PSy
VFMADD231PDx xmm, xmm, xmm/m128
VFMADD231PSx
VFMADD231SD xmm, xmm, xmm/m64
VFMADD231SS xmm, xmm, xmm/m32

FMA4[править | править исходный текст]

Процессоры с поддержкой FMA4[править | править исходный текст]

  • AMD
    • AMD впервые реализовала поддержку FMA4 в процессорах архитектуры Bulldozer, которые были представлены в октябре 2011.[3], поддержку FMA4 имеет также архитектура Piledriver [4]
  • Intel
    • На 2013 год процессоры Intel не поддерживают FMA4, и неизвестно, будет ли Intel поддерживать FMA4 в будущем.

Новые инструкции FMA4[править | править исходный текст]

Инструкция Операнды Операция
VFMADDPDx xmm, xmm, xmm/m128, xmm/m128 $0 = $1×$2 + $3
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.

  • GCC 4.5.0 поддерживает FMA4 с -mfma4,[5]
  • GCC 4.7.0 также поддерживает FMA3 с -mfma.
  • Microsoft Visual C++ 2010 SP1 поддерживает FMA4 instructions.[6]
  • Microsoft Visual C++ 2012 поддерживает FMA3.
  • PathScale поддерживает FMA4 с -mfma.
  • Open64 5.0 имеет "ограниченную поддержку".
  • Intel compilers поддерживают только FMA3 instructions.
  • NASM получил поддержку FMA3 в версии 2.03 и FMA4 - в версии 2.06.
  • YAsm поддерживает FMA3 и FMA4, начиная с версии 1.1.0.
  • FASM поддерживает и FMA3, и FMA4.

См. также[править | править исходный текст]

Примечания[править | править исходный текст]

Ссылки[править | править исходный текст]


Наборы расширения базовых инструкций процессоров семейства x86
MMX | MMXEXT | SSE | SSE2 | SSE3 | SSSE3 | SSE4 | ATA | 3DNow! | 3DNowExt | SSE5 | AVX | AES | FMA