Saiu
On a mang´e notre pain blanc (the free lunch is over, [21]) : si la loi de Moore reste valide [6]
depuis 1975, l’augmentation du nombre de transistors par puce ne correspond plus `a une augmen-
tation de la fr´equence d’horloge. Les producteurs de processeurs g´en´eriques se sont ainsi r´eorient´es
vers une architecture multi-coeurs `a m´emoire partag´ee (Symmetric Multi-Processing ou SMP) per-
mettant l’avancement parall`ele de plusieurs fils d’ex´ecution ou threads. La complexit´e interne des
processeurs1, qui exploite le parall´elisme au niveau des instructions, doit alors se r´eduire : pour
inclure le plus grand nombre de coeurs dans une puce, chaque coeur doit occuper le moins de
place possible quitte `a renoncer aux structures de pipelining longues et quitte `a r´eduire le degr´e
(nombre de voies) de l’architecture superscalaire. Il ne s’agit pas d’un vrai choix de la part des
producteurs : c’est une n´ecessit´e due `a des limites physiques, reconnue de fa¸con presque unanime2,
qui ne sera pas remise en question `a moins d’une r´evolution technologique impr´evue. Actuelle-
ment, des processeurs avec des centaines voire milliers de coeurs sont ainsi annonc´es en cours de
d´eveloppement [4]. Or, programmer une telle puissance de calcul est loin d’ˆetre simple et l’op-
position de Knuth `a la direction prise par les constructeurs est recevable au moins dans ce sens.
Pour approcher les limites th´eoriques des performances des processeurs multi-coeurs un mod`ele de
programmation diff´erent s’impose, tout au moins au niveau assembleur. Dans l’id´eal, plusieurs fils
d’ex´ecution devraient pouvoir avancer sur les diff´erents coeurs du syst`eme avec une distribution
de la charge uniforme et sans demander excessivement de synchronisations. On passe de la forme
de parall´elisme au niveau des instructions `a celle au niveau des tˆaches, une forme qui ne peut pas
ˆetre «d´eduite»automatiquement par le processeur mais qui, au contraire, demande que le code
soit explicitement parall`ele, c’est-`a-dire d´ecoup´e en «tˆaches», threads ou processus. Ce d´ecoupage
n’est pas une pratique nouvelle : une utilisation explicite de la concurrence est parfois pertinente
dans la construction d’interfaces graphiques ou logiciels interactifs ; mais, il s’agit d’un besoin de
modularit´e du programme, d’expressivit´e, plutˆot qu’un souhait de parall´elisation afin d’am´eliorer
les performances. Toutefois, quelque soit l’objectif, les d´eveloppeurs qui pratiquent la program-
mation concurrente s’exposent aux risques d’un mod`ele intrins`equement complexe o`u le partage
de donn´ees mutables, c’est-`a-dire non persistantes, et les synchronisations explicites sont monnaie
courante. Cette forme de contrˆole explicite reste donc une technique de bas niveau essentiellement
imp´erative, qui contraste avec le style fonctionnel et qu’il serait souhaitable de cacher derri`ere un
style de programmation de plus haut niveau.
Les techniques de programmation parall`ele le plus couramment utilis´ees ne sont pas de haut
niveau, que le mod`ele de parall´elisme soit `a squelettes algorithmiques (skeleton programming), `a
flot de donn´ees (dataflow), ou data-parall`ele imbriqu´e (nested data parallel), et que le paradigme
de programmation soit au d´epart imp´eratif, fonctionnel, logique ou autre. Dans le cadre imp´eratif,
le syst`eme OpenMP [19] m´erite d’ˆetre cit´e comme une tentative plutˆot r´eussie d’extension du C
et de Fortran avec des constructions de haut niveau pour le parall´elisme explicite avec partage de
m´emoire.
Plusieurs tentatives existent aussi dans le cadre fonctionnel quoique les tentatives se soient
sold´ees par des ´echecs en parall´elisme implicite pur. Avec moins d’ambition mais, sans doute, plus
de r´ealisme `a court terme, on peut imaginer l’introduction d’annotations ou de constructions
syntaxiques sp´ecifiques `a la parall´elisation de certaines parties du programme, ce qui est
notamment le cas avec les constructions future ou let-par [5, 15, 7, 14, 18]. Ainsi, le langage
JoCaml [8] est une extension de OCaml inspir´e par le Join Calculus, un mod`ele de la concurrence
`a ´echange de messages proche du π-calcul. Ce syst`eme, tout comme le cadre MPI, correspond `a
un mod`ele de processus `a environnement local.`
A contrario, notre ´etude repose sur un mod`ele `a
m´emoire partag´ee, c’est-`a-dire un mod`ele de concurrence `a environnement global.
Dans cette multitude de possibilit´es, le paradigme fonctionnel semble constituer, a priori, une
meilleure base pour l’analyse automatique par la simplicit´e de sa s´emantique et de son mod`ele
d’ex´ecution.
1Dans ce contexte, nous ignorerons la distinction entre coeur et CPU
2Il existe sur ce choix l’opinion divergente de Donald Knuth [16], qui aurait insist´e dans la direction monoprocesseur
pour les difficult´es ´evidentes de la programmation de telles machines.
2