Résumé
Depuis la machine analytique de Babbage et Lovelace, le langage machine exécuté par les processeurs consiste typiquement en une succession d'instructions dans l'ordre. Mais une mise en œuvre efficace en matériel nécessite d'exécuter des instructions en parallèle. Deux approches sont suivies respectivement dans les processeurs généralistes et les processeurs graphiques pour combler ce fossé.
Un cœur d'un processeur actuel maintient l'illusion d'une exécution séquentielle, mais traite en réalité plusieurs centaines d'instructions en vol, et les exécute dans le désordre. Ce jeu d'équilibriste repose sur de nombreux mécanismes matériels, dont la prédiction de branchements et le renommage de registres.
D'une manière analogue, les processeurs graphiques ou GPU suivent un modèle de calcul dont le parallélisme est quasi illimité, avec des centaines de milliers de threads indépendants. Un cœur de GPU maintient l'illusion d'un grand nombre de threads indépendants, mais les assemble en réalité en un plus petit nombre de convois de threads liés ensemble, ou warps, pour amortir le coût de leur gestion.
Ces deux mondes, processeurs généralistes et GPU, sont notoirement considérés comme incompatibles. En effet, ni la prédiction de branchement, ni le renommage de registres ne fonctionnent dans le contexte où plusieurs threads sont assemblés en warps. Nous verrons cependant qu'il est possible de lever cette incompatibilité en étendant les mécanismes de prédiction et de renommage, afin de concevoir des GPU à exécution dans le désordre combinant les avantages en calcul séquentiel et parallèle des deux architectures.