Расширение набора инструкций X86, разработанное Intel
Набор команд FMA является расширением 128- и 256-битных команд Streaming SIMD Extensions в x86 микропроцессор набор команд для выполнения операций плавного умножения-сложения (FMA). Есть два варианта:
- FMA4 поддерживается в процессорах AMD, начиная с архитектуры Bulldozer. FMA4 выполнялась аппаратно до FMA3. Поддержка FMA4 была удалена, поскольку Zen 1.
- FMA3 поддерживается в процессорах AMD, начиная с архитектуры Piledriver и Intel, начиная с процессоров Haswell и процессоры Broadwell с 2014 года.
Содержание
- 1 Инструкции
- 2 Набор команд FMA3
- 2.1 ЦП с FMA3
- 2.2 Выдержка из FMA3
- 3 Инструкция FMA4 установить
- 3.1 CPU с FMA4
- 3.2 Выдержка из FMA4
- 4 История
- 5 Поддержка компилятора и ассемблера
- 6 Ссылки
Инструкции
Инструкции FMA3 и FMA4 почти идентичны функциональность, но не совместимы. Оба содержат инструкции объединенного умножения-сложения (FMA) для операций с плавающей запятой скаляр и SIMD, но инструкции FMA3 имеют три операнда, а FMA4 - четыре. Операция FMA имеет вид d = round (a · b + c), где функция round выполняет округление, чтобы результат уместился в регистре назначения, если есть слишком много значащих битов, чтобы поместиться в пункт назначения.
Форма с четырьмя операндами (FMA4) позволяет a, b, c и d быть четырьмя разными регистрами, тогда как форма с тремя операндами (FMA3) требует, чтобы d был тем же регистром, что и a, b или c. Форма с тремя операндами делает код короче, а аппаратную реализацию немного проще, а форма с четырьмя операндами обеспечивает большую гибкость программирования.
См. набор инструкций XOP для более подробного обсуждения проблем совместимости между Intel и AMD.
Набор команд FMA3
ЦП с FMA3
- AMD
- Piledriver (2012) и более новыми микроархитектурами
- APU 2-го поколения, "Trinity "(32 нм), 15 мая 2012 г.
- " Bulldozer "2-го поколения (bdver2) с ядрами Piledriver, 23 октября 2012 г.
- Intel
- Все аппаратные реализации Haswell (2013 г.) и более новые
Выдержка из FMA3
Поддерживаемые команды включают VFMADD, VFMADDSUB, VFMSUBADD, VFMSUB, VFNMADD, VFNMSUB. Явный порядок операндов включен в мнемонику с использованием чисел «132», «213» и «231», а также формата операнда (упакованный или скалярный) и размера (одинарный или двойной).
Мнемоника (ATT) | Операнды | Операция |
---|
VFMADD132PDy | ymm, ymm, ymm / m256 | a = a · c + b |
VFMADD132PSy |
VFMADD132PDx | xmm, xmm, xmm / m128 |
VFMADD132PSx |
VFMADD132SD | xmm, xmm, xmm / m10MSS |
VFM |
| xmm, xmm, xmm / m32 |
VFMADD213PDy | ymm, ymm, ymm / m256 | a = b · a + c |
VFMADD213PSy |
VFMADD213PDx | xmm, xmm, xmm / m128 |
VFMADD213PSx |
VFMADD213SD | xmm, xmm, xmm / m64 |
VFMADD213SS | xmm, xmm, xmm / m32 |
VFMADD231PDy | ymm, ymm, ymm / m256 | a = b · c + a |
VFMADD231PSy |
VFMADD231PDx | xmm, xmm, xmm / m128 |
VFMADD231PSx |
VFMADD231SD | xmm, xmm, xmm / m64 |
VFMADD231SS | xmm, xmm, xmm / m32 |
набор инструкций FMA4
Процессоры с процессорами FMA4
- AMD
- «Heavy Equipment»
- Zen : тестирование WikiChip показывает, что FMA4 все еще работает (в условиях тестов), несмотря на то, что официально не поддерживается и даже не сообщается CPUID. Это также подтвердил Агнер. Но другие тесты дали неверные результаты. Официальный веб-сайт AMD FMA4 Примечание о поддержке ЦП ZEN = AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G.
- Intel
- Это не уверены, будут ли будущие процессоры Intel поддерживать FMA4, из-за объявленного Intel перехода на FMA3.
Выдержка из FMA4
Мнемоника (ATT) | Операнды | Операция |
---|
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 |
История
Несовместимость между Intel FMA3 и AMD FMA4 возникает из-за того, что обе компании меняют планы, не согласовывая детали кодирования друг с другом. AMD изменила свои планы с FMA3 на FMA4, в то время как Intel изменила свои планы с FMA4 на FMA3 почти одновременно. Историю можно резюмировать следующим образом:
- август 2007 г.: AMD объявляет набор инструкций SSE5, который включает в себя инструкции FMA с 3 операндами. Введена новая схема кодирования (DREX), позволяющая инструкциям иметь три операнда.
- Апрель 2008 г.: Intel объявляет о своих наборах инструкций AVX и FMA, включая 4- инструкции операнда FMA. При кодировании этих инструкций используется новая схема кодирования VEX, которая более гибкая, чем схема AMD DREX.
- декабрь 2008 г.: Intel изменяет спецификацию своих инструкций FMA с 4-х операндов на 3 -операционные инструкции. Схема кодирования VEX все еще используется.
- Май 2009 г.: AMD изменяет спецификацию своих инструкций FMA с 3-операндной формы DREX на 4-операндную форму VEX, совместимую со спецификацией Intel от апреля 2008 года, а не с Спецификация Intel, декабрь 2008 г.
- Октябрь 2011 г.: процессор AMD Bulldozer поддерживает FMA4.
- январь 2012 г.: AMD объявляет о поддержке FMA3 в будущих процессорах с кодовым названием Trinity и Вишера ; они основаны на архитектуре Piledriver.
- Май 2012 г.: процессор AMD Piledriver поддерживает как FMA3, так и FMA4.
- июнь 2013 г.: процессор Intel Haswell поддерживает FMA3.
- Февраль 2017 г. Первое поколение процессоров AMD Ryzen официально поддерживает FMA3, но не FMA4 согласно инструкции CPUID. Возникла путаница относительно того, был ли FMA4 реализован на этом процессоре или нет из-за ошибок в начальном патче к пакету GNU Binutils, который с тех пор был исправлен. Хотя инструкции FMA4, по-видимому, работают согласно некоторым тестам, они также могут давать неверные результаты. Кроме того, начальные процессоры Ryzen могли выйти из строя из-за определенной последовательности инструкций FMA3. С тех пор она была решена с помощью обновленного микрокода ЦП.
Поддержка компилятора и ассемблера
Различные компиляторы обеспечивают разные уровни поддержки FMA:
- GCC поддерживает FMA4 с -mfma4, начиная с версии 4.5. 0 и FMA3 с -mfma, начиная с версии 4.7.0.
- Microsoft Visual C ++ 2010 SP1 поддерживает инструкции FMA4.
- Microsoft Visual C ++ 2012 поддерживает инструкции FMA3 (если процессор также поддерживает расширение набора инструкций AVX2
- Microsoft Visual C ++ начиная с VC 2013
- PathScale поддерживает FMA4 с -mfma.
- LLVM 3.1 добавляет поддержку FMA4 вместе с предварительной поддержкой FMA3.
- Open64 5.0 добавляет «ограниченную поддержку».
- Компиляторы Intel поддерживают только инструкции FMA3.
- NASM поддерживает инструкции FMA3 с версии 2.03 и инструкции FMA4 с 2.06.
- поддерживает инструкции FMA3 начиная с версии 0.8.0 и инструкций FMA4 с версии 1.0.0.
- FASM поддерживает инструкции как FMA3, так и FMA4.
Ссылки