AltiVec es un conjunto de instrucciones SIMD de precisión simple para coma flotante y entero, diseñado y propiedad de Apple , IBM y Freescale Semiconductor (anteriormente Sector de Productos Semiconductores de Motorola ) , la alianza AIM . Está implementado en versiones de la arquitectura de procesador PowerPC , incluyendo los procesadores G4 de Motorola , G5 y POWER6 de IBM , y el 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 Apple y VMX ( Vector Multimedia Extension ) por IBM y PA Semi.
Si bien AltiVec hace referencia a un conjunto de instrucciones, las implementaciones en las CPU fabricadas por IBM y Motorola difieren en cuanto a su diseño lógico. Hasta la fecha, ningún núcleo de IBM ha incluido un diseño lógico AltiVec con licencia de Motorola, ni viceversa.
AltiVec es una parte estándar de la especificación Power ISA v.2.03 [ 1 ] . Nunca fue formalmente parte de la arquitectura PowerPC hasta esta especificación, aunque utilizaba formatos de instrucción y sintaxis de PowerPC y ocupaba el espacio de código de operación asignado expresamente 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 con o sin signo de 8 bits , ocho enteros cortos con o sin signo de 16 bits, cuatro enteros de 32 bits o cuatro variables de punto flotante de 32 bits . Ambos proporcionan instrucciones de control de caché diseñadas para minimizar la contaminación de la caché al trabajar con flujos de datos.
También presentan diferencias importantes. A diferencia de SSE2 , VMX/AltiVec admite un tipo de datos especial RGB " píxel ", pero no opera con números de coma flotante 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 "cargar/almacenar" del diseño RISC de PowerPC , los registros vectoriales, al igual que los registros escalares, solo se pueden cargar 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 los ocho de SSE y SSE2 (extendidos 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 se distingue por su compatibilidad con una instrucción de permutación vectorial flexible, en la que cada byte del valor vectorial resultante puede tomarse de cualquier byte de otros dos vectores, parametrizados por otro vector. Esto permite realizar manipulaciones sofisticadas con una sola instrucción.
Las versiones recientes 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 autovectorización que intentan crear de forma inteligente binarios acelerados por VMX/AltiVec sin necesidad de que el programador utilice funciones intrínsecas directamente. Se introduce la palabra clave de tipo "vector" para permitir la declaración de tipos vectoriales nativos; por ejemplo, declara una variable vectorial de 128 bits llamada "foo" que contiene dieciséis caracteres sin signo de 8 bits. El conjunto completo de operadores aritméticos y binarios está definido en los tipos vectoriales para que se pueda utilizar el lenguaje de expresiones C estándar para manipular variables vectoriales. También existen funciones intrínsecas sobrecargadas que emiten el código de operación apropiado según el tipo de los elementos dentro del vector, y se aplica una comprobación de tipos muy estricta. En cambio, los tipos de datos definidos por Intel para los registros SIMD IA-32 solo especifican 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 de coma flotante. El programador debe seleccionar la función intrínseca adecuada para los tipos de datos que utilice, por ejemplo, para sumar dos vectores que contengan ocho números enteros de 16 bits. vector unsigned char foo;vec_add_mm_add_epi16(x, y)
Historia del desarrollo
La extensión Power Vector Media Extension (VMX) fue desarrollada entre 1996 y 1998 mediante un proyecto colaborativo entre Apple, IBM y Motorola. Apple fue el principal cliente de VMX hasta que el 6 de junio de 2005 cambió a procesadores Intel basados en la arquitectura x86. La utilizaron para acelerar aplicaciones multimedia como QuickTime , iTunes y componentes clave de Mac OS X, incluido el compositor gráfico Quartz . Otras compañías, como Adobe, utilizaron AltiVec para optimizar sus programas de procesamiento de imágenes, como Adobe Photoshop . Motorola fue la primera en suministrar procesadores compatibles con AltiVec, comenzando con su línea G4. AltiVec también se utilizó en algunos sistemas embebidos para el procesamiento de señales digitales de alto rendimiento.
IBM omitió sistemáticamente VMX en sus primeros microprocesadores POWER , que estaban destinados a aplicaciones de servidor donde no resultaba muy útil. El microprocesador POWER6 , presentado en 2007, implementa AltiVec. El último microprocesador de escritorio de IBM, el PowerPC 970 (conocido como "G5" por Apple), también implementó AltiVec con un hardware similar al del PowerPC 7400 .
AltiVec es una marca registrada por Freescale (anteriormente Motorola) para la categoría estándar: Vector, parte de la especificación Power ISA v.2.03 [ 1 ] . Esta categoría también se conoce como VMX (utilizada por IBM) y "Velocity Engine" (una marca registrada utilizada anteriormente por Apple).
El Cell Broadband Engine, utilizado (entre otras cosas) en la PlayStation 3 , también es compatible con Power Vector Media Extension (VMX) en su PPU, con una arquitectura ISA de SPU mejorada pero 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ó a esta mejora VMX128. Las mejoras comprenden nuevas rutinas orientadas a los videojuegos (aceleración de gráficos 3D y física de juegos) [ 2 ] y un total de 128 registros. VMX128 no es totalmente compatible con VMX/Altivec, ya que se eliminaron varias operaciones con enteros para dejar 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 las instrucciones vectoriales-escalares VSX [ 5 ] , que extienden el procesamiento SIMD para Power ISA para admitir hasta 64 registros, con soporte para punto flotante regular, punto flotante decimal y ejecución vectorial. POWER7 es el primer procesador Power ISA en implementar Power ISA v2.06.
New instructions are introduced by IBM under the Vector Media Extension category for integer operations as part of the VSX extension in Power ISA 2.07.
IBM introdujo nuevas instrucciones de vector entero siguiendo las codificaciones VMX como parte de la extensión VSX en Power ISA v3.0. Se introducirán con los procesadores POWER9 . [ 6 ]
Asuntos
En C++, la forma estándar de acceder a la compatibilidad con AltiVec es mutuamente excluyente con el uso de la vector<>plantilla de clase de la Biblioteca de Plantillas Estándar (STL) debido a que "vector" se trata como una palabra reservada cuando el compilador no implementa la versión de vector con palabras clave sensibles al contexto. Sin embargo, es posible combinarlas mediante soluciones alternativas específicas del compilador; por ejemplo, en GCC se puede #undef vectoreliminar la vectorpalabra clave y usar la __vectorpalabra clave específica de GCC en su lugar.
En versiones anteriores a Power ISA 2.06 con VSX, AltiVec no admite la carga desde memoria utilizando la alineación natural del tipo. Por ejemplo, el código siguiente requiere un manejo especial para Power6 y versiones anteriores cuando la dirección efectiva no está alineada a 16 bytes. Este manejo especial añade 3 instrucciones adicionales a la operación de carga cuando VSX no está disponible.
#incluir <altivec.h>typedef __vector unsigned char uint8x16_p ;typedef __vector unsigned int uint32x4_p ;...int main ( int argc , char * argv ){/* La alineación natural de los valores es 4; y no 16 como se requiere */unsigned int vals [ 4 ] = { 1 , 2 , 3 , 4 };uint32x4_p vec ;#si está definido(__VSX__) || está definido(_ARCH_PWR8)vec = vec_xl ( 0 , vals );#demásconst uint8x16_p perm = vec_lvsl ( 0 , vals );const uint8x16_p low = vec_ld ( 0 , vals );const uint8x16_p high = vec_ld ( 15 , vals );vec = ( uint32x4_p ) vec_perm ( low , high , perm );#fin si}AltiVec anterior a Power ISA 2.06 con VMX carece de soporte para enteros de 64 bits. Los desarrolladores que deseen operar 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 adden subtractC 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 matemáticas de libros escolares. Una máquina little-endian necesitaría una máscara diferente.
#incluir <altivec.h>typedef __vector unsigned char uint8x16_p ;typedef __vector unsigned int uint32x4_p ;.../* Realiza a+b como si el vector contuviera dos palabras dobles de 64 bits */uint32x4_p add64 ( const uint32x4_p a , const uint32x4_p b ){const uint8x16_p cmask = { 4 , 5 , 6 , 7 , 16 , 16 , 16 , 16 , 12 , 13 , 14 , 15 , 16 , 16 , 16 , 16 } ;const uint32x4_p zero = { 0 , 0 , 0 , 0 };uint32x4_p cy = vec_addc ( vec1 , vec2 );cy = vec_perm ( cy , zero , cmask );return vec_add ( vec_add ( vec1 , vec2 ), cy );}/* Realiza la operación ab como si el vector contuviera dos palabras dobles de 64 bits */uint32x4_p sub64 ( const uint32x4_p a , const uint32x4_p b ){const uint8x16_p bmask = { 4 , 5 , 6 , 7 , 16 , 16 , 16 , 16 , 12 , 13 , 14 , 15 , 16 , 16 , 16 , 16 } ;const uint32x4_p amask = { 1 , 1 , 1 , 1 };const uint32x4_p zero = { 0 , 0 , 0 , 0 };uint32x4_p bw = vec_subc ( vec1 , vec2 );bw = vec_andc ( amask , bw );bw = vec_perm ( bw , zero , bmask );return 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>typedef __vector unsigned long long uint64x2_p ;.../* Realiza a+b utilizando palabras dobles de vector nativo de 64 bits */uint64x2_p add64 ( const uint64x2_p a , const uint64x2_p b ){devolver vec_add ( a , b );}/* Realiza ab utilizando palabras dobles de vector nativo de 64 bits */uint64x2_p sub64 ( const uint64x2_p a , const uint64x2_p b ){devolver vec_sub ( a , b );}Implementaciones
Los siguientes procesadores incluyen AltiVec, VMX o VMX128.
Motorola/Freescale
IBM
PA Semi
Aplicaciones de software
Se sabe que las siguientes aplicaciones de software utilizan la aceleración de hardware AltiVec o VMX.
- Helios tiene un puerto POWER9 / POWER10 nativo con soporte para VMX. [ 7 ]
Referencias
- 1 2 "Power ISA v.2.03" (PDF) . Power.org. Archivado del original (PDF) el 27-07-2011 . Recuperado el 09-08-2024 .
- ↑ "La historia de la CPU de Microsoft Xbox 360" . IBM. Octubre de 2015. Archivado del original el 20 de enero de 2008.
{{cite web}}: CS1 maint: bot: estado de la URL original desconocido ( enlace ) - ↑ Uso de la arquitectura SIMD de paralelismo de datos en videojuegos y supercomputadoras (IBM Research)
- ↑ Implementación de arquitecturas de conjuntos de instrucciones con especificadores de archivo de registros no contiguos. Patente estadounidense 7,421,566.
- ↑ "Aceleración de carga de trabajo con la arquitectura vectorial-escalar IBM POWER" . IBM. 1 de marzo de 2016. Archivado del original el 25 de enero de 2022. Consultado el 2 de mayo de 2017 .
- ↑ "Peter Bergner - [ PARCHE, CONFIRMADO ] Agregar soporte completo para Power ISA 3.0 / POWER9 binutils" . Archivado del original el 7 de marzo de 2016. Recuperado el 24 de diciembre de 2016 .
- ↑ "Preguntas frecuentes, Helios" . Helios . Consultado el 9 de julio de 2021 .
Enlaces externos
- Desplegando AltiVec, Parte 1: Presentación de la unidad SIMD PowerPC en IBM; archivado en Wayback Machine el 10 de septiembre de 2012.
- AltiVec Technologies en Freescale; archivado en Wayback Machine el 4 de febrero de 2012.
- Uso de la arquitectura SIMD de paralelismo de datos en videojuegos y supercomputadoras de IBM; archivado en Wayback Machine el 8 de febrero de 2012.
- Motor Velocity en Apple; archivado en Wayback Machine el 28 de noviembre de 2009.
- Comparación del historial y el rendimiento de SIMD
- computación SIMD
- Arquitectura de celdas BE
- microprocesadores de potencia
- Extensiones del conjunto de instrucciones