¿Qué significa vectorización?

¿Qué significa vectorización?


¿Es buena idea vectorizar el código? ¿Cuáles son las buenas prácticas en cuanto a cuándo hacerlo? ¿Qué sucede debajo?


Respuestas:


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


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

Será vectorizado como (usando 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 elige una operación que se puede realizar en los elementos VF de la matriz al mismo tiempo y la realiza N/VF veces en lugar de realizar la operación única N veces.


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


Algunas respuestas de código


for (int i=0;
i<16;
++i)
C[i] = A[i] + B[i];
for (int i=0;
i<16;
i+=4) {
C[i] = A[i] + B[i];
C[i+1] = A[i+1] + B[i+1];
C[i+2] = A[i+2] + B[i+2];
C[i+3] = A[i+3] + B[i+3];
}
for (int i=0;
i<16;
i+=4)
addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);
for (i = 0;
i <
1024;
i++) { C[i] = A[i]*B[i];
}
for (i = 0;
i <
1024;
i+=4) { C[i:i+3] = A[i:i+3]*B[i:i+3];
}
if(x[i] >
100) x[i] += 10;
// this will branch execution flow.
c[i] = x[i] >
100;
// storing the condition on masking vector x[i] = x[i] + (c[i] &
10) // using mask