Was bedeutet Vektorisierung?

Was bedeutet Vektorisierung?


Ist es eine gute Idee, den Code zu vektorisieren? Was sind gute Praktiken in Bezug darauf, wann es zu tun ist? Was passiert darunter?


Antworten:


Vektorisierung bedeutet, dass der Compiler erkennt, dass Ihre unabhängigen Anweisungen als eine SIMD-Anweisung ausgeführt werden können. Ein übliches Beispiel ist, wenn Sie so etwas tun wie


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

Es wird vektorisiert als (unter Verwendung der Vektornotation)


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

Grundsätzlich wählt der Compiler eine Operation aus, die gleichzeitig auf VF-Elementen des Arrays ausgeführt werden kann, und führt diese N/VF-mal aus, anstatt die einzelne Operation N-mal auszuführen.


Es erhöht die Leistung, stellt aber mehr Anforderungen an die Architektur.


Einige Code-Antworten


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