Благодарю @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±bVFMADD132PSy, VFMSUB132PSyVFMADD132PDx, VFMSUB132PDxxmm, xmm, xmm/m128VFMADD132PSx, VFMSUB132PSxVFMADD132SD, VFMSUB132SDxmm, xmm, xmm/m64VFMADD132SS, VFMSUB132SSxmm, xmm, xmm/m32VFMADD213PDy, VFMSUB213PDyymm, ymm, ymm/m256a = b×a±cVFMADD213PSy, VFMSUB213PSyVFMADD213PDx, VFMSUB213PDxxmm, xmm, xmm/m128VFMADD213PSx, VFMSUB213PSxVFMADD213SD, VFMSUB213SDxmm, xmm, xmm/m64VFMADD213SS, VFMSUB213SSxmm, xmm, xmm/m32VFMADD231PDy, VFMSUB231PDyymm, ymm, ymm/m256a = b×c±aVFMADD231PSy, VFMSUB231PSyVFMADD231PDx, VFMSUB231PDxxmm, xmm, xmm/m128VFMADD231PSx, VFMSUB231PSxVFMADD231SD, VFMSUB231SDxmm, xmm, xmm/m64VFMADD231SS, VFMSUB231SSxmm, xmm, xmm/m32Кроме перечисленных в таблице основных инструкций, расширение FMA3 содержит еще ряд инструкций, относящихся к следующим группам: OpcodeOperationOpcodeOperationVFMADDresult = + 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 + dVFMADDPDyymm, ymm, ymm/m256, ymm/m256VFMADDPSxxmm, xmm, xmm/m128, xmm/m128VFMADDPSyymm, ymm, ymm/m256, ymm/m256VFMADDSDxmm, xmm, xmm/m64, xmm/m64VFMADDSSxmm, 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 и бинарники Литература https://en.wikipedia.org/wiki/FMA_instruction_set https://ru.wikipedia.org/wiki/FMA Dave Christie "Striking a balance". AMD Developer blogs Robin Maffeo "AMD и the Visual Studio 11 Beta" "Руководство программиста по архитектуре AMD64". Том 6. 128-битные и 256-битные инструкции XOP, FMA4 и CVT16 Новые инструкции в "Bulldozer" и "Piledriver". Шаг вперед для разработки высокопроизводительного ПО "But with Zen being a clean-sheet design, there are some instruction set extensions found in Bulldozer processors not found in Zen/znver1. Those no longer present include FMA4 and XOP." Gopalasubramanian, G - [PATCH] add znver1 processor Вышел GCC 4.5 Встроенные объекты FMA4, добавленные в Visual Studio 2010 с пакетом обновления 1 (SP1) Новое в x86 Open64 Compiler Suite v4.5.2.
Хотелось бы еще заметить, что multipy-and-add (умножить и сложить) в одной инструкции в принципе своём это очень характерная черта микроконтроллеров которая еще в достаточно бородатые времена придавала им названия типа "real-time". И серьёзные увесистые процессоры знаменитых производителей довольно долго "сопротивлялись" проникновению такой инструкции в свою систему команд ибо она считалась такой "микроконтроллерной штучкой" ненужной в процессоре общего назначения. В итоге вроде бы все получили.
Для игор нужны функции для 3д-векторов. А с другой стороны, проц может и сам создавать функции multipy-and-add (умножить и сложить) из текущего кода. Да, современные процы могут на лету оптимизировать исполнение. Так что AVX-512 не нужен, совсем не нужен. Лучше усиливать АЛУ на новые лайк-код инструкции.
В ARM переход на 64 бита полностью сменил систему команд - при этом сами инструкции остались 32-битными по размеру как и в нативном ARM32 (без Thumb-1/2), но система команд была полностью перепахана с нуля так что остался только сам принцип Load/Store архитектуры со всеми вытекающими. Так вот если там посмотреть на инструкцию умножения MUL, то можно заметить, что это псевдоинструкция за которой скрывается алиас к другой настоящей инструкции MADD - умножить и сложить: Код (Text): MUL <Wd>, <Wn>, <Wm> is equivalent to MADD <Wd>, <Wn>, <Wm>, WZR (где WRZ это один из 32 РОН всегда заполненный нулём) Т.е. даже в целочисленных регистрах в ARM64 есть только multiply-add, а просто умножения уже нет. Экономия и рационализаторство во главе угла. Векторные регистры разумеется тоже есть. А x86 не воспользовался шансом при переезде на 64 бита полностью переделать свою систему команд.