stringtranslate.com

AltiVec

AltiVec es un conjunto de instrucciones SIMD de punto flotante y entero de precisión simple diseñado y propiedad de Apple , IBM y Freescale Semiconductor (anteriormente, Semiconductor Products Sector de Motorola ), la alianza AIM . Se implementa en versiones de la arquitectura de procesador PowerPC , incluidos los procesadores G4 de Motorola , G5 y POWER6 de IBM y PWRficient PA6T de PA Semi . AltiVec es una marca registrada propiedad exclusiva de Freescale, por lo que el sistema también se conoce como Velocity Engine por parte de Apple y VMX ( Vector Multimedia Extension ) por parte de IBM y PA Semi.

Si bien AltiVec se refiere a un conjunto de instrucciones, las implementaciones en las CPU producidas por IBM y Motorola son independientes en términos de diseño lógico. Hasta la fecha, ningún núcleo IBM ha incluido un diseño lógico AltiVec con licencia de Motorola o viceversa.

AltiVec es una parte estándar de la especificación Power ISA v.2.03 [1] . Nunca fue parte formal de la arquitectura PowerPC hasta esta especificación, aunque utilizaba formatos y sintaxis de instrucciones PowerPC y ocupaba el espacio de código de operación expresamente asignado para tales fines.

Comparación con x86-64 SSE

Tanto VMX/AltiVec como SSE cuentan con registros vectoriales de 128 bits que pueden representar dieciséis caracteres de 8 bits con o sin signo, ocho números cortos de 16 bits con o sin signo, cuatro enteros de 32 bits o cuatro variables de punto flotante de 32 bits . Ambos proporcionan instrucciones de control de caché destinadas a minimizar la contaminación de la caché cuando se trabaja con flujos de datos.

También presentan diferencias importantes. A diferencia de SSE2 , VMX/AltiVec admite un tipo de datos especial de " píxel " RGB , pero no opera con flotantes de doble precisión de 64 bits, y no hay forma de mover datos directamente entre registros escalares y vectoriales . De acuerdo con el modelo de "carga/almacenamiento" del diseño RISC de PowerPC , los registros vectoriales, al igual que los registros escalares, solo se pueden cargar desde y almacenar en la memoria. Sin embargo, VMX/AltiVec proporciona un conjunto mucho más completo de operaciones "horizontales" que funcionan en todos los elementos de un vector; las combinaciones permitidas de tipo de datos y operaciones son mucho más completas. Se proporcionan treinta y dos registros vectoriales de 128 bits, en comparación con ocho para SSE y SSE2 (ampliado a 16 en x86-64 ), y la mayoría de las instrucciones VMX/AltiVec toman tres operandos de registro en comparación con solo dos operandos de registro/registro o registro/memoria en IA-32 .

VMX/AltiVec también es único en su compatibilidad con una instrucción de permutación de vector flexible , en la que cada byte de un valor de vector resultante se puede tomar de cualquier byte de cualquiera de otros dos vectores, parametrizados por otro vector. Esto permite realizar manipulaciones sofisticadas en una sola instrucción.

Las versiones recientes [ ¿cuándo? ] de GNU Compiler Collection (GCC), el compilador IBM VisualAge y otros compiladores proporcionan funciones intrínsecas para acceder a las instrucciones VMX/AltiVec directamente desde programas C y C++ . A partir de la versión 4, GCC también incluye capacidades de vectorización automática que intentan crear de forma inteligente binarios acelerados VMX/Altivec sin necesidad de que el programador utilice funciones intrínsecas directamente. La palabra clave de tipo "vector" se introduce para permitir la declaración de tipos de vector nativos, por ejemplo, " vector unsigned char foo;" declara una variable de vector de 128 bits denominada "foo" que contiene dieciséis caracteres sin signo de 8 bits. El complemento completo de operadores aritméticos y binarios se define en tipos de vector de modo que se pueda utilizar el lenguaje de expresión C normal para manipular variables de vector. También hay funciones intrínsecas sobrecargadas como " vec_add" que emiten el código de operación adecuado en función del tipo de los elementos dentro del vector, y se aplica una comprobación de tipos muy estricta. Por el contrario, los tipos de datos definidos por Intel para los registros SIMD IA-32 declaran únicamente el tamaño del registro vectorial (128 o 64 bits) y, en el caso de un registro de 128 bits, si contiene números enteros o valores de punto flotante. El programador debe seleccionar el intrínseco apropiado para los tipos de datos en uso, por ejemplo, " _mm_add_epi16(x,y)" para sumar dos vectores que contienen ocho números enteros de 16 bits.

Historial de desarrollo

Power Vector Media Extension (VMX) fue desarrollado entre 1996 y 1998 por un proyecto colaborativo entre Apple, IBM y Motorola. Apple fue el principal cliente de Power Vector Media Extension (VMX) hasta que Apple cambió a CPU basadas en x86 fabricadas por Intel el 6 de junio de 2005. Lo usaron para acelerar aplicaciones multimedia como QuickTime , iTunes y partes clave de Mac OS X de Apple, incluido el compositor de gráficos Quartz . Otras empresas como Adobe usaron AltiVec para optimizar sus programas de procesamiento de imágenes como Adobe Photoshop . Motorola fue la primera en suministrar procesadores habilitados para AltiVec comenzando con su línea G4. AltiVec también se usó en algunos sistemas integrados para procesamiento de señales digitales de alto rendimiento.

IBM siempre ha dejado fuera el VMX de sus microprocesadores POWER anteriores , que estaban pensados ​​para aplicaciones de servidor en las que no resultaba muy útil. El microprocesador POWER6 , presentado en 2007, implementa AltiVec. El último microprocesador de escritorio de IBM, el PowerPC 970 (apodado "G5" por Apple), también implementó AltiVec con un hardware similar al del PowerPC 7400 .

AltiVec es una marca registrada de Freescale (anteriormente Motorola) para la parte estándar Category:Vector de la especificación Power ISA v.2.03 [1] . Esta categoría también se conoce como VMX (usada por IBM) y "Velocity Engine" (una marca utilizada anteriormente por Apple).

El Cell Broadband Engine, utilizado (entre otras cosas) en la PlayStation 3 , también soporta Power Vector Media Extension (VMX) en su PPU, con la SPU ISA mejorada pero arquitectónicamente similar.

Freescale está incorporando una versión mejorada de AltiVec a los procesadores QorIQ basados ​​en e6500 .

VMX128

IBM mejoró VMX para su uso en Xenon (Xbox 360) y denominó esta mejora VMX128. Las mejoras comprenden nuevas rutinas destinadas a los juegos (aceleración de gráficos 3D y física del juego) [2] y un total de 128 registros. VMX128 no es totalmente compatible con VMX/Altivec, ya que se eliminaron varias operaciones de números enteros para hacer espacio para el archivo de registros más grande y operaciones adicionales específicas de la aplicación. [3] [4]

VSX (Extensión escalar vectorial)

Power ISA v2.06 introdujo instrucciones escalares-vectoriales VSX [5] que amplían el procesamiento SIMD para que Power ISA admita hasta 64 registros, con soporte para ejecución de punto flotante regular, punto flotante decimal y vector. POWER7 es el primer procesador Power ISA que implementa Power ISA v2.06.

IBM introduce nuevas instrucciones en la categoría Vector Media Extension para operaciones con números enteros como parte de la extensión VSX en Power ISA 2.07.

IBM introdujo nuevas instrucciones de vectores enteros después de las codificaciones VMX como parte de la extensión VSX en Power ISA v3.0. Se incorporarán con los procesadores POWER9 . [6]

Asuntos

En C++, la forma estándar de acceder al soporte de AltiVec es mutuamente excluyente con el uso de la vector<>plantilla de clase de la Biblioteca de plantillas estándar debido al tratamiento de "vector" como una palabra reservada cuando el compilador no implementa la versión de palabra clave sensible al contexto de vector. Sin embargo, puede ser posible combinarlas utilizando soluciones alternativas específicas del compilador; por ejemplo, en GCC se puede #undef vectoreliminar la vectorpalabra clave y luego utilizar la __vectorpalabra clave específica de GCC en su lugar.

Las versiones anteriores a Power ISA 2.06 con VSX de AltiVec carecen de carga desde la memoria mediante la alineación natural de un tipo. Por ejemplo, el código que se muestra a continuación requiere un manejo especial para Power6 y versiones anteriores cuando la dirección efectiva no está alineada con 16 bytes. El manejo especial agrega 3 instrucciones adicionales a una operación de carga cuando VSX no está disponible.

#incluir <altivec.h> tipo definido __vector carácter sin signo uint8x16_p ;    tipo definido __vector int sin signo uint32x4_p ;    ...int principal ( int argc , char * argv )    { /* La alineación natural de vals es 4; y no 16 como se requiere */ entero sin signo vals [ 4 ] = { 1 , 2 , 3 , 4 };          uint32x4_p vector ; #si se define(__VSX__) || se define(_ARCH_PWR8) vec = vec_xl ( 0 , vals );   #demás constante uint8x16_p perm = vec_lvsl ( 0 , vals );      const uint8x16_p bajo = vec_ld ( 0 , vals );      const uint8x16_p alto = vec_ld ( 15 , vals );      vec = ( uint32x4_p ) vec_perm ( bajo , alto , perm );    #finsi}

Las versiones anteriores a Power ISA 2.06 con VMX de AltiVec carecen de compatibilidad con enteros de 64 bits. Los desarrolladores que deseen trabajar con datos de 64 bits desarrollarán rutinas a partir de componentes de 32 bits. Por ejemplo, a continuación se muestran ejemplos de 64 bits addy subtracten C utilizando un vector con cuatro palabras de 32 bits en una máquina big-endian . Las permutaciones mueven los bits de acarreo y préstamo de las columnas 1 y 3 a las columnas 0 y 2 como en las matemáticas de los libros escolares. Una máquina little-endian necesitaría una máscara diferente.

#incluir <altivec.h> tipo definido __vector carácter sin signo uint8x16_p ;    tipo definido __vector int sin signo uint32x4_p ;    .../* Ejecuta a+b como si el vector contuviera dos palabras dobles de 64 bits */uint32x4_p add64 ( constante uint32x4_p a , constante uint32x4_p b )      { const uint8x16_p cmask = { 4 , 5 , 6 , 7 , 16 , 16 , 16 , 16 , 12 , 13 , 14 , 15 , 16 , 16 , 16 } ;        const uint32x4_p cero = { 0 , 0 , 0 , 0 };        uint32x4_p cy = vec_addc ( vec1 , vec2 );     cy = vec_perm ( cy , cero , cmask );     devolver vec_add ( vec_add ( vec1 , vec2 ), cy );   }/* Ejecuta ab como si el vector contuviera dos palabras dobles de 64 bits */uint32x4_p sub64 ( constante uint32x4_p a , constante uint32x4_p b )      { const uint8x16_p bmask = { 4 , 5 , 6 , 7 , 16 , 16 , 16 , 16 , 12 , 13 , 14 , 15 , 16 , 16 , 16 } ;        const uint32x4_p máscara = { 1 , 1 , 1 , 1 };        const uint32x4_p cero = { 0 , 0 , 0 , 0 };        uint32x4_p bw = vec_subc ( vec1 , vec2 );     bw = vec_andc ( amask , bw );    bw = vec_perm ( bw , cero , bmask );     devolver vec_sub ( vec_sub ( vec1 , vec2 ), bw );   }

Power ISA 2.07 utilizado en Power8 finalmente proporcionó las palabras dobles de 64 bits. Un desarrollador que trabaje con Power8 solo necesita realizar lo siguiente.

#incluir <altivec.h> tipo definido __vector sin signo largo largo uint64x2_p ;     .../* Realiza a+b utilizando palabras dobles de 64 bits de vector nativo */uint64x2_p add64 ( constante uint64x2_p a , constante uint64x2_p b )      { devuelve vec_add ( a , b );  }/* Realiza ab utilizando palabras dobles de 64 bits de vector nativo */uint64x2_p sub64 ( constante uint64x2_p a , constante uint64x2_p b )      { devuelve vec_sub ( a , b );  }

Implementaciones

Los siguientes procesadores tienen AltiVec, VMX o VMX128 incluidos

Motorola/Freescale

IBM

PA Semi

Aplicaciones de software

Se sabe que las siguientes aplicaciones de software aprovechan la aceleración de hardware AltiVec o VMX.

Referencias

  1. ^ ab "Power ISA v.2.03" (PDF) . Power.org. Archivado desde el original el 27 de julio de 2011 . Consultado el 9 de agosto de 2024 .{{cite web}}: CS1 maint: bot: estado de URL original desconocido ( enlace )
  2. ^ "La historia de la CPU de la Xbox 360 de Microsoft". IBM. Octubre de 2015. Archivado desde el original el 20 de enero de 2008.{{cite web}}: CS1 maint: bot: estado de URL original desconocido ( enlace )
  3. ^ Uso de la arquitectura SIMD de datos paralelos en videojuegos y supercomputadoras IBM Research
  4. ^ Implementación de arquitecturas de conjuntos de instrucciones con especificadores de archivos de registro no contiguos Patente de EE. UU. 7.421.566
  5. ^ "Aceleración de la carga de trabajo con la arquitectura escalar-vectorial IBM POWER". IBM. 2016-03-01. Archivado desde el original el 2022-01-25 . Consultado el 2017-05-02 .
  6. ^ "Peter Bergner - [PARCHE, COMPROMETIDO] Se añade compatibilidad total con binutils de Power ISA 3.0/POWER9". Archivado desde el original el 7 de marzo de 2016. Consultado el 24 de diciembre de 2016 .
  7. ^ "Preguntas frecuentes, Helios". Helios . Consultado el 9 de julio de 2021 .

Enlaces externos