Cosa significa vettorizzazione?

Cosa significa vettorizzazione?


È una buona idea vettorizzare il codice? Quali sono le buone pratiche in termini di quando farlo? Cosa succede sotto?


Risposte:


Vettorizzazione significa che il compilatore rileva che le tue istruzioni indipendenti possono essere eseguite come un'unica istruzione SIMD. Il solito esempio è che se fai qualcosa come


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

Sarà vettorizzato come (usando la notazione vettoriale)


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

Fondamentalmente il compilatore sceglie un'operazione che può essere eseguita contemporaneamente sugli elementi VF dell'array e lo fa N/VF volte invece di eseguire la singola operazione N volte.


Aumenta le prestazioni, ma pone più requisiti all'architettura.


Alcune risposte al codice


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