Vectorización automática

Las primeras computadoras usualmente tenían una unidad lógica, la cual ejecutaba una instrucción en un par de operandos al mismo tiempo.

Por lo que, muchos compiladores optimizados realizan vectorización automática, donde partes de programas secuenciales son transformados a operaciones paralelas.

Todas las dependencias tienen que ser respetadas durante la ejecución para impedir resultados incorrectos o inesperados.

Además, con tipos de entero mixto, hay que tener un cuidado extra para aumentar o disminuirlos correctamente sin perder precisión en los datos.

La Precisión en los datos de tipo Float tiene que ser mantenida también, a no ser que no se este considerando el estándar IEEE-754 , en cuyo caso las operaciones serán más rápidas pero los resultados finales pueden llegar a variar ligeramente.

Para vectorizar un programa, el optimizador del compilador debe primero llegar a entender las dependencias entre las declaraciones y reorganizarlas de ser necesario.

El análisis de alias se puede utilizar para certificar que las diferentes variables acceden (o intersecan) a la misma región en la memoria.

Por ejemplo, las funciones de librería pueden vencer la optimización, si la información que procesan está dada por el llamado.

Existen algunas herramientas para analizar dinámicamente las aplicaciones existentes con la finalidad de poder evaluar el potencial latente, inherente para el paralelismo SIMD, el cual viene siendo explotable a través de avances adicionales del compilador y / o mediante cambios manuales en el código.

Un obstáculo importante para la vectorización es la verdadera dependencia de datos más corta que la longitud del vector.

A continuación, las transformaciones de componentes para este paso se demuestran utilizando el siguiente ejemplo.

Esta, relativamente, nueva técnica apunta específicamente a arquitecturas modernas SIMD con longitudes de vector corto.

[5]​ Si se usa el siguiente código como ejemplo para mostrar estas transformaciones;Dónde (P) denota un predicado guardando la declaración.

[6]​ A continuación, los predicados AltiVec se utilizan para mostrar cómo esto puede ser logrado.

Considere un ejemplo donde siempre se toma la rama externa en la línea base escalar, sin pasar por la mayoría de las instrucciones en el cuerpo del bucle.