Набор инструкций FMA - FMA instruction set
Набор команд FMA является расширением 128- и 256-битных инструкций Streaming SIMD Extensions в наборе команд микропроцессора x86 для выполнения операций слитного умножения-сложения (FMA). Есть два варианта:
- FMA4 поддерживается в процессорах AMD , начиная с архитектуры Bulldozer . FMA4 выполнялась аппаратно до FMA3. Поддержка FMA4 была удалена с Zen 1 .
- FMA3 поддерживается в процессорах AMD, начиная с архитектуры Piledriver, и в процессорах Intel, начиная с процессоров Haswell и Broadwell, с 2014 года.
инструкции
Инструкции 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) и более новые микроархитектуры
- ВСУ 2-го поколения, "Тринити" (32-нм) , 15 мая 2012 г.
- "Bulldozer" 2-го поколения (bdver2) с ядрами Piledriver , 23 октября 2012 г.
-
Piledriver (2012) и более новые микроархитектуры
- Intel
Отрывок из 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 | Одинокий | 32 бит | S D | Двойной | 64 бит |
P S x | 4 × 32 бит | P D x | 2 × 64 бит | ||
P S y | 8 × 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
- Переработчики "тяжелого оборудования"
- Процессоры на базе бульдозеров , 12 октября 2011 г.
- Процессоры на базе Piledriver
- Процессоры на базе Steamroller
- Процессоры на базе экскаваторов (включая "v2")
- Дзен : Тестирование 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.