2009-10-04 18 views
20

¿Es una buena idea vectorizar el código? ¿Cuáles son las buenas prácticas en términos de cuándo hacerlo? ¿Qué pasa debajo?¿Qué significa vectorización?

+4

Vea también: http://stackoverflow.com/questions/1422149/what-is-vectorization/ –

Respuesta

35

Vectorización significa que el compilador detecta que sus instrucciones independientes se pueden ejecutar como una instrucción SIMD. ejemplo habitual es que si haces algo como

for(i=0; i<N; i++){ 
    a[i] = a[i] + b[i]; 
} 

Se vectorizado como (usando la notación vectorial)

for (i=0; i<(N-N%VF); i+=VF){ 
    a[i:i+VF] = a[i:i+VF] + b[i:i+VF]; 
} 

Básicamente el compilador recoge una operación que se puede realizar en los elementos de FV de la matriz en al mismo tiempo y realiza este N/VF veces en lugar de hacer la única operación N veces.

Aumenta el rendimiento, pero impone más requisitos en la arquitectura.

+3

Entonces, ¿hay algo que un programador puede hacer para garantizar la vectorización (además de activar la optimización)? – Jacob

+1

Por lo que yo sé compiladores están limitados en auto-vectorización, así que lo mejor es mantener el código tan trivial como lo puede ser. También puede verificar el código de ensamblado generado para ver si el compilador vectorizó o no. – Zed

+1

@jacob: realmente no se puede "garantizar" que, es posible que desee echar un vistazo a http://openmp.org/ para el método de contar explícitamente al compilador para vectorizar. –

3

Generación de código SSE.

Tiene un bucle con un código de matriz flotante en él matrix1 [i] [j] + matrix2 [i] [j] y el compilador genera el código SSE.

+1

SEE no es el único conjunto de instrucciones vectorial. PPC tiene Altivec y otras arquitecturas que también tienen sus propias instrucciones vectoriales. – Amok

11

Como se mencionó anteriormente, la vectorización se utiliza para hacer uso de instrucciones SIMD, que pueden realizar operaciones idénticas de diferentes datos empaquetados en grandes registros.

Una guía genérica para permitir que un compilador autovectorice un bucle es garantizar que no existan elementos de datos b/n de flujo y anti dependencias en diferentes iteraciones de un bucle.

http://en.wikipedia.org/wiki/Data_dependency

Algunos compiladores como el Intel C++/Fortran compiladores son capaces de código autovectorizing. En caso de que no haya sido capaz de vectorizar un bucle, el compilador de Intel es capaz de informar por qué no pudo hacer eso. Hay informes se pueden utilizar para modificar el código de tal manera que se convierte en vectorizable (asumiendo que es posible)

Las dependencias se tratan en profundidad en el libro 'Los compiladores optimización de arquitecturas modernas: un enfoque basado en la dependencia'

3

vectorización necesidad no se limita a un solo registro que puede contener datos de gran tamaño. Como usar el registro de bit '128' para contener datos de '4 x 32' bit. Depende de las limitaciones arquitectónicas. Algunas arquitecturas tienen diferentes unidades de ejecución que tienen registros propios. En ese caso, una parte de los datos puede alimentarse a esa unidad de ejecución y el resultado puede tomarse de un registro correspondiente a esa unidad de ejecución.

Por ejemplo, considere el siguiente caso.

for (i = 0; i < N; i ++) {

a [i] = a [i] + b [i];
}



Si estoy trabajando en una arquitectura que tiene dos unidades de ejecución, a continuación, el tamaño de mi vector se define como dos. El bucle se ha mencionado anteriormente será reformulada como

for (i = 0; i < (N/2); i + = 2)
{
a [i] = a [i] + b [i ];


a [i + 1] = a [i + 1] + b [i + 1];
}

NOTA: El 2 dentro de la sentencia for se deriva del tamaño del vector.

Como tengo dos unidades de ejecución, las dos instrucciones dentro del ciclo se alimentarán a las dos unidades de ejecución. La suma se acumulará en las unidades de ejecución por separado. Finalmente, se realizará la suma de los valores acumulados (de dos unidades de ejecución).

Las buenas prácticas son
1. Las restricciones como la dependencia (entre las diferentes iteraciones del ciclo) deben verificarse antes de vectorizar el ciclo.
2. Se deben evitar las llamadas a la función.
3. Acceso puntero puede crear alias y tiene que ser evitado.