La parallélisation de cet algorithme présente certains enjeux. Le premier est lié à la
nécessité d’équilibrer la charge de chaque processeur. Le second est lié à la nécessité
d’effectuer un parcours en largeur pour obtenir un niveau de détail homogène sur le
modèle.
Equilibrage de charge
Parallélisation 5.2
Lors de la parallélisation de la méthode surfacique nous avons partitionné l’ensemble
des tâches et attribué une partie à chaque processeur. Si cette répartition statique s’avère
efficace pour ces algorithmes, il est en tout autrement pour l’algorithme de modélisation
par octree. En effet le coût de traitement d’un noeud peut varier énormément : il peut
être très rapide dans le cas où il est plein ou très coûteux si il correspond à une zone
frontière complexe (il comporte alors beaucoup de descendants à analyser). De plus il
est très difficile de prédire à l’avance la complexité du traitement d’un noeud. Ainsi,
avec un équilibrage statique, certains processeurs risquent de devoir attendre inutilement
d’autres processeurs ayant reçu des tâches plus complexes. Ceci impose donc d’utiliser
un mécanisme permettant de rééquilibrer la charge de chaque processeur en cours
d’exécution.
(a) Parcours en profondeur (b) Parcours en largeur
Figure 5.1 Exemple de modélisation avec un délai maximal lors d’un parcours en profondeur
(à gauche) et un parcours en largeur (à droite). Lors d’un parcours en profondeur,
la plupart des calculs se concentrent sur une zone (le bras droit ici). Un parcours
en largeur permet d’obtenir des modèles de précision homogène.
Parcours en largeur
Un intérêt de la modélisation par octree pour les systèmes interactifs est la
possibi-lité d’imposer un contrôle du temps. L’algorithme explore l’arbre dans le temps imparti
et calcule à la fin une approximation pour l’occupation des noeuds indéterminés ou non
explorés (en testant un seul point central par exemple). Lorsque l’algorithme effectue le
parcours en profondeur, la plupart du temps est passé dans l’analyse précise d’une zone
bien particulière alors que le reste du modèle reste inexploré (voir figure5.1). L’arbre doit
donc être parcouru en largeur pour garantir un niveau de détail homogène. Ceci est
parti-culièrement difficile à paralléliser. En effet un simple parcours en largeur localement pour
chaque processeur ne permet pas de garantir que le modèle dans sa globalité comporte
un niveau de détail homogène (un processeur pouvant aller plus vite que les autres par
5 Octree parallélisé
exemple). Ce déséquilibre à l’instantt est caractérisé parσ(t) = max
i6=j|L
i(t)−L
j(t)|
où L
i(t) représente la profondeur du noeud traité par le processeur i à l’instant t. Plus
σ(t)est petit, meilleure sera l’homogénéité du résultat avec idéalementσ(t) = 0.
5.2.2 Principe du parallélisme adaptatif par vol de tâches
Pour répondre à ces enjeux, une stratégie développée par la communauté du
parallé-lisme consiste à effectuer une parallélisation adaptative par vol de tâches [Graham 66].
Le principe est relativement simple. L’ensemble des tâches à effectuer est attribué au
démarrage de l’application à un processeur unique de façon équivalente à la version
séquentielle. Lors de l’exécution, chaque processeur maintient une liste locale des tâches
à traiter. Chaque processeur effectue tant qu’il peut les tâches présentes dans cette liste.
Lorsque cette dernière devient vide – plus de tâches locales à effectuer – le processeur
“vole” du travail à un autre processeur choisi au hasard. Remarquons que de nouvelles
tâches peuvent être crées lors de l’exécution du programme : celles-ci sont ajoutées à la
liste locale des tâches à effectuer du processeur effectuant ces créations.
Des travaux théoriques ont permis de démontrer les performances d’une telle
straté-gie en fonction dutravail et de la profondeur de l’algorithme. Le travail correspond au
nombre total d’opérations effectuées par l’algorithme : il équivaut donc au temps
d’exé-cution séquentiel, notéT
1. La profondeur, notéeT
∞, correspond au chemin critique,
c’est-à-dire à la suite la plus longue de tâches dépendantes. Le temps d’exécution surp
proces-seurs en utilisant une stratégie par vol de tâches est alors borné par :
T
p≤ T
1p +O(T
∞)Ainsi, si la profondeurT
∞est très petite comparée au travailT
1, le temps d’exécution
parallèle est proche de l’optimal
T1p
. Dans cette situation le nombre de vols est en effet très
faible limitant les surcoûts engendrés par les vols effectués et les transferts des données
liées aux tâches.
5.2.3 Adéquation avec l’octree
L’utilisation d’une parallélisation adaptative par vol de tâches est particulièrement
bien adaptée au problème de la modélisation par octree pour plusieurs raisons.
Tout d’abord, le nombre de tâches est nettement supérieur au chemin critique.
Ce dernier correspond à la profondeur maximale de l’arbre (maximum 10 pour une
modélisation de précision de l’ordre du pixel avec des images d’un million de pixels).
Le nombre de noeuds est quant à lui exponentiel en la profondeur. Ainsi ce problème
répond parfaitement aux critères théoriques énoncés précédemment permettant d’obtenir
Modélisation volumique distribuée : détails de l’implantation 5.3
une parallélisation efficace :T
∞≪T
1.
Deuxièmement la fonction de calcul du type d’un cube ne dépend que des
coor-données et de la taille de ce cube. En supposant que les silhouettes soient disponibles
pour tous les processeurs, déplacer une tâche d’un processeur à un autre consiste donc
simplement à transférer ces données du cube. Le surcoût lié au vol de tâches est donc très
minime.
Enfin aucune dépendance entre tâches ne doit être prise en compte, celles-ci étant
implicites dans le modèle. En effet une tâche n’est créée qu’au moment où celle-ci peut
s’exécuter, c’est-à-dire lorsque le type du noeud parent a été calculé comme indéterminé.
De plus une tâche ne dépend d’aucun résultat précédent. En particulier les résultats – sous
la forme de la liste des cubes pleins – peuvent être stockés indépendamment et localement
sur chaque processeur.
5.2.4 Contrainte relâchée de parcours en largeur
Une difficulté subsiste toutefois quant au parcours en largeur. En effet l’ordre
d’exé-cution des tâches dans les systèmes par vol de tâches correspond habituellement à un
parcours en profondeur. Modifier cette politique par un simple parcours en largeur sur
chaque processeur ne fournit pas le résultat escompté comme nous l’avons
précédem-ment expliqué : aucune borne sur σ(t) n’est alors garantie. Fournir une telle garantie
nécessite l’ajout de synchronisations entre les processeurs pour éviter ces déséquilibres.
Placer des barrières de synchronisation après chaque profondeur de l’arbre permet de
ga-rantir σ(t) = 0 mais au détriment de l’efficacité de la parallélisation. Nous proposons
d’introduire une contrainte relâchée, σ(t) ≤ 1, permettant un recouvrement entre deux
profondeurs successives. Ceci est très utile pour le parallélisme tout en maintenant un
niveau de détail assez homogène. Pour cela les tâches sont organisées dans des listes
dif-férentes pour chaque profondeur. Ainsi un processeur finissant une liste de profondeurd
ne pourra directement passer à la liste de profondeurd+ 1 que si tous les processeurs
ont terminé leurs tâches de niveaud −1. Dans le cas contraire, il volera des tâches au
processeur en retard.
5.3 Modélisation volumique distribuée : détails de
Dans le document
Système de vision temps-réel pour les interactions
(Page 61-64)