El conjunto de instrucciones FMA es una extensión de las instrucciones Streaming SIMD Extensions de 128 y 256 bits en el conjunto de instrucciones del microprocesador x86 para realizar operaciones fusionadas de multiplicación-suma (FMA). [1] Hay dos variantes:
- FMA4 es compatible con procesadores AMD a partir de la arquitectura Bulldozer . FMA4 se realizó en hardware antes que FMA3. El soporte para FMA4 se eliminó desde Zen 1 .
- FMA3 es compatible con los procesadores AMD a partir de la arquitectura Piledriver e Intel a partir de los procesadores Haswell y los procesadores Broadwell desde 2014.
Instrucciones
Las instrucciones FMA3 y FMA4 tienen una funcionalidad casi idéntica, pero no son compatibles. Ambas contienen instrucciones fusionadas de multiplicación y suma (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.
El de cuatro operando forma (FMA4) permite un , b , c y d sean cuatro registros diferentes, mientras que los tres-operando forma (FMA3) requiere que D sea el mismo registro como un , 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 recientes [2]
- 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
- Piledriver (2012) y microarquitecturas más recientes [2]
- Intel
Extracto de FMA3
Los comandos admitidos incluyen VFMADD, VFMADDSUB, VFMSUBADD, VFMSUB, VFNMADD, VFNMSUB. 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).
Mnemotécnico (AT&T) | Operandos | Operación |
---|---|---|
VFMADD132PDy | mm, mm, mm / m256 | a = a · c + b |
VFMADD132PSy | ||
VFMADD132PDx | xmm, xmm, xmm / m128 | |
VFMADD132PSx | ||
VFMADD132SD | xmm, xmm, xmm / m64 | |
VFMADD132SS | xmm, xmm, xmm / m32 | |
VFMADD213PDy | mm, mm, mm / m256 | a = b · a + c |
VFMADD213PSy | ||
VFMADD213PDx | xmm, xmm, xmm / m128 | |
VFMADD213PSx | ||
VFMADD213SD | xmm, xmm, xmm / m64 | |
VFMADD213SS | xmm, xmm, xmm / m32 | |
VFMADD231PDy | mm, mm, mm / m256 | a = b · c + a |
VFMADD231PSy | ||
VFMADD231PDx | xmm, xmm, xmm / m128 | |
VFMADD231PSx | ||
VFMADD231SD | xmm, xmm, xmm / m64 | |
VFMADD231SS | xmm, xmm, xmm / m32 |
Conjunto de instrucciones FMA4
CPU con FMA4
- AMD
- Procesadores de "equipo pesado"
- Procesadores basados en bulldozer, 12 de octubre de 2011 [5]
- Procesadores basados en Piledriver [6]
- Procesadores basados en apisonadora
- Procesadores basados en excavadoras (incluida "v2")
- Zen : Las pruebas de WikiChip muestran que FMA4 todavía parece funcionar (bajo las condiciones de las pruebas) a pesar de no ser oficialmente compatible y ni siquiera informado por CPUID. Esto también ha sido confirmado por Agner. [7] Pero otras pruebas dieron resultados incorrectos. [8] Sitio web oficial de AMD Nota de soporte de FMA4 CPU ZEN = AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G. [9] [10] [11]
- Procesadores de "equipo pesado"
- Intel
- Es incierto si los futuros procesadores de Intel serán compatibles con FMA4, debido al cambio anunciado de Intel a FMA3.
Extracto de FMA4
Mnemotécnico (AT&T) | Operandos | Operación |
---|---|---|
VFMADDPDx | xmm, xmm, xmm / m128, xmm / m128 | a = b · c + d |
VFMADDPDy | mm, mm, mm / m256, mm / m256 | |
VFMADDPSx | xmm, xmm, xmm / m128, xmm / m128 | |
VFMADDPSy | mm, mm, mm / m256, mm / m256 | |
VFMADDSD | xmm, xmm, xmm / m64, xmm / m64 | |
VFMADDSS | xmm, xmm, xmm / m32, xmm / m32 |
Historia
La incompatibilidad entre FMA3 de Intel y FMA4 de AMD se debe a que ambas compañías cambiaron de 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) para permitir que las instrucciones tengan tres operandos. [12]
- Abril de 2008: Intel anuncia sus conjuntos de instrucciones AVX y FMA, incluidas instrucciones FMA de 4 operandos. La codificación de estas instrucciones utiliza el nuevo esquema de codificación VEX , [13] que es más flexible que el esquema DREX de AMD.
- Diciembre de 2008: Intel cambia la especificación de sus instrucciones FMA de instrucciones de 4 operandos a instrucciones de 3 operandos. Todavía se utiliza el esquema de codificación VEX. [14]
- Mayo de 2009: AMD cambia la especificación de sus instrucciones FMA de la forma DREX de 3 operandos a la forma 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. [15]
- Octubre de 2011: el procesador AMD Bulldozer es compatible con FMA4. [dieciséis]
- Enero de 2012: AMD anuncia la compatibilidad con FMA3 en futuros procesadores con nombre en código Trinity y Vishera ; se basan en la arquitectura Piledriver. [17]
- Mayo de 2012: el procesador AMD Piledriver es compatible con FMA3 y FMA4. [dieciséis]
- Junio de 2013: el procesador Intel Haswell es compatible con FMA3. [18]
- Febrero de 2017 La primera generación de procesadores AMD Ryzen es compatible oficialmente con FMA3, pero no con FMA4 según la instrucción CPUID . [19] Ha habido confusión con respecto a si FMA4 se implementó o no en este procesador debido a erratas en el parche inicial del paquete GNU Binutils que desde entonces ha sido rectificado. [20] [21] Si bien las instrucciones FMA4 parecen funcionar de acuerdo con algunas pruebas, también pueden dar resultados incorrectos. [8] Además, las CPU Ryzen iniciales podrían bloquearse por una secuencia particular de instrucciones FMA3. Desde entonces, se ha resuelto mediante un microcódigo de CPU actualizado. [22]
Soporte de compilador y ensamblador
Los diferentes compiladores brindan diferentes niveles de soporte para FMA:
- GCC admite FMA4 con -mfma4 desde la versión 4.5.0 [23] y FMA3 con -mfma desde la versión 4.7.0.
- Microsoft Visual C ++ 2010 SP1 admite instrucciones FMA4. [24]
- 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 es compatible con FMA4 con -mfma. [25]
- LLVM 3.1 agrega soporte FMA4, [26] junto con soporte FMA3 preliminar. [27]
- Open64 5.0 agrega "soporte limitado".
- Los compiladores de Intel solo admiten instrucciones FMA3. [23]
- NASM admite instrucciones FMA3 desde la versión 2.03 e instrucciones FMA4 desde 2.06.
- Yasm admite instrucciones FMA3 desde la versión 0.8.0 e instrucciones FMA4 desde la versión 1.0.0.
- FASM admite instrucciones FMA3 y FMA4.
Referencias
- ^ "FMA3 y FMA4 no son conjuntos de instrucciones, son instrucciones individuales - suma multiplicada fusionada. Pueden ser muy útiles dependiendo de cómo Intel y AMD las implementen" Woltmann, George (Prime95). "Intel AVX y GIMPS" . mersenneforum.org/index.php . Gran proyecto de búsqueda de Internet Mersenne Prime (GIMPS) . Consultado el 27 de julio de 2011 .
- ^ Maffeo, Robin (1 de marzo de 2012). "AMD y Visual Studio 11 Beta" . AMD. Archivado desde el original el 9 de noviembre de 2013 . Consultado el 7 de noviembre de 2018 .
- ^ https://valid.x86.fr/cache/screenshot/y5z6gq.png
- ^ http://valid.x86.fr/cache/screenshot/kr2mlx.png
- ^ "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.
- ^ Instrucciones "Nuevo" Bulldozer "y" Piledriver "Un paso adelante para el desarrollo de software de alto rendimiento" (PDF) . AMD . Octubre 2012.
- ^ http://agner.org/optimize/blog/read.php?i=838
- ^ a b "Discusión: Ryzen tiene soporte no documentado para FMA4" . Consultado el 10 de mayo de 2017 .
- ^ "www.amd.com, lista de modelos de soporte FMA4" .
- ^ "www.amd.com, lista de modelos de soporte FMA4" .
- ^ "www.amd.com, lista de modelos de soporte FMA4" .
- ^ "Conjunto de instrucciones SSE5 de 128 bits" . Central de desarrolladores de AMD . Archivado desde el original el 15 de enero de 2008 . Consultado el 28 de enero de 2008 .
- ^ "Referencia de programación de Intel Advanced Vector Extensions" (PDF) . Intel . Consultado el 5 de abril de 2008 .[ enlace muerto permanente ]
- ^ "Referencia de programación de Intel Advanced Vector Extensions" . 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 .
- ^ a b "Instrucciones para excavadora y picadora" (PDF) . AMD . Consultado el 25 de julio de 2013 .
- ^ "Guía de optimización de software para procesadores 15h de la familia AMD" (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 .
- ^ "La microarquitectura de las CPU Intel, AMD y VIA. Una guía de optimización para programadores de ensamblajes y fabricantes de compiladores" (PDF) . Consultado el 2 de mayo de 2017 .
- ^ https://sourceware.org/ml/binutils/2015-03/msg00078.html
- ^ https://sourceware.org/ml/binutils/2015-08/msg00039.html
- ^ "La máquina AMD Ryzen se bloquea en una secuencia de instrucciones FMA3" . Consultado el 10 de septiembre de 2017 .
- ^ a b Latif, Lawrence (14 de noviembre de 2011). "AMD Bulldozer sólo las instrucciones FMA4 y XOP son compatibles con GCC Intel aún en silencio" . El indagador .
- ^ "Intrínsecos de FMA4 agregados para Visual Studio 2010 SP1" .
- ^ "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 LLVM 3.1" .
- ^ "Habilite la detección de compatibilidad con AVX y AVX2 a través de CPUID" . LLVM . 2012-04-26.