FMA (, умножение-сложение с однократным округлением) — это набор опциональных 128- и 256-битных SIMD-инструкций для архитектур x86 и x86-64, предназначенный для выполнения операции умножения-сложения над числами в формате с плавающей запятой.
Существует два варианта расширений, добавляющих инструкции FMA: FMA4 поддерживается процессорами AMD начиная с архитектуры Bulldozer. FMA4 было реализовано раньше FMA3, однако впоследствии AMD отказалась от поддержки данного расширения. Это стало нецелесообразным, поскольку Intel не стала внедрять в своих процессорах FMA4. FMA3 поддерживается процессорами Intel начиная с архитектуры Haswell и процессорами AMD начиная с архитектуры Piledriver.
Особенности У инструкций FMA3 и FMA4 почти идентичная функциональность, но они не являются совместимыми. Обе содержат SIMD-инструкции умножения-сложения для чисел с плавающей точкой. Их поддержка в компиляторах займёт некоторое время.
Проблема совместимости Разница между FMA3 и FMA4 заключается в том, сколько различных операндов есть у инструкции — 3 или 4. Операция FMA имеет вид:
Форма с 4 операндами (FMA4) позволяет a, b, c и d находиться в разных регистрах, тогда как форма с 3 операндами (FMA3) требует, чтобы d находился в одном из тех регистров, в которых находится a, b или c. Форма с 3 операндами делает код короче, а также её проще реализовать аппаратно, тогда как форма с 4 операндами обеспечивает большую гибкость программирования.
FMA3
Процессоры с поддержкой FMA3 Intel Intel представила аппаратную реализацию FMA3 в процессорах, основанных на архитектуре Haswell в 2013 году. AMD Процессоры AMD получили поддержку FMA3 в архитектурах Bulldozer и Piledriver в 2012 году..
Новые инструкции FMA3 Инструкция Операнды ОперацияVFMADD132PDy, VFMSUB132PDyymm, ymm, ymm/m256a = a·c ± bVFMADD132PSy, VFMSUB132PSyVFMADD132PDx, VFMSUB132PDxxmm, xmm, xmm/m128VFMADD132PSx, VFMSUB132PSxVFMADD132SD, VFMSUB132SDxmm, xmm, xmm/m64VFMADD132SS, VFMSUB132SSxmm, xmm, xmm/m32VFMADD213PDy, VFMSUB213PDyymm, ymm, ymm/m256a = b·a ± cVFMADD213PSy, VFMSUB213PSyVFMADD213PDx, VFMSUB213PDxxmm, xmm, xmm/m128VFMADD213PSx, VFMSUB213PSxVFMADD213SD, VFMSUB213SDxmm, xmm, xmm/m64VFMADD213SS, VFMSUB213SSxmm, xmm, xmm/m32VFMADD231PDy, VFMSUB231PDyymm, ymm, ymm/m256a = b·c ± aVFMADD231PSy, VFMSUB231PSyVFMADD231PDx, VFMSUB231PDxxmm, xmm, xmm/m128VFMADD231PSx, VFMSUB231PSxVFMADD231SD, VFMSUB231SDxmm, xmm, xmm/m64VFMADD231SS, VFMSUB231SSxmm, xmm, xmm/m32
Кроме перечисленных в таблице основных инструкций, расширение FMA3 содержит ещё ряд инструкций, относящихся к следующим группам: VFMADDSUB — умножение и чередующиеся сложение и вычитание (вычитание на чётных позициях, сложение — на нечётных); VFMSUBADD — умножение и чередующиеся вычитание и сложение (сложение на чётных позициях, вычитание — на нечётных); VFNMADD — умножение, взятое с противоположным знаком, и сложение; VFNMSUB — умножение, взятое с противоположным знаком, и вычитание.
FMA4
Процессоры с поддержкой FMA4 AMD AMD впервые реализовала поддержку FMA4 в процессорах архитектуры Bulldozer, которые были представлены в октябре 2011, поддержку FMA4 имеет также архитектура Piledriver. Начиная с микроархитектуры Zen (2017, бренды Ryzen, EPYC) AMD прекратило поддержку FMA4 "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." Intel На 2013 год процессоры Intel не поддерживают FMA4, и неизвестно, будет ли Intel поддерживать FMA4 в будущем.
Новые инструкции FMA4 Инструкция Операнды ОперацияVFMADDPDxxmm, xmm, xmm/m128, xmm/m128 a = b·c + dVFMADDPDyymm, ymm, ymm/m256, ymm/m256VFMADDPSxxmm, xmm, xmm/m128, xmm/m128VFMADDPSyymm, ymm, ymm/m256, ymm/m256VFMADDSDxmm, xmm, xmm/m64, xmm/m64VFMADDSSxmm, xmm, xmm/m32, xmm/m32
История Несовместимость между FMA3 от Intel и FMA4 от AMD вызвана тем, что обе компании изменили свои планы без согласования деталей кодирования друг с другом. AMD изменила планы от FMA3 в сторону FMA4, тогда как Intel — от FMA4 в сторону FMA3, практически единовременно.
Поддержка компиляторами Различные компиляторы предлагают различный уровень поддержки FMA. GCC 4.5.0 поддерживает FMA4 с -mfma4, GCC 4.7.0 также поддерживает FMA3 с -mfma. Microsoft Visual C++ 2010 SP1 поддерживает FMA4. Microsoft Visual C++ 2012 поддерживает FMA3. PathScale поддерживает FMA4 с -mfma. Open64 5.0 имеет «ограниченную поддержку». AMD x86 Open64 Compiler Suite поддерживает FMA3 и FMA4, начиная с версии 4.5.2. Компиляторы Intel поддерживают только FMA3.
Поддержка в ассемблерах: NASM получил поддержку FMA3 в версии 2.03 и FMA4 — в версии 2.06. YAsm поддерживает FMA3 и FMA4, начиная с версии 1.1.0. FASM поддерживает и FMA3, и FMA4.
См. также Умножение-сложение
Примечания
Ссылки
Категория:Инструкции x86 Категория:Расширения архитектуры x86