Набор инструкций FMA - FMA instruction set

Набор команд FMA является расширением 128- и 256-битных инструкций Streaming SIMD Extensions в наборе команд микропроцессора x86 для выполнения операций слитного умножения-сложения (FMA). Есть два варианта:

инструкции

Инструкции 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

Отрывок из FMA3

Поддерживаемые команды включают

Код операции Операция Код операции Операция
VFM ADD result = + a · b + c VFM ADDSUB result = a · b + c  для i = 1, 3, ...
result = a · b − c  для i = 0, 2, ...
VF N M ДОБАВИТЬ result = − a · b + c
VFM SUB result = + a · b − c VFM SUBADD result = a · b − c  для i = 1, 3, ...
result = a · b + c  для i = 0, 2, ...
VF N M SUB result = − a · b − c
Примечание
  • VF N M ADD является   result = − a · b + c, не   result = − (a · b + c).
  • VF N M SUB генерирует -0 для всех входов, равных нулю.

Явный порядок операндов включен в мнемонику с использованием чисел «132», «213» и «231»:

Постфикс
1
Операция возможный
операнд памяти
перезаписывает
132 a = a · c + b c (фактор) a (другой фактор)
213 a = b · a + c c (слагаемое) a (фактор)
231 a = b · c + a c (фактор) a (слагаемое)

а также формат операнда (упакованный или скалярный) и размер (одинарный или двойной).

Постфикс
2
точность размер Постфикс
2
точность размер
S S Одинокий 00 × 32 бит S D Двойной 0 × 64 бит
P S x 04 × 32 бит P D x 2 × 64 бит
P S y 08 × 32 бит P D y 4 × 64 бит
P S z 16 × 32 бит P D z 8 × 64 бит

Это приводит к

Мнемоника (AT&T) Операнды Операция
VFMADD 132 PD y гмм, гмм, гмм / m256 a = a · c + b
VFMADD 132 PS у
VFMADD 132 PD x хмм, хмм, хмм / м128
VFMADD 132 л.с. x
VFMADD 132 SD хмм, хмм, хмм / м64
VFMADD 132 СС хмм, хмм, хмм / м32
VFMADD 213 PD y гмм, гмм, гмм / m256 a = b · a + c
VFMADD 213 PS у
VFMADD 213 PD x хмм, хмм, хмм / м128
VFMADD 213 PS х
VFMADD 213 SD хмм, хмм, хмм / м64
VFMADD 213 СС хмм, хмм, хмм / м32
VFMADD 231 PD y гмм, гмм, гмм / m256 a = b · c + a
VFMADD 231 PS у
VFMADD 231 PD x хмм, хмм, хмм / м128
VFMADD 231 PS х
VFMADD 231 SD хмм, хмм, хмм / м64
VFMADD 231 СС хмм, хмм, хмм / м32

Набор инструкций FMA4

Процессоры с FMA4

  • AMD
    • Переработчики "тяжелого оборудования"
    • Дзен : Тестирование 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.

Отрывок из FMA4

Мнемоника (AT&T) Операнды Операция
VFMADDPDx хмм, хмм, хмм / м128, хмм / м128 а = б · с + г
VFMADDPDy гмм, гмм, гмм / m256, ymm / m256
VFMADDPSx хмм, хмм, хмм / м128, хмм / м128
VFMADDPSy гмм, гмм, гмм / m256, ymm / m256
VFMADDSD xmm, xmm, xmm / m64, xmm / m64
VFMADDSS хмм, хмм, хмм / м32, хмм / м32

История

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

  • Август 2007: AMD анонсирует набор инструкций SSE5 , который включает инструкции FMA с 3 операндами. Введена новая схема кодирования (DREX), позволяющая инструкциям иметь три операнда.
  • Апрель 2008: Intel объявляет о своих наборах инструкций AVX и FMA, включая инструкции FMA с 4 операндами. При кодировании этих инструкций используется новая схема кодирования 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 и Vishera ; они основаны на архитектуре 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.
  • Yasm поддерживает инструкции FMA3, начиная с версии 0.8.0, и инструкции FMA4, начиная с версии 1.0.0.
  • FASM поддерживает инструкции FMA3 и FMA4.

использованная литература