Compilateurs

Dans la boucle ci-dessus, quelle transformation correspond à la réduction de force appliquée au calcul d'indice i * 4 ?

for (i = 0; i < n; i++)
    sum += a[i * 4];
  1. ARemplacer i * 4 par une constante calculée à la compilation
  2. BDiviser par quatre le nombre d'itérations et recopier quatre fois le corps
  3. CIntroduire une autre variable et lui ajouter 4 à chaque itération
Afficher la réponse et l'explication

Réponse : C. Introduire une autre variable et lui ajouter 4 à chaque itération

La réduction de force remplace une opération coûteuse par une opération plus légère. Au lieu de calculer i * 4 par multiplication à chaque itération, on part de j = 0 et on fait j += 4 à chaque itération ; la multiplication devient une addition. La valeur changeant avec i, elle ne peut pas être remplacée par une constante. La multiplication par 4 peut aussi être remplacée par un décalage (i << 2), autre forme de réduction de force. La recopie du corps en quatre exemplaires est le déroulage de boucle.

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

Autres questions sur Compilateurs

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

Comparatifs sur ce thème