Compilateurs
Quelle est la principale raison pour laquelle la boucle ci-dessus est difficile à vectoriser avec des instructions SIMD ?
for (i = 1; i < n; i++)
a[i] = a[i - 1] + b[i];
- AElle a besoin du résultat de l'itération précédente a[i-1] et ne peut pas calculer simultanément
- BLes éléments du tableau étant entiers, les instructions SIMD ne peuvent pas les traiter
- CLa vectorisation est impossible si le nombre d'itérations n n'est pas connu à la compilation
Afficher la réponse et l'explication
Réponse : A. Elle a besoin du résultat de l'itération précédente a[i-1] et ne peut pas calculer simultanément
La vectorisation effectue par exemple le calcul de quatre éléments en une seule instruction SIMD. Dans cette boucle, le calcul de a[i] nécessite le résultat précédent a[i-1] ; a[1] à a[4] ne peuvent donc pas être calculés simultanément. Une telle dépendance entre itérations (dépendance portée par la boucle) empêche la vectorisation directe. Les entiers se traitent aussi en SIMD, et un nombre d'itérations connu seulement à l'exécution n'empêche pas la vectorisation si le reste est traité séparément.