Mécanisme "stop & go" pour l'optimisation dynamique d'applications multi-coeurs
Contexte :
L'optimisation dynamique consiste
à modifier un code binaire, pendant qu'il s'exécute, afin d'améliorer
sa performance. Les coûts en temps et en mémoire d'un tel processus
d'optimisation doivent être minimisés afin que les gains qu'il engendre
les compensent largement.
Cette
approche a été utilisée dans plusieurs travaux pour optimiser les
programmes mono-threads. Un système dynamique de préchargement de
données en cache a été développé récemment à l'ICPS. Ce système insére
des instructions de pré-chargement pour les instructions d'accès
mémoire de latences trop élevées. Des accélérations significatives sont
obtenues sur beaucoup de programmes.
Cependant,
avec l'avênement des processeurs multi-coeurs, et donc le
développement maintenant presque systématique d'applications
multi-threads, cette approche est aujourd'hui plus difficilement
applicable. L'optimisation dynamique de tels programmes doit considérer
deux niveaux de transformation de code :
Un
niveau "fin" où le code de chaque thread en cours d'exécution n'est que
très peu modifié (insertion de quelques instructions).
Un
niveau plus "gros" où d'autres threads sont substitués aux threads en
cours d'exécution. Ces nouveaux threads doivent alors être capables de
reprendre l'exécution là où les anciens threads s'étaient arrêtés. Il
s'agit pour cela de définir un mécanisme appelé "stop & go" où l'on
définit des points d'arrêts possibles pour les threads, afin qu'ils
laissent les données dans un état cohérent pour la reprise de
l'exécution par d'autres threads. Ces points d'arrêts devront inclure
une synchronisation entre les threads. Un envoi de signal pourra par
exemple leur signifier de s'arrêter au prochain point d'arrêt.
Travail à effectuer :
Dans un premier temps, les points
d'arrêt du mécanisme "stop & go" devront être définis : comment
garantir un état cohérent des données, quels types de synchronisations
sont nécessaires, comment stocker les données en cours de traitement,
etc. Ensuite, il s'agira de définir un moyen de faire poursuivre
l'exécution par d'autres threads. Un prototype sera développé sur un
processeur multi-coeurs x86.
Compétences requises :
langage C, assembleur x86, linux, gout pour la compilation et l'optimisation de programmes.