• Aucun résultat trouvé

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

1

p +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

T1

p

. 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