Compilateurs

Dans la boucle ci-dessus, quel calcul est concerné par le déplacement d'expression invariante de boucle (sortie de la boucle) ? (x et y ne sont pas modifiés dans la boucle)

for (i = 0; i < n; i++)
    a[i] = b[i] * (x * y);
  1. AL'ensemble de b[i] * (x * y)
  2. Bx * y
  3. CL'affectation à a[i]
Afficher la réponse et l'explication

Réponse : B. x * y

Le déplacement d'expression invariante de boucle sort avant la boucle un calcul qui donne la même valeur à chaque itération, pour ne l'effectuer qu'une fois. x et y ne changeant pas dans la boucle, x * y a la même valeur à chaque itération ; on peut calculer t = x * y avant la boucle et écrire a[i] = b[i] * t. b[i] variant avec i, l'ensemble b[i] * (x * y) ne peut pas être déplacé. L'affectation à a[i] écrit un élément différent à chaque itération et reste dans la boucle.

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

Autres questions sur Compilateurs

  1. Dans la boucle ci-dessus, quelle transformation correspond à la réduction de force appliquée au calcul d'indice i * 4 ?
  2. Quelle est la principale raison pour laquelle la boucle ci-dessus est difficile à vectoriser avec des instructions SIMD ?
  3. Dans la fonction ci-dessus, pourquoi le compilateur ne peut-il pas, en l'état, sortir de la boucle la lecture de *b ?
  4. 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 ?
  5. Lorsqu'un « déversement » (spill) se produit lors de l'allocation de registres, qu'advient-il du code généré ?

Comparatifs sur ce thème