Compilers
Wat is de belangrijkste reden dat de bovenstaande lus moeilijk te vectoriseren is met SIMD-instructies?
for (i = 1; i < n; i++)
a[i] = a[i - 1] + b[i];
- AHet resultaat a[i-1] van de vorige iteratie is nodig, zodat niet gelijktijdig kan worden berekend
- BDe elementen van de array zijn gehele getallen, die met SIMD-instructies niet kunnen worden berekend
- CAls het aantal iteraties n tijdens het compileren niet bekend is, is vectorisatie helemaal niet mogelijk
Antwoord en toelichting tonen
Antwoord: A. Het resultaat a[i-1] van de vorige iteratie is nodig, zodat niet gelijktijdig kan worden berekend
Bij vectorisatie worden bijvoorbeeld vier elementen gelijktijdig met één SIMD-instructie berekend. In deze lus is voor het bepalen van a[i] het resultaat van het voorgaande a[i-1] nodig, zodat a[1] tot en met a[4] niet gelijktijdig kunnen worden berekend. Bij een dergelijke afhankelijkheid tussen iteraties (loop-carried dependency) kan het zonder meer niet worden gevectoriseerd. Gehele getallen kunnen ook met SIMD worden berekend, en ook als het aantal tijdens de uitvoering wordt bepaald, kan worden gevectoriseerd door het restant apart te verwerken.