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 el Sector de Productos Semiconductores de Motorola ), la alianza AIM . Se implementa en versiones de la arquitectura del procesador PowerPC , incluidos 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 Apple también se refiere al sistema como Velocity Engine 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 PowerPC hasta esta especificación, aunque usaba formatos y sintaxis de instrucciones PowerPC y ocupaba el espacio de código de operación expresamente asignado para tales propósitos.

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 cortos de 16 bits con o sin signo, cuatro entradas 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 de " píxel " RGB especial , pero no funciona 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 "cargar/almacenar" del diseño RISC del PowerPC , los registros vectoriales, al igual que los registros escalares, sólo pueden cargarse y almacenarse 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 (ampliados 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 registro/registro o registro/memoria. en la IA-32 .

VMX/AltiVec también es único en su soporte para una instrucción de permutación de vectores 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, parametrizados 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 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 archivos binarios acelerados VMX/Altivec sin la necesidad de que el programador utilice elementos 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 llamada "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 vectores para que el lenguaje de expresión C normal pueda usarse 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 tipos muy estricta. Por el contrario, los tipos de datos definidos por Intel para 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 del desarrollo

Power Vector Media Extension (VMX) fue desarrollada 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 sistema operativo Mac 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 compatibles con AltiVec a partir de su línea G4. AltiVec también se utilizó en algunos sistemas integrados para el procesamiento de señales digitales de alto rendimiento.

IBM constantemente 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 un hardware similar al del PowerPC 7400 .

AltiVec es una marca registrada de Freescale (anteriormente Motorola) para la categoría estándar: parte vectorial 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).

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

Freescale trae 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 orientadas al juego (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 con 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 amplían 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 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 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 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, es posible combinarlos 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.

AltiVec anterior a Power ISA 2.06 con VSX carece de carga desde la memoria mediante la alineación natural de un tipo. Por ejemplo, el siguiente código requiere un manejo especial para Power6 e inferiores 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> typedef __vector char unsigned uint8x16_p ;    typedef __vector sin firmar int uint32x4_p ;    ...int principal ( int argc , char * argv )    { /* La alineación natural de vals es 4; y no 16 como se requiere */ valores int sin signo [ 4 ] = { 1 , 2 , 3 , 4 };          uint32x4_p vec ; #si está definido(__VSX__) || definido(_ARCH_PWR8) vec = vec_xl ( 0 , valores );   #demás const uint8x16_p permanente = 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 ( baja , alta , 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, a continuación se muestran ejemplos de 64 bits addy subtracten C usando 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 los libros de matemáticas. Una máquina little-endian necesitaría una máscara diferente.

#incluir <altivec.h> typedef __vector char unsigned uint8x16_p ;    typedef __vector sin firmar 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 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 );   }/* Realiza 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 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 sólo necesita realizar lo siguiente.

#incluir <altivec.h> typedef __vector unsigned long long uint64x2_p ;     .../* Realiza a+b usando palabras dobles vectoriales nativas de 64 bits */uint64x2_p add64 ( const uint64x2_p a , const uint64x2_p b )      { devolver vec_add ( a , b );  }/* Realiza ab utilizando palabras dobles vectoriales nativas de 64 bits */uint64x2_p sub64 ( const uint64x2_p a , const uint64x2_p b )      { devolver vec_sub ( a , b );  }

Implementaciones

Los siguientes procesadores llevan incluido AltiVec, VMX o VMX128

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.[ enlace muerto permanente ]
  2. ^ "La historia de la CPU de Microsoft Xbox 360". IBM. Octubre de 2015. Archivado desde el original el 20 de enero de 2008.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  3. ^ Uso de 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 Archivado el 25 de enero de 2022 en Wayback Machine Patente de EE. UU. 7.421.566
  5. ^ "Aceleración de la carga de trabajo con la arquitectura escalar vectorial de IBM POWER". IBM. 2016-03-01. Archivado desde el original el 25 de enero de 2022 . Consultado el 2 de mayo de 2017 .
  6. ^ "Peter Bergner - [PARCHE, COMPROMETIDO] Agregue compatibilidad total con binutils 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