Exécution spéculative

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

En informatique, l'exécution spéculative correspond au lancement anticipé d'une instruction, c'est-à-dire sans être certain que celle-ci ait réellement besoin d'être exécutée.

Types[modifier | modifier le code]

Généralement, on peut distinguer trois type d'instructions et de déclarations dans un programme:

  • celles qui doivent être exécutées de manière obligatoire.
  • celles qui n'ont pas besoin d'être exécutées car elles ne sont pas pertinentes.
  • celles qui ne sont de manière certaine dans aucun des deux groupes précédents.

Le premier groupe ne peut pas bénéficier de l'exécution spéculative car ses membres doivent dans tous les cas être exécutés.

Le second groupe peut être facilement écarté, comme le ferait l'évaluation paresseuse.

Le troisième groupe quant à lui est bien la cible de l'exécution spéculative, ses membres peuvent en effet être exécutés en concurrence avec les instructions du premier groupe jusqu'à ce qu'on puisse juger si elles sont utiles, ou si l'on doit les ranger dans le deuxième groupe. Cette concurrence signifie que l'exécution spéculative peut être parallélisée.

Utilité[modifier | modifier le code]

L'exécution spéculative est une optimisation en performance qui est utile uniquement lorsque l'exécution prématurée d'une instruction prend moins de temps et de place que son exécution normale, et ce suffisamment pour compenser la possibilité que cette instruction ait donné un résultat qui ne sera finalement pas utilisé.

Les microprocesseurs modernes utilisant un pipeline se servent de l'exécution spéculative pour réduire le coût des instructions de branchement conditionnel. Quand une instruction de branchement conditionnel est rencontrée, le processeur devine quelle voie du branchement le programme est susceptible de suivre (c'est ce que l'on appelle la prédiction de branchement), et commence à exécuter les instructions correspondantes. Si la supposition s'avère être incorrecte, tous les calculs qui ont eu lieu après le branchement sont rejetés. L'exécution prématurée est relativement peu coûteuse du fait que, sans celle-ci, les étages du pipeline impliqués dans le calcul seraient restés inactifs jusqu'à ce que le résultat du branchement soit connu. Toutefois, les instructions gaspillées utilisent des cycles d'horloge, et sur un ordinateur portable par exemple, ces cycles consomment de l'énergie. Il y a donc toujours une pénalité pour chaque branchement mal prédit. De plus en plus de processeurs (comme l'Intel Pentium II et ses successeurs) possèdent des instructions de déplacement conditionnel. Ce genre d'instruction permet de faire un déplacement de données, par exemple, entre un registre et la mémoire, uniquement si une condition est rencontrée. Il n'y a donc plus de branchement, et la pénalité provoquée par une mauvaise prédiction est moindre.

Exécution immédiate[modifier | modifier le code]

Même si elle est rarement mentionnée en tant que telle, l'exécution immédiate est aussi une forme d'exécution spéculative (bien que la situation soit compliquée par la présence d'effets de bord. L'exécution est souvent moins coûteuse car les valeurs nécessaires pour le calcul se trouvent le plus souvent sur la pile et n'ont pas besoin d'être stockées puis extraites du tas.