tecnologia sse3 soporte significa que procesadores instrucciones hace fm3 extensions concepto con 3dnow x86 sse avx mmx

x86 - sse3 - ¿Las diferentes versiones mmx, sse y avx son complementarias o superconjuntas entre sí?



sse3 streaming simd extensions 3 (2)

Estoy pensando que debería familiarizarme con las extensiones x86 SIMD. Pero antes de que incluso empecé me encontré con problemas. No puedo encontrar una buena visión general sobre cuáles de ellos siguen siendo relevantes.

La arquitectura x86 ha acumulado muchas extensiones de matemáticas / multimedia durante décadas:

  • MMX
  • 3DNow!
  • SSE
  • SSE2
  • SSE3
  • SSSE3
  • SSE4
  • AVX
  • AVX2
  • AVX512
  • ¿Olvidé algo?

¿Son las superseries más nuevas de las anteriores y viceversa? ¿O son complementarios?

¿Algunos de ellos están en desuso? ¿Cuáles de estos siguen siendo relevantes? He escuchado referencias a "legado SSE".

¿Algunos de ellos son mutuamente excluyentes? Es decir, ¿comparten las mismas piezas de hardware?

¿Qué debo usar juntos para maximizar la utilización del hardware en las modernas CPU Intel / AMD? En aras de la discusión, supongamos que puedo encontrar usos apropiados para las instrucciones ... calentar mi casa con la CPU, si no más.


Recientemente actualicé las etiquetas wikis para SSE , AVX y x86 (y SSE2 , avx2 ). Ellos cubren mucho de esto. resumen de tl; dr: AVX resume todas las versiones anteriores de SSE y proporciona versiones de 3 operandos de esas instrucciones. También las versiones 256b de la mayoría de las inscripciones FP (AVX) e int (AVX2).

Para obtener resúmenes de las distintas versiones de SSE, consulte la wikipedia o la respuesta más detallada de knm241.

Realmente no pensamos en eso haciendo obsoleto el SSE. Más bien, piense en AVX como una nueva y mejor versión de las mismas instrucciones SSE antiguas. Todavía están en el manual de referencia con sus nombres que no son AVX ( PSHUFB , no VPSHUFB , por ejemplo). Puede mezclar códigos AVX y SSE, siempre y cuando use VZEROUPPER cuando sea necesario para evitar que el problema de rendimiento mezcle VEX con no -VEX insns (en Intel). Por lo tanto, existe cierta molestia al tratar con casos en los que tiene que llamar a bibliotecas que pueden ejecutar instrucciones SSE que no son VEX, o cuando su código utiliza SSE FP math, pero también tiene algún código AVX para ejecutarse solo si la CPU lo admite.

Si la compatibilidad de la CPU no fuera un problema, las versiones de SSE heredadas de las instrucciones vectoriales serían realmente obsoletas, como lo es MMX ahora. AVX / AVX2 es al menos ligeramente mejor en todos los sentidos, si cuenta la versión de 128b con codificación VEX como AVX, no SSE. A veces, aún usaría registros 128b porque sus datos solo vienen en porciones tan grandes, pero más a menudo trabajando con registros 256b para hacer la misma operación con el doble de datos al mismo tiempo.

Todas las instrucciones SSE / AVX / x87-FP / integer usan los mismos puertos de ejecución . No puedes hacer más en paralelo al mezclarlos. (excepto en Haswell, donde uno de los 4 puertos ALU solo puede manejar insns no vectoriales, como GP reg ops y sucursales).


Son complementarios.

Cada nueva extensión de conjunto de instrucciones agrega nuevas instrucciones y, finalmente, un nuevo modelo de programación (nuevos registros, por ejemplo).

Ninguno está en desuso, es casi imposible hacer instrucciones de desaprobación por razones de compatibilidad. Sin embargo, algunas extensiones opcionales pueden estar ausentes o eliminadas de los modelos más nuevos (como el FMA4 de AMD) si no están muy extendidas.
Sin embargo, algunos son vestigiales, todo lo que se puede hacer con FPU y MMX, por ejemplo, se puede hacer de manera más eficiente con SSE +.

No se excluyen mutuamente en el sentido de que puede usar uno u otro, después de todo, son instrucciones, no modos de operación (como el modo real vs protegido, por ejemplo).
El único "conflicto" posible es entre MMX y FPU, ya que comparten la parte inferior del mismo conjunto de registros pero tienen un modelo de programación diferente.
Los nuevos registros de vectores han crecido de 128 bits a 256 bits y a 512 bits, cada vez que los registros anteriores se han convertido en la parte baja de los más nuevos.

Puede usarlos todos juntos; ofrecen un soporte de hardware específico que implementa operaciones simples.

Son como ladrillos de Lego, solo estás limitado por tu imaginación (o la imaginación de los diseñadores).

Aquí una lista simple de las extensiones de este conjunto de instrucciones.
Solo se enumeran algunas funciones , para la referencia completa, consulte el Manual Intel Vol1 del capítulo 9 al 14.

Consulte también https://hjlebbink.github.io/x86doc/ para obtener una tabla de contenido del manual del volumen 2 (referencia del conjunto de instrucciones) de Intel, con una lista de extensiones que agregaron instrucciones a esa entrada manual.

  • MMX
    Introduzca ocho registros de 64 bits (MM0-MM7) e instrucciones para trabajar con ocho bytes firmados / no firmados, cuatro palabras firmadas / no firmadas, dos palabras clave firmadas / no firmadas.

  • 3DNow!
    Agregue soporte para operandos de punto flotante de precisión simple a MMX. Pocas operaciones soportadas, por ejemplo suma, resta, multiplicación.

  • SSE
    Introduzca ocho / dieciséis registros de 128 bits (XMM0-XMM7 / 15) e instrucciones para trabajar con cuatro operandos de punto flotante de precisión simple. Agregue operaciones de enteros en los registros MMX también. (La parte entera de MMX de SSE a veces se llama MMXEXT y se implementó en algunas CPU que no son de Intel sin registros de xmm y la parte de punto flotante de SSE).

  • SSE2
    Presenta instrucciones para trabajar con 2 operandos de coma flotante de doble precisión y con enteros / bytes / palabras / palabras / palabras clave llenos en registros xmm de 128 bits.

  • SSE3
    Agregue unas pocas instrucciones variadas (en su mayoría de punto flotante), que incluyen un tipo especial de carga no alineada ( lddqu ) que fue mejor en Pentium 4, instrucciones de sincronización, adición / sub horizontal.

  • SSSE3
    De nuevo un conjunto variado de instrucciones, en su mayoría enteros. El primer shuffle que toma su operando de control de un registro en lugar de codificado ( pshufb ). Más procesamiento horizontal, orden aleatorio, empaquetado / desempaquetado, mul + add en bytes, y algunos enteros especializados en agregar / mul.

  • SSE4 (SSE4.1, SSE4.2)
    Agregue una gran cantidad de instrucciones: Rellene muchos de los huecos proporcionando las operaciones mín, máx y otras para todos los tipos de datos enteros (especialmente faltaba un entero de 32 bits), donde anteriormente el entero min solo estaba disponible para bytes sin signo y firmados 16 -poco. También escala, redondeo de FP, mezcla, operación de álgebra lineal, procesamiento de texto, comparaciones. También es una carga no temporal para leer la memoria de video, o copiarla de nuevo a la memoria principal. (Anteriormente solo estaban disponibles las tiendas NT).

  • Aesni
    Agregue soporte para acelerar el cifrado / descifrado simétrico de AES.

  • AVX Agregue ocho / dieciséis registros de 256 bits (YMM0-YMM7 / 15).
    Soporta todos los tipos de datos de punto flotante anteriores. Tres instrucciones de operando.

  • Fma
    Añadir Fused Multiply Añadir y las instrucciones correlacionadas.

  • AVX2
    Agregue soporte para tipos de datos enteros.

  • AVX512F
    Agregue ocho / treinta y dos registros de 512 bits (ZMM0-ZMM7 / 31) y ocho registros de máscara de 64 bits (k0-k7). Promover la mayoría de las instrucciones anteriores a 512 bit de ancho. Las partes opcionales de AVX512 agregan instrucciones para exponenciales y recíprocos (AVX512ER), búsqueda anticipada de dispersión / recopilación (AVX512PF), detección de conflicto de dispersión (AVX512CD), comprimir, expandir.

  • IMCI (Intel Xeon Phi)
    Desarrollo temprano de AVX512 para el coprocesador Intel Xeon Phi (Knight''s Corner) de primera generación.