X86 instruction set extension developed by Intel
Wikilibros tiene un libro sobre el tema: X86 Assembly/AVX, AVX2, FMA3, FMA4
El conjunto de instrucciones FMA es una extensión de las instrucciones Streaming SIMD Extensions de 128 y 256 bits del conjunto de instrucciones del microprocesador x86 para realizar operaciones de multiplicación-suma fusionadas (FMA). [1] Hay dos variantes:
Instrucciones
Las instrucciones FMA3 y FMA4 tienen una funcionalidad casi idéntica, pero no son compatibles. Ambas contienen instrucciones de multiplicación-suma fusionada (FMA) para operaciones escalares de punto flotante y SIMD , pero las instrucciones FMA3 tienen tres operandos, mientras que las FMA4 tienen cuatro. La operación FMA tiene la forma d = round( a · b + c ), donde la función round realiza un redondeo para permitir que el resultado quepa dentro del registro de destino si hay demasiados bits significativos para caber dentro del destino.
La forma de cuatro operandos (FMA4) permite que a , b , c y d sean cuatro registros diferentes, mientras que la forma de tres operandos (FMA3) requiere que d sea el mismo registro que a , b o c . La forma de tres operandos hace que el código sea más corto y la implementación del hardware un poco más simple, mientras que la forma de cuatro operandos proporciona más flexibilidad de programación.
Consulte el conjunto de instrucciones XOP para obtener más información sobre los problemas de compatibilidad entre Intel y AMD.
Conjunto de instrucciones FMA3
CPU con FMA3
- AMD
- Piledriver (2012) y microarquitecturas más nuevas [3]
- APU de segunda generación , "Trinity" (32 nm), 15 de mayo de 2012
- "Bulldozer" de segunda generación (bdver2) con núcleos Piledriver, 23 de octubre de 2012
- Intel
Extracto de FMA3
Los comandos admitidos incluyen
- Nota
- VF N M ADD es
result = − a · b + c
, no result = − (a · b + c)
. - VF N M SUB genera un −0 para todas las entradas son cero.
El orden explícito de los operandos se incluye en el mnemónico utilizando los números "132", "213" y "231":
así como el formato del operando (empaquetado o escalar) y el tamaño (simple o doble).
Esto da como resultado
Conjunto de instrucciones FMA4
CPU con FMA4
- AMD
- Procesadores de "equipo pesado"
- Zen : Las pruebas de WikiChip muestran que FMA4 todavía parece funcionar (en las condiciones de las pruebas) a pesar de no tener soporte oficial y ni siquiera informarlo CPUID. Esto también ha sido confirmado por Agner Fog. [8] Pero otras pruebas dieron resultados erróneos. [9] Sitio web oficial de AMD Nota sobre soporte de FMA4 CPU ZEN = AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G. [10] [11] [12]
- Intel
- Intel no ha lanzado CPU con soporte para FMA4.
Extracto de FMA4
Historia
La incompatibilidad entre FMA3 de Intel y FMA4 de AMD se debe a que ambas compañías cambiaron sus planes sin coordinar los detalles de codificación entre sí. AMD cambió sus planes de FMA3 a FMA4, mientras que Intel cambió sus planes de FMA4 a FMA3 casi al mismo tiempo. La historia se puede resumir de la siguiente manera:
- Agosto de 2007: AMD anuncia el conjunto de instrucciones SSE5 , que incluye instrucciones FMA de 3 operandos. Se introduce un nuevo esquema de codificación (DREX) que permite que las instrucciones tengan tres operandos. [13]
- Abril de 2008: Intel anuncia sus conjuntos de instrucciones AVX y FMA, incluidas las instrucciones FMA de 4 operandos. La codificación de estas instrucciones utiliza el nuevo esquema de codificación VEX , [14] que es más flexible que el esquema DREX de AMD.
- Diciembre de 2008: Intel cambia la especificación de sus instrucciones FMA de 4 operandos a 3 operandos. Se sigue utilizando el esquema de codificación VEX. [15]
- Mayo de 2009: AMD cambia la especificación de sus instrucciones FMA del formato DREX de 3 operandos al formato VEX de 4 operandos, compatible con la especificación Intel de abril de 2008 en lugar de la especificación Intel de diciembre de 2008. [16]
- Octubre de 2011: el procesador AMD Bulldozer admite FMA4. [17]
- Enero de 2012: AMD anuncia compatibilidad con FMA3 en futuros procesadores con nombre en código Trinity y Vishera; están basados en la arquitectura Piledriver . [18]
- Mayo de 2012: el procesador AMD Piledriver admite tanto FMA3 como FMA4. [17]
- Junio de 2013: el procesador Intel Haswell admite FMA3. [19]
- Febrero de 2017: La primera generación de procesadores AMD Ryzen admite oficialmente FMA3, pero no FMA4 según la instrucción CPUID . [2] Ha habido confusión sobre si FMA4 se implementó o no en este procesador debido a erratas en el parche inicial del paquete GNU Binutils que desde entonces se ha rectificado. [20] [21] Un informe no confirmado de resultados erróneos [9] generó algunas dudas, pero Mysticial (Alexander Yee, desarrollador de y-cruncher) lo desacreditó: [22] FMA4 funcionó para cálculos bignum con precisión de bits en su sistema Zen 1 durante años, y el único informe en Reddit nunca tuvo ninguna investigación de seguimiento para descartar errores en el software de prueba antes de ser ampliamente repetido. Las CPU Ryzen iniciales podían bloquearse con una secuencia particular de instrucciones FMA3, pero el microcódigo de CPU actualizado soluciona el problema. [23]
- Julio de 2019: los procesadores AMD Zen 2 y Ryzen posteriores no son compatibles con FMA4 en absoluto. [24] Siguen siendo compatibles con FMA3. Solo Zen 1 y Zen+ tienen compatibilidad no oficial con FMA4.
Compatibilidad con compiladores y ensambladores
Diferentes compiladores proporcionan distintos niveles de soporte para FMA:
- GCC admite FMA4 con -mfma4 desde la versión 4.5.0 [25] y FMA3 con -mfma desde la versión 4.7.0.
- Microsoft Visual C++ 2010 SP1 admite instrucciones FMA4. [26]
- Microsoft Visual C++ 2012 admite instrucciones FMA3 (si el procesador también admite la extensión del conjunto de instrucciones AVX2).
- Microsoft Visual C++ desde VC 2013
- PathScale admite FMA4 con -mfma. [27]
- LLVM 3.1 agrega soporte para FMA4, [28] junto con soporte preliminar para FMA3. [29]
- Open64 5.0 agrega "soporte limitado".
- Los compiladores Intel sólo admiten instrucciones FMA3. [25]
- NASM admite instrucciones FMA3 desde la versión 2.03 y instrucciones FMA4 desde la 2.06.
- FASM admite instrucciones FMA3 y FMA4.
Referencias
- ^ "FMA3 y FMA4 no son conjuntos de instrucciones, son instrucciones individuales: fusiones, multiplicaciones y sumas. Podrían ser bastante útiles dependiendo de cómo las implementen Intel y AMD" Woltmann, George (Prime95). "Intel AVX y GIMPS". mersenneforum.org/index.php . Proyecto Great Internet Mersenne Prime Search (GIMPS) . Consultado el 27 de julio de 2011 .
{{cite web}}
: CS1 maint: numeric names: authors list (link) - ^ ab "La microarquitectura de las CPU Intel, AMD y VIA. Una guía de optimización para programadores de ensamblaje y creadores de compiladores" (PDF) . Consultado el 2 de mayo de 2017 .
- ^ Maffeo, Robin (1 de marzo de 2012). «AMD y la versión beta de Visual Studio 11». AMD. Archivado desde el original el 9 de noviembre de 2013. Consultado el 7 de noviembre de 2018 .
- ^ "CPU-Z - ID: y5z6gq" . Consultado el 1 de mayo de 2022 .
- ^ "CPU-Z - ID: kr2mlx" . Consultado el 1 de mayo de 2022 .
- ^ "Manual del programador de la arquitectura AMD64, volumen 6: instrucciones XOP, FMA4 y CVT16 de 128 y 256 bits" (PDF) . AMD . 1 de mayo de 2009.
- ^ "Nuevas instrucciones "Bulldozer" y "Piledriver": un paso adelante para el desarrollo de software de alto rendimiento" (PDF) . AMD . Octubre de 2012.
- ^ "Blog de CPU de Agner: resultados de las pruebas de AMD Ryzen". 2017-05-02.
- ^ ab "Discusión: Ryzen tiene soporte no documentado para FMA4" . Consultado el 10 de mayo de 2017 .
- ^ "www.amd.com, lista de modelos compatibles con FMA4".
- ^ "www.amd.com, lista de modelos compatibles con FMA4".
- ^ "www.amd.com, lista de modelos compatibles con FMA4".
- ^ "Conjunto de instrucciones SSE5 de 128 bits". AMD Developer Central. Archivado desde el original el 15 de enero de 2008. Consultado el 28 de enero de 2008 .
- ^ "Referencia de programación de extensiones de vector avanzadas de Intel" (PDF) . Intel . Consultado el 5 de abril de 2008 .[ enlace muerto permanente ]
- ^ "Referencia de programación de extensiones de vector avanzadas de Intel". Intel . Consultado el 6 de mayo de 2009 .
- ^ "Lograr un equilibrio". Dave Christie, blogs de desarrolladores de AMD. 6 de mayo de 2009. Archivado desde el original el 8 de julio de 2012. Consultado el 7 de noviembre de 2018 .
- ^ ab "Instrucciones para nuevas excavadoras y pilonos" (PDF) . AMD . Consultado el 25 de julio de 2013 .
- ^ "Guía de optimización de software para procesadores AMD Family 15h" (PDF) . AMD . Consultado el 19 de abril de 2012 .
- ^ "Referencia de programación de extensiones del conjunto de instrucciones de la arquitectura Intel" (PDF) . Intel . Consultado el 25 de julio de 2013 .
- ^ Gopalasubramanian, Ganesh (10 de marzo de 2015). «[PARCHE] Agregar procesador znver1» . Consultado el 1 de mayo de 2022 .
- ^ Pawar, Amit (7 de agosto de 2015). "[PARCHE] Eliminar CpuFMA4 de los indicadores de CPU de Znver1" . Consultado el 1 de mayo de 2022 .
- ^ "Comentario de Mysticial sobre Stack Overflow". 16 de julio de 2019. Archivado desde el original el 22 de agosto de 2019. Consultado el 1 de septiembre de 2023 .
{{cite web}}
: CS1 maint: bot: original URL status unknown (link) - ^ "La máquina AMD Ryzen falla al ejecutar una secuencia de instrucciones FMA3". 16 de marzo de 2017. Consultado el 10 de septiembre de 2017 .
- ^ "Comentario de Mysticial sobre Stack Overflow". 2019-07-16 . Consultado el 2023-09-01 .
- ^ ab Latif, Lawrence (14 de noviembre de 2011). "Las instrucciones AMD Bulldozer solo FMA4 y XOP son compatibles con GCC Intel sigue sin funcionar". The Inquirer . Archivado desde el original el 17 de noviembre de 2011.
{{cite web}}
: CS1 maint: unfit URL (link) - ^ "Intrínsecos de FMA4 agregados para Visual Studio 2010 SP1". 4 de febrero de 2013.
- ^ "EKOPath man doc". Archivado desde el original el 23 de junio de 2016. Consultado el 24 de julio de 2013 .
- ^ "Notas de la versión de LLVM 3.1".
- ^ "Habilitar la detección de compatibilidad con AVX y AVX2 a través de CPUID". LLVM . 2012-04-26.