Interested Article - FMA
- 2020-05-11
- 1
FMA ( англ. Fused Multiply-Add , умножение-сложение с однократным округлением) — это набор опциональных 128- и 256-битных SIMD -инструкций для архитектур x86 и x86-64 , предназначенный для выполнения операции умножения-сложения над числами в формате с плавающей запятой.
Существует два варианта расширений, добавляющих инструкции FMA:
- FMA4 поддерживается процессорами AMD начиная с архитектуры Bulldozer . FMA4 было реализовано раньше FMA3, однако впоследствии AMD отказалась от поддержки данного расширения. Это стало нецелесообразным, поскольку Intel не стала внедрять в своих процессорах FMA4.
- FMA3 поддерживается процессорами Intel начиная с архитектуры Haswell и процессорами AMD начиная с архитектуры .
Особенности
У инструкций 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, 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 содержит ещё ряд инструкций, относящихся к следующим группам:
- VFMADDSUB — умножение и чередующиеся сложение и вычитание (вычитание на чётных позициях, сложение — на нечётных);
- VFMSUBADD — умножение и чередующиеся вычитание и сложение (сложение на чётных позициях, вычитание — на нечётных);
- VFNMADD — умножение, взятое с противоположным знаком, и сложение;
- VFNMSUB — умножение, взятое с противоположным знаком, и вычитание.
FMA4
Процессоры с поддержкой FMA4
-
AMD
- AMD впервые реализовала поддержку FMA4 в процессорах архитектуры Bulldozer, которые были представлены в октябре 2011 , поддержку FMA4 имеет также архитектура Piledriver .
- Начиная с микроархитектуры Zen (2017, бренды Ryzen , EPYC) AMD прекратило поддержку FMA4
-
Intel
- На 2013 год процессоры Intel не поддерживают FMA4, и неизвестно, будет ли Intel поддерживать 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.
- 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.
См. также
Примечания
- . Dave Christie, AMD Developer blogs (7 мая 2009). Дата обращения: 8 мая 2009. (недоступная ссылка)
- Maffeo, Robin . AMD. Дата обращения: 8 декабря 2013. (недоступная ссылка)
- (англ.) . AMD (1 мая 2009). Дата обращения: 7 декабря 2013. 20 мая 2009 года.
- (англ.) . AMD (октябрь 2012). Дата обращения: 7 декабря 2013. 7 января 2013 года.
- от 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."
- от 4 марта 2016 на Wayback Machine Gopalasubramanian, G - [PATCH] add znver1 processor]
- . Дата обращения: 7 декабря 2013. Архивировано из 13 декабря 2013 года.
- . Дата обращения: 7 декабря 2013. 16 декабря 2013 года.
- . 13 ноября 2013 года.
Ссылки
- 2020-05-11
- 1