Набор инструкций FMA
Набор инструкций FMA является расширением 128- и 256-битных инструкций Streaming SIMD Extensions в x86 микропроцессора наборе команд для выполнения операций плавного умножения-сложения (FMA). [1] Есть два варианта:
- FMA4 поддерживается в процессорах AMD , начиная с архитектуры Bulldozer . FMA4 был реализован аппаратно до FMA3. Поддержка FMA4 удалена начиная с Zen 1 . [2]
- FMA3 поддерживается в процессорах AMD, начиная с архитектуры Piledriver , и Intel, начиная с процессоров Haswell и процессоров Broadwell с 2014 года.
Инструкции
[ редактировать ]Инструкции FMA3 и FMA4 имеют практически идентичную функциональность, но несовместимы. Оба содержат объединенного умножения-сложения инструкции (FMA) для скалярных операций с плавающей запятой и операций SIMD , но инструкции FMA3 имеют три операнда, а инструкции FMA4 - четыре. Операция FMA имеет форму d = round( a · b + c ), где функция округления выполняет округление , чтобы позволить результату поместиться в регистр назначения, если имеется слишком много значащих битов, чтобы поместиться в место назначения.
Форма с четырьмя операндами (FMA4) позволяет a , b , c и d быть четырьмя разными регистрами, тогда как форма с тремя операндами (FMA3) требует, чтобы d был тем же регистром, что и a , b или c . Форма с тремя операндами делает код короче и немного упрощает аппаратную реализацию, а форма с четырьмя операндами обеспечивает большую гибкость программирования.
см . в наборе инструкций XOP Дополнительную информацию о проблемах совместимости между Intel и AMD .
Набор инструкций FMA3
[ редактировать ]Процессоры с FMA3
[ редактировать ]- АМД
- Piledriver (2012) и новые микроархитектуры [3]
- 2-го поколения APU , «Trinity» (32 нм), 15 мая 2012 г.
- «Бульдозер» 2-го поколения (бдвер2) с ядрами Piledriver, 23 октября 2012 г.
- Piledriver (2012) и новые микроархитектуры [3]
- Интел
Отрывок из FMA3
[ редактировать ]Поддерживаемые команды включают в себя
Мнемоника | Операция | Мнемоника | Операция |
---|---|---|---|
ВФМ ДОБАВИТЬ | result = + a · b + c |
ВФМ АДДСУБ | result = a · b + c для я = 1, 3, ... result = a · b − c для я = 0, 2, ...
|
ВФ Н М ДОБАВИТЬ | result = − a · b + c
| ||
ВФМ СУБ | result = + a · b − c |
ВФМ СУБАДД | result = a · b − c для я = 1, 3, ... result = a · b + c для я = 0, 2, ...
|
ВФ Н М СУБ | result = − a · b − c
|
- Примечание
- ВФ Н М ДОБАВИТЬ
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 |
точность | размер |
---|---|---|---|---|---|
SS | Одинокий | 32 бит | С Д | Двойной | 64 бит |
П С х | 4 × 32 бит | П Д х | 2 × 64 бит | ||
P S y | 8 × 32 бит | П Д й | 4 × 64 бит | ||
П. С. з | 16 × 32 бит | П Д з | 8 × 64 бит |
Это приводит к
Кодирование | Мнемоника | Операнды | Операция |
---|---|---|---|
VEX.256.66.0F38.W1 98 /r
|
ВФМАДД 132 ПД г | мм, мм, мм/м256 | a = a · c + b
|
VEX.256.66.0F38.W0 98 /r
|
ВФМАДД 132 л.с. | ||
VEX.128.66.0F38.W1 98 /r
|
ВФМАДД 132 ПД х | хмм, хмм, хмм/м128 | |
VEX.128.66.0F38.W0 98 /r
|
ВФМАДД 132 л.с. х | ||
VEX.LIG.66.0F38.W1 99 /r
|
ВФМАДД 132 СД | хмм, хмм, хмм/м64 | |
VEX.LIG.66.0F38.W0 99 /r
|
ВФМАДД 132 СС | хмм, хмм, хмм/м32 | |
VEX.256.66.0F38.W1 A8 /r
|
ВФМАДД 213 ПД г | мм, мм, мм/м256 | a = b · a + c
|
VEX.256.66.0F38.W0 A8 /r
|
ВФМАДД 213 ПС г | ||
VEX.128.66.0F38.W1 A8 /r
|
ВФМАДД 213 ПД х | хмм, хмм, хмм/м128 | |
VEX.128.66.0F38.W0 A8 /r
|
ВФМАДД 213 ПС х | ||
VEX.LIG.66.0F38.W1 A9 /r
|
ВФМАДД 213 СД | хмм, хмм, хмм/м64 | |
VEX.LIG.66.0F38.W0 A9 /r
|
ВФМАДД 213 СС | хмм, хмм, хмм/м32 | |
VEX.256.66.0F38.W1 B8 /r
|
ВФМАДД 231 ПД г | мм, мм, мм/м256 | a = b · c + a
|
VEX.256.66.0F38.W0 B8 /r
|
ВФМАДД 231 ПС г | ||
VEX.128.66.0F38.W1 B8 /r
|
ВФМАДД 231 ПД х | хмм, хмм, хмм/м128 | |
VEX.128.66.0F38.W0 B8 /r
|
ВФМАДД 231 ПС х | ||
VEX.LIG.66.0F38.W1 B9 /r
|
ВФМАДД 231 СД | хмм, хмм, хмм/м64 | |
VEX.LIG.66.0F38.W0 B9 /r
|
ВФМАДД 231 СС | хмм, хмм, хмм/м32 |
Набор инструкций FMA4
[ редактировать ]Процессоры с FMA4
[ редактировать ]- АМД
- Процессоры «Тяжелое оборудование»
- Процессоры на базе бульдозера , 12 октября 2011 г. [6]
- на базе Piledriver Процессоры [7]
- на базе Steamroller Процессоры
- Процессоры на базе экскаватора (включая «v2»)
- Дзен : Тестирование WikiChip показывает, что FMA4 все еще работает (в условиях тестов), несмотря на то, что он официально не поддерживается и даже не сообщается CPUID. Это также подтвердил Агнер Фог. [8] Но другие тесты дали неверные результаты. [9] Официальный веб-сайт AMD Примечание о поддержке FMA4. ЦП ZEN = AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G. [10] [11] [12]
- Процессоры «Тяжелое оборудование»
- Интел
- Intel не выпустила процессоры с поддержкой FMA4.
Отрывок из FMA4
[ редактировать ]Мнемоника (AT&T) | Операнды | Операция |
---|---|---|
ВФМАДПДДкс | хмм, хмм, хмм/м128, хмм/м128 | а = b·c + d |
ВФМАДПДДи | ммм, ммм, мм/м256, мм/м256 | |
ВФМАДДПСx | хмм, хмм, хмм/м128, хмм/м128 | |
ВФМАДДПСы | ммм, ммм, мм/м256, мм/м256 | |
ВФМАДСД | хмм, хмм, хмм/м64, хмм/м64 | |
ВФМАДДСС | хмм, хмм, хмм/м32, хмм/м32 |
История
[ редактировать ]Несовместимость между Intel FMA3 и AMD FMA4 связана с тем, что обе компании изменили планы, не согласовав детали кодирования друг с другом. AMD изменила свои планы с FMA3 на FMA4, а Intel практически одновременно изменила свои планы с FMA4 на FMA3. Историю можно резюмировать следующим образом:
- Август 2007 г.: AMD анонсирует набор инструкций SSE5 , который включает в себя инструкции FMA с тремя операндами. Введена новая схема кодирования (DREX), позволяющая инструкциям иметь три операнда. [13]
- Апрель 2008 г.: Intel объявляет о своих наборах инструкций AVX и FMA, включая инструкции FMA с 4 операндами. Для кодирования этих инструкций используется новая схема кодирования VEX . [14] что более гибко, чем схема AMD DREX.
- Декабрь 2008 г.: Intel меняет спецификацию своих инструкций FMA с инструкций с 4 операндами на инструкции с 3 операндами. Схема кодирования VEX используется до сих пор. [15]
- Май 2009 г.: AMD меняет спецификацию своих инструкций FMA с формы DREX с 3 операндами на форму VEX с 4 операндами, совместимую со спецификацией Intel от апреля 2008 г., а не со спецификацией Intel от декабря 2008 г. [16]
- Октябрь 2011 г.: процессор AMD Bulldozer поддерживает FMA4. [17]
- Январь 2012 г.: AMD объявляет о поддержке FMA3 в будущих процессорах под кодовыми названиями Trinity и Vishera; они основаны на архитектуре Piledriver . [18]
- Май 2012 г.: процессор AMD Piledriver поддерживает FMA3 и FMA4. [17]
- Июнь 2013 г.: процессор Intel Haswell поддерживает FMA3. [19]
- Февраль 2017 г.: первое поколение процессоров AMD Ryzen официально поддерживает FMA3, но не FMA4 согласно инструкции CPUID . [2] Возникла путаница относительно того, реализован ли FMA4 на этом процессоре или нет, из-за ошибок в первоначальном исправлении пакета GNU Binutils , которые с тех пор были исправлены. [20] [21] Одно неподтвержденное сообщение об неправильных результатах [9] вызвало некоторые сомнения, но Mysticial (Александр Йи, разработчик y-cruncher) развенчал их: [22] FMA4 годами работал над побитовыми вычислениями больших чисел в своей системе Zen 1, и в одном отчете на Reddit никогда не проводилось никакого последующего расследования, чтобы исключить ошибки в тестирующем программном обеспечении, прежде чем он был широко повторен. Первоначальные процессоры Ryzen могли выйти из строя из-за определенной последовательности инструкций FMA3, но обновленный микрокод процессора устраняет проблему. [23]
- Июль 2019 г.: процессоры AMD Zen 2 и более поздние версии Ryzen вообще не поддерживают FMA4. [24] Они продолжают поддерживать FMA3. Только Zen 1 и Zen+ имеют неофициальную поддержку FMA4.
Поддержка компилятора и ассемблера
[ редактировать ]Разные компиляторы обеспечивают разные уровни поддержки FMA:
- GCC поддерживает FMA4 с -mfma4, начиная с версии 4.5.0. [25] и FMA3 с -mfma, начиная с версии 4.7.0.
- Microsoft Visual C++ 2010 SP1 поддерживает инструкции FMA4. [26]
- Microsoft Visual C++ 2012 поддерживает инструкции FMA3 (если процессор также поддерживает расширение набора инструкций AVX2).
- Microsoft Visual C++ с версии VC 2013.
- PathScale поддерживает FMA4 с -mfma. [27]
- В LLVM 3.1 добавлена поддержка FMA4, [28] наряду с предварительной поддержкой FMA3. [29]
- В Open64 5.0 добавлена «ограниченная поддержка».
- Компиляторы Intel поддерживают только инструкции FMA3. [25]
- NASM поддерживает инструкции FMA3 с версии 2.03 и инструкции FMA4 с 2.06.
- FASM поддерживает инструкции FMA3 и FMA4.
Ссылки
[ редактировать ]- ^ «FMA3 и FMA4 не являются наборами команд, это отдельные инструкции — объединенное умножение и сложение. Они могут быть весьма полезны в зависимости от того, как Intel и AMD их реализуют» Вольтманн, Джордж (Prime95). «Intel AVX и GIMPS» . mersenneforum.org/index.php . Отличный проект поиска простых чисел Мерсенна в Интернете (GIMPS) . Проверено 27 июля 2011 г.
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Jump up to: а б «Микроархитектура процессоров Intel, AMD и VIA. Руководство по оптимизации для программистов-сборщиков и производителей компиляторов» (PDF) . Проверено 2 мая 2017 г.
- ^ Маффео, Робин (1 марта 2012 г.). «AMD и бета-версия Visual Studio 11» . АМД. Архивировано из оригинала 9 ноября 2013 года . Проверено 7 ноября 2018 г.
- ^ «CPU-Z — идентификатор: y5z6gq» . Проверено 1 мая 2022 г.
- ^ «CPU-Z — идентификатор: kr2mlx» . Проверено 1 мая 2022 г.
- ^ «Руководство программиста по архитектуре AMD64, том 6: 128-битные и 256-битные инструкции XOP, FMA4 и CVT16» (PDF) . АМД . 1 мая 2009 г.
- ^ «Новые инструкции для «Бульдозера» и «Сваедрайвера». Шаг вперед для разработки высокопроизводительного программного обеспечения» (PDF) . АМД . Октябрь 2012.
- ^ «Блог Агнера о процессорах — результаты тестов AMD Ryzen» . 2017-05-02.
- ^ Jump up to: а б «Обсуждение — у Ryzen есть недокументированная поддержка FMA4» . Проверено 10 мая 2017 г.
- ^ «www.amd.com, список моделей с поддержкой FMA4» .
- ^ «www.amd.com, список моделей с поддержкой FMA4» .
- ^ «www.amd.com, список моделей с поддержкой FMA4» .
- ^ «Набор 128-битных инструкций SSE5» . AMD Центр разработчиков . Архивировано из оригинала 15 января 2008 г. Проверено 28 января 2008 г.
- ^ «Справочник по программированию Intel Advanced Vector Extensions» (PDF) . Интел . Проверено 5 апреля 2008 г. [ постоянная мертвая ссылка ]
- ^ «Справочник по программированию расширенных векторных расширений Intel» . Интел . Проверено 6 мая 2009 г.
- ^ «Достижение баланса» . Дэйв Кристи, блоги разработчиков AMD. 6 мая 2009 года. Архивировано из оригинала 8 июля 2012 года . Проверено 7 ноября 2018 г.
- ^ Jump up to: а б «Новые инструкции для бульдозеров и сваебойщиков» (PDF) . АМД . Проверено 25 июля 2013 г.
- ^ «Руководство по оптимизации программного обеспечения для процессоров AMD семейства 15h» (PDF) . АМД . Проверено 19 апреля 2012 г.
- ^ «Справочник по программированию расширений набора команд архитектуры Intel» (PDF) . Интел . Проверено 25 июля 2013 г.
- ^ Гопаласубраманиан, Ганеш (10 марта 2015 г.). «[ИСПРАВЛЕНИЕ] добавить процессор znver1» . Проверено 1 мая 2022 г.
- ^ Павар, Амит (07 августа 2015 г.). «[ИСПРАВЛЕНИЕ] Удалить CpuFMA4 из флагов ЦП Znver1» . Проверено 1 мая 2022 г.
- ^ «Комментарий Mysticial о переполнении стека» . 16 июля 2019 г. Архивировано из оригинала 22 августа 2019 г. Проверено 1 сентября 2023 г.
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка ) - ^ «Машина AMD Ryzen аварийно завершает работу при выполнении последовательности инструкций FMA3» . 16 марта 2017 года . Проверено 10 сентября 2017 г.
- ^ «Комментарий Mysticial о переполнении стека» . 16 июля 2019 г. Проверено 1 сентября 2023 г.
- ^ Jump up to: а б Латиф, Лоуренс (14 ноября 2011 г.). «AMD Bulldozer поддерживает только инструкции FMA4 и XOP, GCC Intel все еще без звука» . Спрашивающий . Архивировано из оригинала 17 ноября 2011 года.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ «Внутренние функции FMA4 добавлены в Visual Studio 2010 SP1» . 4 февраля 2013 г.
- ^ «ЭКОПат человек док» . Архивировано из оригинала 23 июня 2016 г. Проверено 24 июля 2013 г.
- ^ «Примечания к выпуску LLVM 3.1» .
- ^ «Включить обнаружение поддержки AVX и AVX2 через CPUID» . ЛЛВМ . 26 апреля 2012 г.