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];
  1. AElle a besoin du résultat de l'itération précédente a[i-1] et ne peut pas calculer simultanément
  2. BLes éléments du tableau étant entiers, les instructions SIMD ne peuvent pas les traiter
  3. 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.

S'entraîner sur ce thème Retour au thème

Autres questions sur Compilateurs

  1. Dans la fonction ci-dessus, pourquoi le compilateur ne peut-il pas, en l'état, sortir de la boucle la lecture de *b ?
  2. Pour l'allocation de registres par coloration du graphe d'interférence, quelle combinaison de ce que représentent nœuds et arêtes est correcte ?
  3. Lorsqu'un « déversement » (spill) se produit lors de l'allocation de registres, qu'advient-il du code généré ?
  4. Quel est le principal objectif de l'ordonnancement des instructions par le compilateur ?
  5. Quel effet produit l'optimisation des appels terminaux appliquée au dernier appel récursif de la fonction ci-dessus ?

Comparatifs sur ce thème