В Wikibooks есть книга по темам: Сборка X86 / AVX, AVX2, FMA3, FMA4 |
Набор команд FMA является расширением 128- и 256-битных инструкций Streaming SIMD Extensions в наборе команд микропроцессора x86 для выполнения операций слитного умножения-сложения (FMA). [1] Есть два варианта:
- 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]
- ВСУ 2-го поколения, "Тринити" (32-нм) , 15 мая 2012 г.
- "Bulldozer" 2-го поколения (bdver2) с ядрами Piledriver , 23 октября 2012 г.
- Piledriver (2012) и более новые микроархитектуры [2]
- Intel
Отрывок из FMA3 [ править ]
Поддерживаемые команды включают VFMADD, VFMADDSUB, VFMSUBADD, VFMSUB, VFNMADD, VFNMSUB. Явный порядок операндов включен в мнемонику с использованием чисел «132», «213» и «231», а также формата операнда (упакованный или скалярный) и размера (одинарный или двойной).
Мнемоника (AT&T) | Операнды | Операция |
---|---|---|
VFMADD132PDy | гмм, гмм, гмм / m256 | а = а · с + Ь |
VFMADD132PSy | ||
VFMADD132PDx | хмм, хмм, хмм / м128 | |
VFMADD132PSx | ||
VFMADD132SD | хмм, хмм, хмм / м64 | |
VFMADD132SS | хмм, хмм, хмм / м32 | |
VFMADD213PDy | гмм, гмм, гмм / m256 | а = б · а + с |
VFMADD213PSy | ||
VFMADD213PDx | хмм, хмм, хмм / м128 | |
VFMADD213PSx | ||
VFMADD213SD | хмм, хмм, хмм / м64 | |
VFMADD213SS | хмм, хмм, хмм / м32 | |
VFMADD231PDy | гмм, гмм, гмм / m256 | а = б · с + а |
VFMADD231PSy | ||
VFMADD231PDx | хмм, хмм, хмм / м128 | |
VFMADD231PSx | ||
VFMADD231SD | хмм, хмм, хмм / м64 | |
VFMADD231SS | хмм, хмм, хмм / м32 |
Набор инструкций FMA4 [ править ]
Процессоры с FMA4 [ править ]
- AMD
- Переработчики "тяжелого оборудования"
- Процессоры на базе Bulldozer , 12 октября 2011 г. [5]
- Процессоры на базе Piledriver [6]
- Процессоры на базе Steamroller
- Процессоры на базе экскаваторов (включая "v2")
- Дзен : Тестирование WikiChip показывает, что FMA4 все еще работает (в условиях тестов), несмотря на то, что официально не поддерживается и даже не сообщается CPUID. Это также подтвердил Агнер. [7] Но другие тесты дали неверные результаты. [8] Официальный веб-сайт AMD Примечание о поддержке FMA4 ЦП ZEN = AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G. [9] [10] [11]
- Переработчики "тяжелого оборудования"
- Intel
- Неизвестно, будут ли будущие процессоры Intel поддерживать FMA4 из-за объявленного Intel перехода на FMA3.
Отрывок из 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), позволяющая инструкциям иметь три операнда. [12]
- Апрель 2008: Intel объявляет о своих наборах инструкций AVX и FMA, включая инструкции FMA с 4 операндами. При кодировании этих инструкций используется новая схема кодирования VEX [13], которая более гибкая, чем схема AMD DREX.
- Декабрь 2008: Intel изменяет спецификацию своих инструкций FMA с 4-х операндов на 3-операндные. Схема кодирования VEX все еще используется. [14]
- Май 2009 г .: AMD изменяет спецификацию своих инструкций FMA с формы DREX с 3 операндами на форму VEX с 4 операндами, совместимую со спецификацией Intel от апреля 2008 г., а не со спецификацией Intel от декабря 2008 г. [15]
- Октябрь 2011 г .: процессор AMD Bulldozer поддерживает FMA4. [16]
- Январь 2012 г .: AMD объявляет о поддержке FMA3 в будущих процессорах под кодовыми именами Trinity и Vishera ; они основаны на архитектуре Piledriver. [17]
- Май 2012: процессор AMD Piledriver поддерживает как FMA3, так и FMA4. [16]
- Июнь 2013 г .: процессор Intel Haswell поддерживает FMA3. [18]
- Февраль 2017 г. Первое поколение процессоров AMD Ryzen официально поддерживает FMA3, но не FMA4 согласно инструкции CPUID . [19] Была путаница относительно того, была ли реализована FMA4 на этом процессоре из-за ошибок в начальном патче к пакету GNU Binutils , который с тех пор был исправлен. [20] [21] Хотя инструкции FMA4, по-видимому, работают согласно некоторым тестам, они также могут давать неверные результаты. [8] Кроме того, исходные процессоры Ryzen могли выйти из строя из-за определенной последовательности инструкций FMA3. С тех пор это было решено обновленным микрокодом ЦП. [22]
Поддержка компилятора и ассемблера [ править ]
Различные компиляторы предоставляют разные уровни поддержки FMA:
- GCC поддерживает FMA4 с -mfma4 с версии 4.5.0 [23] и FMA3 с -mfma с версии 4.7.0.
- Microsoft Visual C ++ 2010 SP1 поддерживает инструкции FMA4. [24]
- Microsoft Visual C ++ 2012 поддерживает инструкции FMA3 (если процессор также поддерживает расширение набора инструкций AVX2).
- Microsoft Visual C ++ с VC 2013
- PathScale поддерживает FMA4 с -mfma. [25]
- LLVM 3.1 добавляет поддержку FMA4 [26] вместе с предварительной поддержкой FMA3. [27]
- Open64 5.0 добавляет «ограниченную поддержку».
- Компиляторы Intel поддерживают только инструкции FMA3. [23]
- NASM поддерживает инструкции FMA3 с версии 2.03 и инструкции FMA4 с 2.06.
- Yasm поддерживает инструкции FMA3 начиная с версии 0.8.0 и инструкции FMA4 начиная с версии 1.0.0.
- FASM поддерживает инструкции FMA3 и FMA4.
Ссылки [ править ]
- ^ «FMA3 и FMA4 не являются наборами инструкций, это отдельные инструкции - объединенное умножение и сложение. Они могут быть весьма полезны в зависимости от того, как Intel и AMD реализуют их» Вольтманн, Джордж (Prime95). «Intel AVX и GIMPS» . mersenneforum.org/index.php . Большой Интернет-проект Mersenne Prime Search (GIMPS) . Проверено 27 июля 2011 года .
- ^ Maffeo, Робин (1 марта 2012). «AMD и Visual Studio 11 Beta» . AMD. Архивировано из оригинала на 9 ноября 2013 года . Проверено 7 ноября 2018 .
- ^ https://valid.x86.fr/cache/screenshot/y5z6gq.png
- ^ http://valid.x86.fr/cache/screenshot/kr2mlx.png
- ^ "Руководство программиста архитектуры AMD64, том 6: 128-битные и 256-битные инструкции XOP, FMA4 и CVT16" (PDF) . AMD . 1 мая 2009 г.
- ^ "Новые инструкции" Bulldozer "и" Piledriver "Шаг вперед к разработке высокопроизводительного программного обеспечения" (PDF) . AMD . Октябрь 2012 г.
- ^ http://agner.org/optimize/blog/read.php?i=838
- ^ a b «Обсуждение - у Ryzen есть недокументированная поддержка FMA4» . Проверено 10 мая 2017 .
- ^ "www.amd.com, список поддерживаемых моделей FMA4" .
- ^ "www.amd.com, список поддерживаемых моделей FMA4" .
- ^ "www.amd.com, список поддерживаемых моделей FMA4" .
- ^ "128-битный набор инструкций SSE5" . AMD Developer Central. Архивировано из оригинала на 2008-01-15 . Проверено 28 января 2008 .
- ^ «Справочник по программированию расширенных векторных расширений Intel» (PDF) . Intel . Проверено 5 апреля 2008 . [ постоянная мертвая ссылка ]
- ^ «Справочник по программированию расширенных векторных расширений Intel» . Intel . Проверено 6 мая 2009 .
- ^ "Достижение баланса" . Дэйв Кристи, блоги разработчиков AMD. 6 мая 2009 года в архив с оригинала на 8 июля 2012 года . Проверено 7 ноября 2018 .
- ^ a b «Новые инструкции по работе с бульдозерами и погрузчиками» (PDF) . AMD . Проверено 25 июля 2013 года .
- ^ «Руководство по оптимизации программного обеспечения для процессоров AMD семейства 15h» (PDF) . AMD . Проверено 19 апреля 2012 года .
- ^ «Справочник по программированию расширений набора инструкций архитектуры Intel» (PDF) . Intel . Проверено 25 июля 2013 года .
- ^ «Микроархитектура процессоров Intel, AMD и VIA. Руководство по оптимизации для программистов сборки и производителей компиляторов» (PDF) . Проверено 2 мая 2017 .
- ^ https://sourceware.org/ml/binutils/2015-03/msg00078.html
- ^ https://sourceware.org/ml/binutils/2015-08/msg00039.html
- ^ «Машина AMD Ryzen вылетает из-за последовательности инструкций FMA3» . Проверено 10 сентября 2017 .
- ^ a b Латиф, Лоуренс (14 ноября 2011 г.). «AMD Bulldozer поддерживает GCC только инструкции FMA4 и XOP, Intel по-прежнему отключен» . Спрашивающий .
- ^ «Встроенные функции FMA4 добавлены для Visual Studio 2010 SP1» .
- ^ "EKOPath man doc" . Архивировано из оригинала на 2016-06-23 . Проверено 24 июля 2013 .
- ^ "Примечания к выпуску LLVM 3.1" .
- ^ «Включить определение поддержки AVX и AVX2 через CPUID» . LLVM . 2012-04-26.