Les architectures multi-cœur sont omniprésentes de nos jours. Celles-ci comptent désormais plusieurs dizaines de cœurs, et utilisent des hiérarchies de caches complexes, des accès mémoires non-uniformes (NUMA), et des interconnects qui ressemblent de plus en plus à de véritables réseaux. Dans ce contexte, savoir produire des applications concurrentes qui passent à l’échelle sur ces architectures demande un savoir-faire particulier. Il faudra être familier avec des problématiques de bas niveau, telles que la localité des données (hiérarchies de cache, NUMA, migration et réplication des données, problème du false sharing), les techniques de synchronisation (verrous, algorithmes lock-free, mémoires transactionnelles soft et hard), et l’ordonnancement (CFS de Linux, ULE de BSD...). À un plus haut niveau, de nouveaux langages proposés ces dernières années sont particulièrement bien adaptés à la programmation concurrente. Nous étudierons en particulier Clojure et Go. Voici le programme du cours (à titre indicatif, sujet à modifications):
Cours 1 | Architectures multicœur | [Transparents] |
Cours 2 | Algorithmes de verrouillage | [Transparents] |
Cours 3 | Algorithmique non-bloquante | [Transparents] |
Cours 4 | Mémoire transactionnelles + ordonnancement |
[Transparents TM] [Transparents ordonnancement] |
TP 1 | Architectures multicœur | [Sujet] |
TP 2 | Algorithmes de verrouillage | [Sujet] |
TP 3 | Algorithmique non-bloquante | [Sujet] |
TP 4 | Mémoires transactionnelles | [Sujet] |
Le cours commence la semaine du 19/09.
Contact: Jean-Pierre Lozi (ajouter @unice.fr à la fin de l'adresse mail).