FMA инструкции

Тема в разделе "WASM.ARTICLES", создана пользователем Mikl___, 16 окт 2021.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Благодарю @Hardreversengineer с сайта https://codeby.net/, который показал мне статью в вики

    FMA (Fused Multiply-Add, умножение-сложение с однократным округлением) — набор 128- и 256-битных SIMD-инструкций для архитектур x86 и x86-64, предназначен для выполнения операции умножения-сложения над числами в формате с плавающей запятой.
    Существует два варианта расширений, добавляющих инструкции FMA:
    • FMA4 поддерживается процессорами AMD начиная с архитектуры Bulldozer. FMA4 было реализовано раньше FMA3.
    • FMA3 поддерживается процессорами Intel начиная с архитектуры Haswell и процессорами AMD начиная с архитектуры Piledriver.
    Особенности
    У инструкций FMA3 и FMA4 почти идентичная функциональность, но они не совместимы. Обе содержат SIMD-инструкции умножения-сложения для чисел с плавающей точкой.
    Проблема совместимости
    Разница между FMA3 и FMA4 в том, сколько различных операндов есть у инструкции — 3 или 4. Операции FMA имеют вид:
    d = b×c + a
    Форма с 4 операндами (FMA4) позволяет a, b, c и d находиться в разных регистрах, форма с 3 операндами (FMA3) требует, чтобы d находился в одном из тех регистров, в которых находятся a, b или c. Форма с 3 операндами делает код короче, ее проще реализовать аппаратно, форма с 4 операндами обеспечивает большую программную гибкость.

    Инструкции FMA3

    Процессоры с поддержкой FMA3
    • Intel представила аппаратную реализацию FMA3 в процессорах, основанных на архитектуре Haswell в 2013 году.
    • Процессоры AMD получили поддержку FMA3 в архитектуре Piledriver в 2012.
    ИнструкцияОперандыОперация
    VFMADD132PDy, VFMSUB132PDyymm, ymm, ymm/m256a = a×c±b
    VFMADD132PSy, VFMSUB132PSy
    VFMADD132PDx, VFMSUB132PDxxmm, xmm, xmm/m128
    VFMADD132PSx, VFMSUB132PSx
    VFMADD132SD, VFMSUB132SDxmm, xmm, xmm/m64
    VFMADD132SS, VFMSUB132SSxmm, xmm, xmm/m32
    VFMADD213PDy, VFMSUB213PDyymm, ymm, ymm/m256a = b×a±c
    VFMADD213PSy, VFMSUB213PSy
    VFMADD213PDx, VFMSUB213PDxxmm, xmm, xmm/m128
    VFMADD213PSx, VFMSUB213PSx
    VFMADD213SD, VFMSUB213SDxmm, xmm, xmm/m64
    VFMADD213SS, VFMSUB213SSxmm, xmm, xmm/m32
    VFMADD231PDy, VFMSUB231PDyymm, ymm, ymm/m256a = b×c±a
    VFMADD231PSy, VFMSUB231PSy
    VFMADD231PDx, VFMSUB231PDxxmm, xmm, xmm/m128
    VFMADD231PSx, VFMSUB231PSx
    VFMADD231SD, VFMSUB231SDxmm, xmm, xmm/m64
    VFMADD231SS, VFMSUB231SSxmm, xmm, xmm/m32
    Кроме перечисленных в таблице основных инструкций, расширение FMA3 содержит еще ряд инструкций, относящихся к следующим группам:
    OpcodeOperationOpcodeOperation
    VFMADDresult = + a · b + cVFMADDSUBresult = a · b + c  for i = 1, 3, ...
    VFNMADDresult = − a · b + cresult = a · b − c  for i = 0, 2, ...
    VFMSUBresult = + a · b − cVFMSUBADDresult = a · b − c  for i = 1, 3, ...
    VFNMSUBresult = − a · b − cresult = a · b + c  for i = 0, 2, ...
    • VFMADDSUB — умножение и чередующиеся сложение и вычитание (вычитание на четных позициях, сложение — на нечетных);
    • VFMSUBADD — умножение и чередующиеся вычитание и сложение (сложение на четных позициях, вычитание — на нечетных);
    • VFNMADD — умножение, взятое с противоположным знаком, и сложение;
    • VFNMSUB — умножение, взятое с противоположным знаком, и вычитание.
    Явный порядок операндов включен в мнемонику с использованием чисел «132», «213» и «231»:​
    postfix
    1
    Операциянеизменяемые
    операнды
    изменяемый
    операнд
    132a = a · c ± bc, bпервый сомножитель
    213a = b · a ± cвторой сомножитель
    231a = b · c ± aслагаемое/вычитаемое
    а также формат операнда (упакованный или скалярный) и точность (single или double).
    postfix
    2​
    точностьразмерpostfix
    2​
    точностьразмер
    SSsingle 32 битSDdouble 64 бит
    PSx4 × 32 битPDx2 × 64 бит
    PSy8 × 32 битPDy4 × 64 бит
    PSz16 × 32 битPDz8 × 64 бит

    Инструкции FMA4


    Процессоры с поддержкой FMA4
    • AMD впервые реализовала поддержку FMA4 в процессорах архитектуры Bulldozer, которые были представлены в октябре 2011, поддержку FMA4 имеет также архитектура Piledriver.
    • Начиная с микроархитектуры Zen (2017, бренды Ryzen, EPYC) AMD прекратило поддержку FMA4
    • На 2013 процессоры Intel не поддерживали FMA4
    ИнструкцияОперандыОперация
    VFMADDPDxxmm, xmm, xmm/m128, xmm/m128a = b·c + d
    VFMADDPDyymm, ymm, ymm/m256, ymm/m256
    VFMADDPSxxmm, xmm, xmm/m128, xmm/m128
    VFMADDPSyymm, ymm, ymm/m256, ymm/m256
    VFMADDSDxmm, xmm, xmm/m64, xmm/m64
    VFMADDSSxmm, xmm, xmm/m32, xmm/m32
    История
    Несовместимость между FMA3 от Intel и FMA4 от AMD вызвана тем, что обе компании изменили свои планы без согласования деталей кодирования друг с другом. AMD изменила планы от FMA3 в сторону FMA4, тогда как Intel — от FMA4 в сторону FMA3, практически единовременно.

    Поддержка компиляторами


    Различные компиляторы предлагают различный уровень поддержки FMA.​
    • GCC 4.5.0 поддерживает FMA4 с -mfma4
    • GCC 4.7.0 также поддерживает FMA3 с -mfma.
    • Microsoft Visual C++ 2010 SP1 поддерживает FMA4.
    • Microsoft Visual C++ 2012 поддерживает FMA3.
    • PathScale поддерживает FMA4 с -mfma.
    • Open64 5.0 имеет «ограниченную поддержку».
    • AMD x86 Open64 Compiler Suite поддерживает FMA3 и FMA4, начиная с версии 4.5.2.
    • Компиляторы Intel поддерживают только FMA3.

    Поддержка ассемблерами

    • NASM получил поддержку FMA3 в версии 2.03 и FMA4 — в версии 2.06.
    • YASM поддерживает FMA3 и FMA4, начиная с версии 1.1.0.
    • FASM поддерживает и FMA3, и FMA4.
    Примеры использования FMA с исходным текстом на FASM и бинарники

    Литература


    1. Robin Maffeo "AMD и the Visual Studio 11 Beta"​
     

    Вложения:

    Последнее редактирование: 17 окт 2021
    aa_dav нравится это.
  2. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    Хотелось бы еще заметить, что multipy-and-add (умножить и сложить) в одной инструкции в принципе своём это очень характерная черта микроконтроллеров которая еще в достаточно бородатые времена придавала им названия типа "real-time". И серьёзные увесистые процессоры знаменитых производителей довольно долго "сопротивлялись" проникновению такой инструкции в свою систему команд ибо она считалась такой "микроконтроллерной штучкой" ненужной в процессоре общего назначения.
    В итоге вроде бы все получили.
     
  3. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Для игор нужны функции для 3д-векторов. А с другой стороны, проц может и сам создавать функции multipy-and-add (умножить и сложить) из текущего кода. Да, современные процы могут на лету оптимизировать исполнение. Так что AVX-512 не нужен, совсем не нужен. Лучше усиливать АЛУ на новые лайк-код инструкции.
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Так если не нужен, зачем тогда вводили?
     
  5. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    439
    В ARM переход на 64 бита полностью сменил систему команд - при этом сами инструкции остались 32-битными по размеру как и в нативном ARM32 (без Thumb-1/2), но система команд была полностью перепахана с нуля так что остался только сам принцип Load/Store архитектуры со всеми вытекающими.
    Так вот если там посмотреть на инструкцию умножения MUL, то можно заметить, что это псевдоинструкция за которой скрывается алиас к другой настоящей инструкции MADD - умножить и сложить:
    Код (Text):
    1.  
    2. MUL <Wd>, <Wn>, <Wm>
    3.  
    4. is equivalent to
    5.  
    6. MADD <Wd>, <Wn>, <Wm>, WZR
    7.  
    (где WRZ это один из 32 РОН всегда заполненный нулём)
    Т.е. даже в целочисленных регистрах в ARM64 есть только multiply-add, а просто умножения уже нет. Экономия и рационализаторство во главе угла. Векторные регистры разумеется тоже есть.
    А x86 не воспользовался шансом при переезде на 64 бита полностью переделать свою систему команд.
     
    Последнее редактирование: 9 окт 2022