AltiVec

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
SIMD instrucción set extension for the PowerPC ISA

AltiVec es un conjunto de instrucciones SIMD de números enteros y punto flotante de precisión simple diseñado y propiedad de Apple, IBM y Freescale Semiconductor (anteriormente Sector de productos de 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 P.A. Semi's PWRficient PA6T. AltiVec es una marca comercial propiedad exclusiva de Freescale, por lo que Apple también se refiere al sistema como Velocity Engine y VMX (Vector Multimedia Extension) IBM y PA Semi.

Si bien AltiVec se refiere a un conjunto de instrucciones, las implementaciones en las 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. Nunca fue formalmente parte de la arquitectura PowerPC hasta esta especificación, aunque usaba formatos y sintaxis de instrucción PowerPC y ocupaba el espacio del código de operación asignado expresamente para tal 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 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 caché cuando se trabaja con flujos de datos.

También exhiben diferencias importantes. A diferencia de SSE2, VMX/AltiVec admite un "píxel" RGB especial. tipo de datos, pero no funciona en 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 "cargar/almacenar" modelo del diseño RISC de PowerPC, los registros vectoriales, al igual que los registros escalares, solo pueden cargarse y almacenarse en la memoria. Sin embargo, VMX/AltiVec proporciona un conjunto mucho más completo de "horizontal" operaciones 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 (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 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 los otros dos vectores, parametrizados por otro vector más. Esto permite manipulaciones sofisticadas en una sola instrucción.

Las versiones recientes de GNU Compiler Collection (GCC), el compilador IBM VisualAge y otros compiladores brindan elementos intrínsecos para acceder a las instrucciones de VMX/AltiVec directamente desde los programas C y C++. A partir de la versión 4, el GCC también incluye capacidades de vectorización automática que intentan crear de manera inteligente binarios acelerados VMX/Altivec sin la necesidad de que el programador use intrínsecos directamente. El "vector" type 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 firmar 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 se pueda usar para manipular variables vectoriales. También hay funciones intrínsecas sobrecargadas como "vec_add" que emiten el código de operación adecuado según el tipo de los 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.

Historial de desarrollo

La Power Vector Media Extension (VMX) fue desarrollada entre 1996 y 1998 por 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 de Apple.;s Mac OS X incluido en el compositor de gráficos de cuarzo. 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 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 consistentemente dejó a VMX fuera de sus microprocesadores POWER anteriores, que estaban destinados a aplicaciones de servidor donde no era 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 hardware similar al del PowerPC 7400.

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

El Cell Broadband Engine, utilizado (entre otras cosas) en PlayStation 3, también es compatible con Power Vector Media Extension (VMX) en su PPU, con SPU ISA mejorado pero con una arquitectura similar.

Freescale trae una versión mejorada de AltiVec a los procesadores QorIQ basados en e6500.

VMX128

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

VSX (extensión escalar vectorial)

Power ISA v2.06 introdujo instrucciones escalares vectoriales VSX que amplían el procesamiento SIMD para que Power ISA admita hasta 64 registros, con soporte para punto flotante normal, punto 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 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.

Problemas

En C++, la forma estándar de acceder al soporte de AltiVec es mutuamente excluyente con el uso de la plantilla de clase vector<> 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 mediante soluciones alternativas específicas del compilador; por ejemplo, en GCC uno puede hacer #undef vector para eliminar la palabra clave vector, y luego usar la palabra clave __vector específica de GCC en su lugar.

AltiVec anterior a Power ISA 2.06 con VSX no se 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 inferior cuando la dirección efectiva no está alineada en 16 bytes. El manejo especial agrega 3 instrucciones adicionales a una operación de carga cuando VSX no está disponible.

#include ■altivec.hTipodef __vector no firmado char uint8x16_p;Tipodef __vector no firmado int uint32x4_p;...int principal()int argc, char* argv){} /* La alineación natural de las vals es 4; y no 16 según sea necesario */ no firmado int vals[4] = {} 1, 2, 3, 4 }; uint32x4_p vec;#if defined(__VSX___) tención ocultada(_ARCH_PWR8) vec = vec_xl()0, vals);#else 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, perm);#endif}

AltiVec anterior a Power ISA 2.06 con VMX no admite 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 add y rest de 64 bits en C usando un vector con cuatro palabras de 32 bits en una máquina big-endian. Las permutas 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 ■altivec.hTipodef __vector no firmado char uint8x16_p;Tipodef __vector no firmado int uint32x4_p;.../* Realiza a+b como si el vector tuviera 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); retorno vec_add()vec_add()vec1, vec2), cy);}/* Realiza a-b 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 cero = {}0, 0, 0, 0}; uint32x4_p bw = vec_subc()vec1, vec2); bw = vec_andc()amask, bw); bw = vec_perm()bw, cero, bmask); retorno 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 ■altivec.hTipodef __vector no firmado largo largo uint64x2_p;.../* Realiza un+b usando palabras dobles vectoriales nativas de 64 bits */uint64x2_p add64()const uint64x2_p a, const uint64x2_p b){} retorno vec_add()a, b);}/* Realiza a-b usando palabras dobles vectoriales nativas de 64 bits */uint64x2_p sub64()const uint64x2_p a, const uint64x2_p b){} retorno 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
  • Xenon
  • Celular B.E.
  • PowerXCell 8i
  • POWER6/POWER6+
  • POWER7/POWER7+
  • POWER8
  • POWER9
  • Power10

P.A. semi

  • PA6T

Aplicaciones de software

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

  • Helios tiene un puerto POWER9 / POWER10 nativo con soporte para VMX.

Contenido relacionado

Realidad aumentada

Diámetro del campo modal

Controlador de dispositivo

Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save