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