AltiVec es un conjunto de instrucciones SIMD enteras y de coma flotante de precisión simple diseñado y propiedad de Apple , IBM y Freescale Semiconductor (antes Sector de Productos Semiconductores de Motorola ), la alianza AIM . Se implementa en las versiones del PowerPC arquitectura del procesador, incluyendo el de Motorola G4 , IBM 's G5 y POWER6 procesadores y PA Semi ' s PWRficient PA6T. AltiVec es una marca comercial 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 se refiere a un conjunto de instrucciones, las implementaciones en CPU producidas por IBM y Motorola están separadas en términos de 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 o viceversa.
AltiVec es una parte estándar de la especificación Power ISA v.2.03 [1] . Nunca fue formalmente parte de la arquitectura de PowerPC hasta esta especificación, aunque usaba formatos de instrucción y sintaxis de PowerPC y ocupaba el espacio de código de operación expresamente asignado para tales propósitos.
Comparación con SSE x86-64
Tanto VMX / AltiVec como SSE cuentan con registros vectoriales de 128 bits que pueden representar dieciséis caracteres de 8 bits firmados o sin firmar, ocho cortos de 16 bits firmados o sin firmar, cuatro entradas de 32 bits o cuatro variables de coma 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 exhiben importantes diferencias. A diferencia de SSE2 , VMX / AltiVec admite un tipo de datos de " píxel " RGB especial , pero no funciona con flotadores 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, como 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 tipos 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 (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 es único en su soporte para una instrucción de permutación vectorial flexible , en la que cada byte de un valor de vector resultante se puede tomar de cualquier byte de cualquiera de los otros dos vectores, parametrizado por otro vector más. Esto permite manipulaciones sofisticadas en una sola instrucción.
Versiones recientes [ ¿cuándo? ] de GNU Compiler Collection (GCC), el compilador IBM VisualAge y otros compiladores proporcionan elementos intrínsecos para acceder a las instrucciones VMX / AltiVec directamente desde los programas C y C ++ . A partir de la versión 4, GCC también incluye capacidades de auto-vectorización que intentan crear inteligentemente binarios acelerados VMX / Altivec sin la necesidad de que el programador use intrínsecos directamente. La palabra clave de tipo "vector" se introduce para permitir la declaración de tipos de vectores nativos, por ejemplo, " vector unsigned char foo;
" declara una variable vectorial de 128 bits denominada "foo" que contiene dieciséis caracteres sin firmar de 8 bits. El complemento completo de los operadores aritméticos y binarios se define en tipos de vector para que el lenguaje de expresión C normal se pueda utilizar para manipular variables vectoriales. También hay funciones intrínsecas sobrecargadas como " vec_add
" que emiten el código de operación apropiado según el tipo de elementos dentro del vector, y se aplica una verificación de tipo muy fuerte. Por el contrario, los tipos de datos definidos por Intel para los registros SIMD IA-32 declaran solo 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 enteros de 16 bits.
Historia de desarrollo
Power Vector Media Extension (VMX) se desarrolló entre 1996 y 1998 mediante un proyecto de colaboración entre Apple, IBM y Motorola. Apple fue el cliente principal 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 del Mac OS de Apple. X incluido en el compositor de gráficos Quartz . Otras empresas, como Adobe, utilizaron AltiVec para optimizar sus programas de procesamiento de imágenes, como Adobe Photoshop . Motorola fue el primero en suministrar procesadores habilitados para AltiVec comenzando con su línea G4. AltiVec también se utilizó en algunos sistemas integrados para el procesamiento de señales digitales de alto rendimiento.
IBM siempre dejó a VMX fuera de sus microprocesadores POWER anteriores , que estaban destinados a aplicaciones de servidor donde no era muy útil. El microprocesador POWER6 , introducido en 2007, implementa AltiVec. El último microprocesador de escritorio de IBM, el PowerPC 970 (apodado "G5" por Apple) también implementó AltiVec con hardware similar al del PowerPC 7400 .
AltiVec es una marca registrada por Freescale (anteriormente Motorola) para la parte estándar Categoría: Vector 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 utilizada anteriormente por Apple).
El motor de banda ancha celular , utilizado en (entre otras cosas) la PlayStation 3 , también es compatible con Power Vector Media Extension (VMX) en su PPU, con SPU ISA mejorado pero arquitectónicamente similar.
Freescale está trayendo 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 llamó a 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 dejar espacio para el archivo de registro 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 extienden el procesamiento SIMD para Power ISA para admitir hasta 64 registros, con soporte para coma flotante regular, coma flotante decimal y ejecución vectorial. POWER7 es el primer procesador Power ISA en implementar Power ISA v2.06.
IBM introduce nuevas instrucciones en la categoría Vector Media Extension para operaciones con enteros como parte de la extensión VSX en Power ISA 2.07.
IBM introdujo nuevas instrucciones de vectores enteros siguiendo las codificaciones VMX como parte de la extensión VSX en Power ISA v3.0. Se introducirá 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 plantilla de vector<>
clase 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, es posible combinarlos utilizando soluciones alternativas específicas del compilador; por ejemplo, en GCC uno puede #undef vector
eliminar la vector
palabra clave y luego usar la __vector
palabra clave específica de GCC en su lugar.
AltiVec anterior a Power ISA 2.06 con VSX carece de carga desde la memoria utilizando la alineación natural de un tipo. Por ejemplo, el código siguiente requiere un manejo especial para Power6 e inferior 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.
#include typedef __vector unsigned char uint8x16_p ;typedef __vector unsigned int uint32x4_p ;...int main ( int argc , char * argv ){ / * La alineación natural de vals es 4; y no 16 como se requiere * / unsigned int vals [ 4 ] = { 1 , 2 , 3 , 4 }; uint32x4_p vec ;#si está definido (__ VSX__) || definido (_ARCH_PWR8) vec = vec_xl ( 0 , vals );#demás const 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 , permanente );#terminara 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 de abajo son ejemplos de 64 bits complemento y de resta en 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.
#include 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 , cero , cmask ); return vec_add ( vec_add ( vec1 , vec2 ), cy );}/ * Realiza ab como si el vector tuviera 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 ( enmascarar , bw ); bw = vec_perm ( bw , cero , 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 trabaja con Power8 solo necesita realizar lo siguiente.
#include typedef __vector unsigned long long uint64x2_p ;.../ * Realiza a + b usando palabras dobles de vector nativo de 64 bits * /uint64x2_p add64 ( const uint64x2_p a , const uint64x2_p b ){ return vec_add ( a , b );}/ * Realiza ab usando palabras dobles de vector nativo de 64 bits * /uint64x2_p sub64 ( const uint64x2_p a , const uint64x2_p b ){ return vec_sub ( a , b );}
Implementaciones
Los siguientes procesadores tienen AltiVec, VMX o VMX128 incluidos
Motorola / Freescale
- MPC7400
- MPC7410
- MPC7450
- MPC7445 / 7455
- MPC7447 / 7447A / 7457
- MPC7448
- MPC8641 / 8641D
- MPC8640 / 8640D
- MPC8610
- T2081 / T2080
- T4080 / T4160 / T4240
- B4420 / B4860
IBM
- PowerPC 970
- PowerPC 970FX
- PowerPC 970MP
- Xenón
- Cell BE
- PowerXCell 8i
- POTENCIA6 / POTENCIA6 +
- POTENCIA7 / POTENCIA7 +
- POTENCIA8
- PODER9
- POTENCIA10
PA Semi
- PA6T
Referencias
- ^ a b "Power ISA v.2.03" (PDF) . Power.org.[ enlace muerto permanente ]
- ^ "La historia de la CPU de Microsoft Xbox 360" . IBM. Octubre de 2015. Archivado desde el original el 20 de enero de 2008.CS1 maint: bot: estado de URL original desconocido ( enlace )
- ^ Uso de la arquitectura SIMD en paralelo de datos en videojuegos y supercomputadoras IBM Research
- ^ Implementación de arquitecturas de conjuntos de instrucciones con especificadores de archivos de registro no contiguos Patente de EE. UU. 7,421,566
- ^ "Aceleración de la carga de trabajo con la arquitectura escalar vectorial IBM POWER" . IBM. 2016-03-01 . Consultado el 2 de mayo de 2017 .
- ^ "Peter Bergner - [PARCHE, COMPROMETIDO] Agregar soporte completo de binutils Power ISA 3.0 / POWER9" .
enlaces externos
- Presentación de la unidad PowerPC SIMD
- Página AltiVec de Freescale
- Uso de la arquitectura SIMD en paralelo de datos en videojuegos y supercomputadoras
- Página de Velocity Engine de Apple (a través de archive.org)
- Comparación de rendimiento e historial de SIMD