Parallélisation d`une méthode d`illumination
Transcription
Parallélisation d`une méthode d`illumination
Université d’Auvergne École doctorale Sciences pour L’Ingénieur Laboratoire LAIC Thèse présentée par Rita Zrour et soutenue le 24 octobre 2007 en vue de l’obtention du Doctorat de l’Université d’Auvergne Spécialité : Informatique Titre Parallélisation d’une méthode d’illumination globale par voxels Directeurs de thèse : Fabien Feschet Rémy Malgouyres Jury M. M. M. M. M. Eric ANDRES Nicolas HOLZSCHUCH Serge MIGUET Fabien FESCHET Rémy MALGOUYRES Rapporteur Rapporteur Examinateur Directeur de thèse Directeur de thèse Remerciements Une thèse est un sujet de recherche qui demande un travail assidu bien structuré et bien ciblé permettant d’atteindre le but majeur en se limitant à une période de temps bien fixe ; cela n’est pas toujours facile. Or ce travail assidu est enrichi par les idées des personnes qui entourent le chercheur et s’en trouve facilité par leur présence. Je remercie tous les gens qui m’ont entouré et qui m’ont permis d’aller jusqu’au bout. Avant tout, je remercie les membres du jury, les professeurs Eric Andres, Nicolas Holzschuch et Serge Miguet pour leur collaboration durant l’examen de ce travail et leur participation à la soutenance. Je ne saurai jamais trop remercier Fabien Feschet et Rémy Malgouyres mes codirecteurs de thèse. Merci Fabien d’avoir toujours été disponible, merci aussi pour les idées riches, nouvelles et les directions originales que tu as proposé. Merci pour ton enthousiasme sans limite et tes encouragements aux bons moments. Merci pour ton ambition d’avancer dans la recherche jusqu’au bout en partageant tes idées avec les autres. À Rémy un grand merci pour les différentes idées très riches qui m’ont permis d’avancer dans le domaine de la synthèse d’images. Merci pour les différents conseils scientifiques variés dans différents domaines. Merci Rémy pour ton grand aide et ta colaboration en enseignement qui m’a facilité la tâche et m’a permis d’avancer sans difficultés. Merci pour ton aimabilité et ta chaleurosité. Je remercie Pierre Chatelier de m’avoir aidé largement pour comprendre et démarrer dans mon sujet de thèse ainsi que pour son aide en programmation avancée. Je remercie également Thibault Marzais avec qui j’ai partagé bien plus qu’un bureau et dont les nombreuses connaissances et les idées variées et riches m’ont aidés à avancer dans le travail de ma thèse. Merci Thibault pour ton amitié et la bonne humeur que tu as toujours. Toute ma reconnaissance à mes collègues Alexandre Faure et Fabien Tixier pour leurs différentes idées variés, leurs conseils, et leur sympathie. J’adresse également mes remerciements à Nadia Amblard, Alex Esbelin, Mustapha Fezani, Yan Gérard, Florent Madelaine, Malika More, Jean-Pierre Reveillès, et Carine Simon pour leurs conseils et leurs remarques avisées. Mes remerciements aussi à Abdel Hasbani, Frederic Jacquet, Marie-Alix LapaduHargues, Joel Toussaint, et Olivier Guinaldo pour leurs conseils et leur aide en enseignements. Merci beaucoup à celles et ceux avec qui j’ai partagé de nombreuses escales : Florent Brunet, François Champeau, Sophie Fleurdépine, Alain Gély, Aude Juquet, Anasthasia Shtiliyanova, Pascal Bleuyard, Furby, et Thibault Langendorf. Merci à mes amies : à Marina Ayoub et Sandy Rihana qui m’ont été un grand soutien et qu’elles trouvent dans mes mots l’expression de ma plus profonde amitié. i Merci à mes amis Rany, Jinane, Remond, Charbel, Raghida, Mirvatte, Corine, Rabih, Ali, Raluca, et Soumitra, et à tous mes amis Libanais à Clermont avec qui j’ai partagé des moments inoubliables. Merci à François Gaillard. Mon père j’admire toujours vos connaissances dans tous les domaines, votre culture général assez variée, votre amour pour l’apprentissage et votre curiosité scientifique. Merci pour vos conseils et votre tendresse. Merci aussi à mes grand parents et à tous mes proches pour leurs encouragements. Merci à ma soeur Catherine qui m’a toujours été un grand soutien dans différentes escales de ma vie. Merci Catherine pour ton énorme patience, ta compréhension, tes conseils toujours aussi sage. Finalement merci à mes parents qui ont tant sacrifié pour moi avec beaucoup d’amour, soutien, générosité et tendresse. Merci aussi à mes soeurs et mon frère qui m’ont tant encouragés et qui sont pour moi une source de joie et de réconfort. À mes parents ii Résumé Les méthodes d’illumination globale dans le domaine de la synthèse d’images sont devenues très populaires pour le calcul de l’éclairage de scènes en trois dimensions. Le calcul d’illumination demande parfois une mémoire et un temps de calcul importants, d’où le besoin du recours au parallélisme (division du travail sur plusieurs machines) afin de minimiser à la fois le temps de calcul et l’encombrement mémoire. Le but de cette thèse est de paralléliser la méthode d’illumination globale proposée par Chatelier et Malgouyres “A low complexity discrete radiosity method” sur des grappes de stations de travail (cluster). Cette méthode est basée sur la discrétisation de la scène en voxels. Elle utilise des notions de géométrie discrète pour résoudre le problème de la visibilité entre les éléments. Deux pistes de parallélisme sont possibles pour cet algorithme. La première suppose que les voxels sont dupliquées sur les noeuds et donc aucune distribution des données n’est effectuée. Deux parallélisations sont prévues dans ce cadre, la première est une distribution du calcul et la deuxième est une parallélisation locale qui distribue les voxels de la scène parmi plusieurs threads. La deuxième piste consiste à distribuer les données entre les noeuds d’un cluster. Elle est plus complexe que la première et demande des échanges de données entre les noeuds afin de mettre à jour correctement l’illumination des voxels. Les différentes parallélisations effectuées dans ce travail ont permis de minimiser le temps de calcul et la mémoire permettant ainsi de traiter de grandes scènes qui n’entrent pas en mémoire d’un unique ordinateur avec un temps de calcul optimisé. iii iv Abstract The global illumination methods are becoming very popular for simulating lighting effects of 3D scenes in the domain of image synthesis. The computation of global illumination is expensive in terms of time computation and memory resources which leads researchers to parallelize such computations on a distributed memory system trying to minimize both time and memory. The purpose of this work is to parallelize the global illumination method proposed by Chatelier et Malgouyres, “A low complexity discrete radiosity method” on a cluster of workstations. This method is based on the discretization of the scene into voxels. It uses notions of discrete geometry in order to solve the visibility problem. Two ways are possible for the parallelization of this algorithm. The first one supposes that the voxels are duplicated on the cluster machines and so no data distribution is accomplished. Two parallelizations are studied in this case. The first one is the distribution of the computation and the second one is a local parallelization that distributed the voxels of the scene among threads. The second way consists in distributing data between the cluster machines. It is more complex than the first stage since it demands data exchange between the machines in order to correctly update the illumination of voxels. The different parallelizations accomplished in this work allowed the minimization of the computation time as well as memory resources offering though the capability to treat large scenes that do not fit in memory of one machine within an optimized computation time. v vi Table des Matières Liste des figures xi Introduction 1 1 Parallélisme et architectures parallèles 1.1 Machine de Von Neumann . . . . . . . . . . . . . . . . . . . 1.2 Classification des architectures parallèles (Flynn) . . . . . . 1.3 Distribution ou partage de la mémoire . . . . . . . . . . . . 1.4 Classification unifiée réelle des architectures . . . . . . . . . 1.4.1 Les machines MIMD . . . . . . . . . . . . . . . . . . 1.4.2 Les machines SIMD . . . . . . . . . . . . . . . . . . . 1.5 Parallélisme de données et du contrôle . . . . . . . . . . . . 1.6 Critère d’évaluation . . . . . . . . . . . . . . . . . . . . . . . 1.6.1 Efficacité . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.2 Accélération . . . . . . . . . . . . . . . . . . . . . . . 1.7 Multi-ordinateurs et Communication . . . . . . . . . . . . . 1.7.1 Propriétés des réseaux d’interconnexion . . . . . . . . 1.7.2 Les modèles de communication . . . . . . . . . . . . 1.7.3 Logiciel de communication pour les multi-ordinateurs 1.8 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Illumination globale, radiosité et parallélisme 2.1 Réflexion et réfraction . . . . . . . . . . . . . . . . . 2.2 Modèles d’éclairement . . . . . . . . . . . . . . . . . 2.2.1 Le modèle diffus idéal ou modèle Lambertien . 2.2.2 Le modèle spéculaire . . . . . . . . . . . . . . 2.2.3 BRDF : Bidirectional Reflectance Distribution 2.2.4 Angle solide, radiance et irradiance . . . . . . 2.2.5 Illumination locale . . . . . . . . . . . . . . . 2.2.6 Illumination globale . . . . . . . . . . . . . . . 2.3 Méthodes par lancer de rayons . . . . . . . . . . . . . 2.3.1 Pixels et rayons . . . . . . . . . . . . . . . . . 2.3.2 Modèle simple de lancer de rayons . . . . . . . vii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 8 10 11 11 13 14 14 14 15 15 15 16 17 21 . . . . . . . . . . . 23 25 25 26 27 27 28 29 29 30 30 30 2.4 2.5 2.6 2.7 2.3.3 Algorithmes par lancer de rayons . . . . . . . . Radiosité . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4.1 Equation de la radiosité . . . . . . . . . . . . . 2.4.2 Discrétisation de l’équation de radiosité . . . . . 2.4.3 Résolution de l’équation de radiosité . . . . . . 2.4.4 Algorithmes avancés de radiosité . . . . . . . . 2.4.5 Radiosité utilisant l’approche Monte Carlo . . . 2.4.6 Autres algorithmes de radiosité . . . . . . . . . État de l’art : parallélisation des méthodes de radiosité 2.5.1 Parallélisation de la radiosité progressive . . . . 2.5.2 Parallélisation de la radiosité hiérarchique . . . 2.5.3 Autres méthodes . . . . . . . . . . . . . . . . . Illumination globale aujourd’hui . . . . . . . . . . . . . Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Méthode d’illumination globale par voxels : Algorithme et étude de convergence 3.1 Notion de géométrie discrète . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 Voxel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 Adjacence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.3 Chemin et connexité . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.4 Un k-Chemin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.5 Composante connexe . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.6 Droites discrètes . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.7 Autres objets discrets . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.8 Partitionnement de l’espace . . . . . . . . . . . . . . . . . . . . . 3.2 La Radiosité : définition et équation . . . . . . . . . . . . . . . . . . . . . 3.3 Résolution de l’équation : méthode quasi-linéaire . . . . . . . . . . . . . . 3.3.1 Partitionnement de l’espace et visibilité . . . . . . . . . . . . . . . 3.3.2 Ordres lexicographiques . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 Calcul de l’ensemble des directions . . . . . . . . . . . . . . . . . 3.3.4 Étapes de l’algorithme . . . . . . . . . . . . . . . . . . . . . . . . 3.3.5 Complexités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Étude de convergence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.1 Scène de référence . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.2 Mesure d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.3 Résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . viii 30 35 35 36 39 41 45 46 47 48 50 52 53 54 55 55 56 56 57 57 58 58 59 59 61 62 63 63 65 65 67 69 70 71 71 72 74 4 Parallélisation locale et distribution du calcul 4.1 Description des machines utilisées pour le calcul parallèle . . . . . . . 4.1.1 Cluster Isima . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.2 Cluster Laic . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Parallélisation locale . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Threads et programmation multithreadée . . . . . . . . . . . . 4.2.2 Utilisation des threads dans la méthode d’illumination globale 4.3 Distribution du calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 Résultats de la parallélisation . . . . . . . . . . . . . . . . . . . . . . 4.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Distribution des données par répartition des listes 5.1 Description générale de la méthode . . . . . . . . . . . . . . . 5.2 Tri des directions . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Ordre lexicographique . . . . . . . . . . . . . . . . . . 5.2.2 Directions voisines . . . . . . . . . . . . . . . . . . . . 5.2.3 Tri final . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Distribution statique et dynamique des listes . . . . . . . . . . 5.3.1 Distribution statique des listes . . . . . . . . . . . . . . 5.3.2 Distribution dynamique des listes . . . . . . . . . . . . 5.4 Remplissage et échange des données . . . . . . . . . . . . . . . 5.5 Fusion des données . . . . . . . . . . . . . . . . . . . . . . . . 5.6 Étapes de l’algorithme d’illumination par répartition des listes 5.7 Parallélisation locale et distribution des données . . . . . . . . 5.8 Résultats et discussion . . . . . . . . . . . . . . . . . . . . . . 5.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Distribution des données par division de la scène 6.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Division de la scène . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Approche par topologie cartésienne et communications non bloquantes 6.3.1 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.2 Application de la parallélisation . . . . . . . . . . . . . . . . . . 6.3.3 Résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Approche par communications collectives . . . . . . . . . . . . . . . . . 6.4.1 Matrices de communication . . . . . . . . . . . . . . . . . . . . 6.4.2 Remplissage de voxels . . . . . . . . . . . . . . . . . . . . . . . 6.4.3 Envoi et Réception . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.4 Mise à jour d’illumination . . . . . . . . . . . . . . . . . . . . . 6.5 Résultats et discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.5.1 Comparaison des deux approches de division de la scène . . . . 6.5.2 Parallélisation locale et distribution des données . . . . . . . . . ix . . . . . . . . . 75 75 76 76 76 76 78 85 88 88 . . . . . . . . . . . . . . 91 91 93 93 94 95 95 96 98 100 103 103 104 105 108 . . . . . . . . . . . . . . 109 109 110 111 111 113 113 115 115 118 118 119 119 121 122 6.5.3 6.6 6.7 Comparaisons de distribution des données par répartition des listes et par division de la scène . . . . . . . . . . . . . . . . . . . . . . 123 Cumul les données et communications collectives . . . . . . . . . . . . . . 125 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 7 Améliorations de l’algorithme séquentiel et sa parallélisation 7.1 Amélioration de l’algorithme séquentiel . . . . . . . . . . . . . . 7.1.1 Résultats . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.2 Parallélisation locale . . . . . . . . . . . . . . . . . . . . 7.1.3 Parallélisation des données par division de la scène . . . 7.2 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 129 130 131 133 135 Conclusion 137 A Scènes en 3D 139 Bibliography 143 x Table des figures 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 Machine de Von Neumann . . . . . . . . . . . . . . . . . . . . . . . . . . Classification de Flynn . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un réseau de machines à mémoire partagée . . . . . . . . . . . . . . . . . Un réseau de machines à mémoire distribuée . . . . . . . . . . . . . . . . Classification unifiée des ordinateurs parallèles . . . . . . . . . . . . . . . Mémoire physiquement centralisée . . . . . . . . . . . . . . . . . . . . . . Mémoire physiquement distribuée . . . . . . . . . . . . . . . . . . . . . . Différentes topologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hypercube de dimension 0, 1, 2 et 3 respectivement . . . . . . . . . . . . Un cube connecté de dimension trois . . . . . . . . . . . . . . . . . . . . Une arbre binaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Communications collectives . . . . . . . . . . . . . . . . . . . . . . . . . Le reduce, additionnant des données de tous les processeurs . . . . . . . . Une topologie virtuelle de 16 processeurs . . . . . . . . . . . . . . . . . . Division d’un groupe en deux groupes chacun ayant son propre intracommunicateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le modèle spéculaire de Phong . . . . . . . . . . . . . . . . . . . . . . . Le modèle Lambertien . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le modèle spéculaire de Phong . . . . . . . . . . . . . . . . . . . . . . . Une BRDF et ses quatre paramètres (θin , φin , θout , φout ) . . . . . . . . . . Angle solide pour une petite surface [SP94] . . . . . . . . . . . . . . . . . Le rayon d’éclairement . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rayon réfléchi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La radiosité au point x depuis y dépend de la distance entre x et y et de leurs orientations respectives . . . . . . . . . . . . . . . . . . . . . . . . . Nusselt : illustration géométrique du facteur de forme . . . . . . . . . . . Hémi-cube : calcul du facteur de forme . . . . . . . . . . . . . . . . . . . Rassemblement des rayons provenant de plusieurs patchs vers le patch i . Envoie de l’énergie du Patch i vers les autres patchs . . . . . . . . . . . . Le quadtree utilisé pour la subdivision des éléments . . . . . . . . . . . . Clustering : Pour des objets éloignés une seul lien est suffisant . . . . . . Clustering : Pour des objets proche plusieurs liens sont nécessaire pour plus de précision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi 8 9 10 10 11 12 12 16 16 17 17 19 19 20 21 25 26 27 28 28 31 31 37 40 40 43 43 44 45 45 2.16 Génération locale de droites . . . . . . . . 2.17 Génération globale de droites utilisant une of lines) . . . . . . . . . . . . . . . . . . . 2.18 Interface virtuelle [RAPP97] . . . . . . . . 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 3.20 3.21 3.22 3.23 4.1 4.2 4.3 4.4 4.5 4.6 . . . . . . . . . . . . . . . . . génération parallèle (Bundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le point x et ses 4 voisins . . . . . . . . . . . . . . . . . . . . . . . . . . Le point x et ses 8 voisins . . . . . . . . . . . . . . . . . . . . . . . . . . Le point x et ses 6 voisins . . . . . . . . . . . . . . . . . . . . . . . . . . Le point x et ses 18 voisins . . . . . . . . . . . . . . . . . . . . . . . . . . Le point x et ses 26 voisins . . . . . . . . . . . . . . . . . . . . . . . . . . Une droite continue sur une grille. Cette droite peut intersecter plusieurs arêtes de la grille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Une droite discrète 2D : différente épaisseur avec (a, b) = (2, 1) . . . . . . Une droite 3D discrète ayant un vecteur directeur (10, 7, 3) et ses deux projections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Etant donné une direction ~σ et un point x, V (x, y) est une fonction de visibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le parcours des voxels dans un ordre quelconque . . . . . . . . . . . . . . Le parcours des voxels dans l’ordre lexicographique garantit la visibilité entre les voxels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le choix de l’ordre lexicographique dépend du vecteur direction de la direction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . L’ensemble de directions est construit à partir d’une sphère discrète . . . La propagation de la lumière dans les listes . . . . . . . . . . . . . . . . . Une scène 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Temps de calcul en fonction du nombre de directions de l’algorithme séquentiel d’illumination pour la scène d’un salon . . . . . . . . . . . . . . Temps de calcul en fonction du nombre de directions . . . . . . . . . . . Effet de la variation du rayon de la sphère discrète sur l’erreur. Pas d’Epsilon Effet de la variation du rayon de la sphère discrète sur l’erreur. Epsilon=10−5 Effet de la variation du rayon de la sphère discrète sur l’erreur. Epsilon=10−7 Effet de la variation du nombre d’itérations sur l’erreur. Pas d’Epsilon . . Effet de la variation du nombre d’itérations sur l’erreur. Epsilon=10−5 . . Effet de la variation du nombre d’itérations sur l’erreur. Epsilon=10−7 . . Quatre activités exécutées en séquentiel . . . . . . . . . . . . . . . . . . . Quatre activités exécutées en parallèle . . . . . . . . . . . . . . . . . . . Des voxels classés dans l’ordre lexicographique et leur (i, j) pour une direction donnée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Distribution des voxels sur trois threads . . . . . . . . . . . . . . . . . . Création d’une structure de données distincte pour chacun des threads . Regroupement des données des threads . . . . . . . . . . . . . . . . . . . 47 47 53 56 56 57 57 57 58 60 60 62 63 64 64 65 66 68 69 70 71 71 73 73 73 73 76 77 79 79 80 81 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 6.1 6.2 Après le regroupement des listes, les listes sont distribuées entre les threads qui vont y propager la lumière . . . . . . . . . . . . . . . . . . . . . . . . Le regroupement peut être évité . . . . . . . . . . . . . . . . . . . . . . . L’effet de la variation du nombre de threads sur le temps . . . . . . . . . Temps en fonction du nombre de directions scène d’une cabine . . . . . . Temps en fonction du nombre de directions scène de l’église . . . . . . . . Temps en fonction du nombre de directions scène de la salle de travail . . Distribution du calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Echange d’illumination entre les voxels dupliqués sur les noeuds . . . . . Distribution du calcul effectuée sur la scène d’un salon utilisant 2000 directions et 6 itérations . . . . . . . . . . . . . . . . . . . . . . . . . . . Distribution du calcul effectuée sur la scène d’un salon utilisant 4597 directions et 6 itérations . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 82 83 83 84 84 85 86 87 88 La distribution des listes sur 3 noeuds différents . . . . . . . . . . . . . . 92 La distribution des listes entre les noeuds consiste à donner à chacun des noeuds un intervalle (i, j) spécifique à traiter . . . . . . . . . . . . . . . . 94 Le nombre de voxels qui sort à l’extérieur d’un noeud sera minimisé . . . 94 Parcours de la sphère pour obtenir des directions voisines . . . . . . . . . 95 Distribution statique et déséquilibre du nombre de voxels . . . . . . . . . 96 Distribution dynamique des listes . . . . . . . . . . . . . . . . . . . . . . 97 Divisions par lignes et colonnes dépendant du nombre de noeuds . . . . . 99 L’effet d’augmention de la fréquence d’équilibrage de charge sur le temps 100 Le nombre de voxels est equilibré sur les noeuds en allant de 2 à 10 noeuds101 Distribution des données par répartition des listes entre les noeuds . . . . 102 Temps en fonction du nombre de noeuds scène de la cabine . . . . . . . . 104 Temps en fonction du nombre de noeuds scène de l’église . . . . . . . . . 104 Temps en fonction du nombre de noeuds scène de la salle de travail . . . 105 Distribution temporelle des différentes opérations (scène de l’église) . . . 106 Distribution temporelle des différentes opérations de la parallélisation (scène de la salle de travail) . . . . . . . . . . . . . . . . . . . . . . . . . 106 Accélération en fonction du nombre de noeuds pour trois différentes scènes106 Accélération en fonction du nombre de noeuds pour la scène de l’église . 106 Accélération en fonction du nombre de noeuds scène de la salle de travail 107 Temps en fonction du nombre de noeuds pour la scène de la cabine avec et sans threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Accélération en fonction du nombre de noeuds pour la scène de la cabine avec et sans threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Echanges d’illumination entre les noeuds. Les échanges concernent le premier et le dernier voxel de chaque liste et leurs voisins en terme de visibilité localisés sur les noeuds précédents ou suivants . . . . . . . . . . . . . . . 110 Distribution de la scène selon la densité . . . . . . . . . . . . . . . . . . . 111 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 6.14 6.15 6.16 6.17 6.18 6.19 7.1 7.2 7.3 7.4 7.5 7.6 Une topologie cartésienne à une dimension entre les noeuds . . . . . . . . 111 Les étapes de la transmission entre les voisins pour une topologie cartésienne112 Temps en fonction du nombre de noeuds utilisant une topologie cartésienne et des communications non bloquantes . . . . . . . . . . . . . . . 114 Accélération en fonction du nombre de noeuds utilisant une topologie cartésienne et des communications non bloquantes . . . . . . . . . . . . . 114 Distribution du temps des différentes opérations utilisant une topologie cartésienne et des communications non bloquantes pour la scène de la cabine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Distribution du temps des différentes opérations utilisant une topologie cartésienne et des communications non bloquantes pour la scène de l’église 115 Différentes étapes établies pour le calcul des matrices de communication . 117 L’effet de la compression sur les matrices de communications . . . . . . . 118 Temps en fonction du nombre de noeuds scène de la cabine . . . . . . . . 119 Temps en fonction du nombre de noeuds scène de l’église . . . . . . . . . 119 Temps en fonction du nombre de noeuds scène de la salle de travail . . . 120 Accélération en fonction du nombre de noeuds pour trois différentes scènes120 Distribution temporelle en fonction du nombre de noeuds utilisant des communications collectives pour la scène de l’église . . . . . . . . . . . . 120 Distribution temporelle en fonction du nombre de noeuds utilisant des communications collectives pour la scène de la salle de travail . . . . . . 120 Comparaison des temps des deux approches de division de la scène . . . . 122 Temps en fonction du nombre de noeuds. Comparaison des deux approches de distribution des données . . . . . . . . . . . . . . . . . . . . . 123 Accélération en fonction du nombre de noeuds. Comparaison des deux approches de distribution des données . . . . . . . . . . . . . . . . . . . . 124 Propagation de la lumière surplace : le (i, j) de chacun des voxels est calculé, la lumière est propagée entre le voxel courant et le dernier voxel de la droite (i, j). Ensuite le voxel courant est maintenu en mémoire comme étant le dernier pour la droite (i, j) . . . . . . . . . . . . . . . . . . . . . Temps en fonction du nombre de directions . . . . . . . . . . . . . . . . . Chacun des threads maintient en mémoire le premier et le dernier voxel de chacune des droites non vides . . . . . . . . . . . . . . . . . . . . . . . Temps en fonction du nombre de directions de l’algorithme séquentiel amélioré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Temps en fonction du nombre de noeuds de la distribution des données par division de la scène . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accélération en fonction du nombre de noeuds de la distribution des données par division de la scène . . . . . . . . . . . . . . . . . . . . . . . . . 131 132 133 134 135 136 A.1 Scène d’une église . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 A.2 Scène d’une salle de travail . . . . . . . . . . . . . . . . . . . . . . . . . . 140 xv A.3 Scène d’une chambre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 A.4 Scène d’une cabine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 A.5 Scène d’un salon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 xvi Introduction La nature offre des spectacles fabuleux, perçus par le système visuel humain. Parmi ces spectacles on peut citer par exemple, le coucher du soleil, l’orage, les étoiles, le clair de lune, les nuages et l’arc en ciel. De nos jours grâce aux progrès dans le domaine de la synthèse d’image, il est possible de simuler tous ces spectacles ou phénomènes naturels en utilisant des ordinateurs. Ces simulations apparaissent très réalistes de sorte qu’il n’est pas possible de discerner qu’elles correspondent à des images générées par ordinateur. Les images générées par ordinateur sont utilisées dans de nombreux domaines. Les images de synthèse peuvent être utilisées pour créer les effets spéciaux. Elles jouent un rôle important dans les jeux vidéos, qui de nos jours se rapprochent de plus en plus du cinéma et constituent une industrie en pleine effervescence. Le domaine de la médecine se sert aussi des images de synthèse pour simuler virtuellement les opérations facilitant par là, la tâche des médecins. Finalement la génération d’images par ordinateur est très utilisée dans le domaine de l’architecture qui nécessite la reconstruction des bâtiments avec une simulation précise de l’ambiance lumineuse des pièces intérieures. La génération d’images de synthèse la plus réaliste possible requiert une prise en compte des phénomènes optiques comme la réflexion et l’interaction lumière matière permettant de simuler le trajet de la lumière partant d’une source lumineuse et interagissant avec les objets de la scène. Les méthodes d’illumination globale permettent la simulation de tels phénomènes optiques en prenant en compte non seulement les effets directs d’éclairement mais aussi les effets indirects résultant des inter-réflexions entre les surfaces. Les premières générations d’images de synthèse ne fournissaient pas des images très réalistes. Ce n’est que dans les années 80 que les méthodes de rendu réaliste, le lancer de rayons(ray tracing) et la radiosité sont apparus. Avec le temps, plusieurs méthodes d’illumination globale ont été proposées comme les méthodes avancées de radiosité, les méthodes basées sur le lancer de rayons (photon mapping) et les méthodes à base de Monte Carlo. Pour ces algorithmes d’illumination globale, lorsque le réalisme et la précision sont de rigueur, le temps de calcul de la simulation peut augmenter surtout quand il s’agit de scènes complexes. On utilise alors largement le parallélisme qui est l’approche idéale pour minimiser le temps de calcul et les ressources mémoire. Le travail de ce mémoire consiste à paralléliser l’algorithme de P. Chatelier et R. Malgouyres dans [CM06] sur le calcul d’illumination par voxels. 1 Introduction 2 Cet algorithme se caractérise par le calcul de la visibilité avec une complexité optimale. Il est basé sur la discrétisation des surfaces en voxels pour le calcul d’illumination. Un ensemble de directions utilisé pour le calcul d’illumination est généré à partir d’une sphère discrète. Plusieurs itérations sont nécessaires pour garantir la convergence vers la bonne solution d’illumination. Des listes de visibilité sont construites. Ces listes contiennent les voxels de la scène qui sont voisins en terme de visibilité. À chaque changement de direction, de nouvelles listes de visibilité sont créées et une phase de mise en place et de propagation de lumière dans les listes est mise en oeuvre. La propagation concerne les voxels voisins en terme de visibilité. La complexité de l’algorithme est linéaire et augmente en fonction du nombre d’itérations ainsi que du nombre de directions. Objectif et problématique L’algorithme d’illumination de P. Chatelier et R. Malgouyres [CM06] inclut une grande constante, égale au nombre d’itérations multiplié par le nombre de directions et dont dépend directement la complexité. La complexité est aussi liée au nombre de voxels présents dans la scène. Quand ces nombres augmentent, le parallélisme offre un moyen de réduire la complexité en influençant sur le temps de calcul ainsi que les ressources mémoire. Le but de cette thèse est de paralléliser l’algorithme d’illumination globale [CM06] sur des machines à mémoire distribuée, des grappes de stations de travail ou cluster. Cela permettra d’accélérer le temps de calcul de l’algorithme d’illumination et aussi de traiter de grandes scènes qui n’entrent pas en mémoire RAM tout en minimisant au plus le temps de calcul. Plusieurs approches permettant de réaliser cet objectif sont possibles. Deux pistes de parallélisme sont conçues pour cet algorithme, la première regroupe la distribution du calcul et la distribution locale et la deuxième comprend la distribution des données. Elles peuvent se résumer comme suit : Distribution du calcul et distribution locale La dépendance de l’algorithme sur le nombre de directions (pouvant atteindre quelques milliers) crée une première piste pour une première parallélisation. C’est une distribution du calcul, répartissant les directions entre les noeuds du cluster. Cette première parallélisation est assez aisée, traitant des calculs relativement indépendants, et nécessitant ainsi très peu d’échanges entre les noeuds du cluster. Elle ne distribue pas les données, les voxels sont dupliqués sur tous les noeuds. Une deuxième parallélisation est également possible pour cet algorithme, c’est la distribution locale, qui suppose que les données soient toutes présentes en mémoire d’un noeud ; elle distribue les voxels entre des threads pour être traités en parallèle. Ces deux parallélisations sont intéressantes pour minimiser le temps de calcul, mais elles ne distribuent pas les données et elles ne sont donc pas valables quand les scènes dépassent en taille la mémoire RAM d’un noeud. Introduction 3 Distribution des données L’affaire commence à se compliquer et devient plus sérieuse lorsqu’on désire traiter de grandes scènes qui n’entrent pas en mémoire et qui nécessitent alors la distribution des données et donc des voxels. Dans l’algorithme d’illumination, la dépendance en terme de visibilité entre les voxels rend difficile la procédure de la parallélisation des données. En effet pour le calcul d’illumination deux voxels voisins en terme de visibilité doivent être localisés sur un même noeud pour pouvoir échanger la lumière. Si ce n’est pas le cas, une communication entre les noeuds, à l’aide d’une librairie de communications (MPI), doit être faite pour accomplir cet échange. Ne pas oublier dans ce cadre que l’augmentation du nombre et de la quantité de communications engendre des pertes en temps de calcul. La problématique qui se pose est de trouver la meilleure manière de paralléliser l’algorithme de sorte à minimiser les échanges entre les noeuds. De même comment gérer les échanges en terme de structures de données, types de communication (non bloquantes, collectives...) afin de les optimiser au mieux. Il faut noter que la distribution des données constitue une partie essentielle et délicate de notre travail. Elle sera étudiée en détail avec les différentes méthodologies envisagées permettant de réaliser cet objectif. Démarche et Plan Le document que nous présentons ici est organisé de la manière suivante. Dans un premier chapitre, nous présentons une introduction au parallélisme. Nous étudions alors les différentes architectures parallèles ainsi que la distribution ou partage de la mémoire sur les machines. Nous parlerons aussi de la classification unifiée réelle des architectures ainsi que de la parallélisation du contrôle et des données. Ce chapitre donne la définition de l’efficacité et de l’accélération qui permettent l’évaluation d’un algorithme parallèle par rapport à la version séquentielle. Nous faisons aussi une étude des multi-ordinateurs et des réseaux d’interconnexion de ceux-ci, ainsi que des logiciels de communication. La communication entre les noeuds se fait à travers la librairie MPI. MPI est présentée avec ses modes de communications, ses types de données, les topologies qu’elle utilise et les notions de groupes qu’elle offre. Le Chapitre 2 présente les notions de base de synthèse d’images et d’infographie. Dans ce chapitre, on étudie les modèles d’illumination globale. On présente des notions importantes pour les échanges d’énergie comme la radiance et l’irradiance. Nous exposons aussi le principe du lancer de rayons utilisé pour la simulation des échanges énergétiques, en donnant une description des différents algorithmes qui l’utilisent. Le système d’équations utilisé pour calculer effectivement la radiosité est ensuite présenté en détail ; il faut noter dans ce cadre que la méthode d’illumination que nous cherchons à paralléliser présente des points communs avec la radiosité, notamment la résolution d’un système linéaire. Les définitions et les diverses méthodes de calcul de facteur de forme sont résumées. Enfin, les méthodes avancées de radiosité sont expliquées et un état de l’art sur les différentes parallélisations des méthodes de radiosité est détaillé. Introduction 4 Dans le chapitre suivant, nous décrivons l’algorithme séquentiel de calcul d’illumination globale par voxels, proposé par P. Chatelier et R. Malgouyres [CM06]. Ce chapitre introduit des notions de géométrie discrète qui sont essentielles pour comprendre l’algorithme séquentiel d’illumination. Ensuite l’équation de radiosité est décrite, ainsi que sa discrétisation [Mal02b]. L’algorithme de résolution de l’équation discrétisée est expliqué. Cet algorithme représente l’algorithme séquentiel d’illumination, il est basé sur des notions de géométrie notamment le partitionnement de l’espace en droites discrètes. Les droites discrètes sont les listes de visibilité pour l’algorithme séquentiel et les voxels voisins d’une même liste sont voisins en terme de visibilité. La complexité de l’algorithme est notée et les résultats testés sur différentes scènes sont montrés. Finalement une étude de convergence de l’algorithme d’illumination est réalisée, montrant l’influence du nombre d’itérations et du nombre de directions sur la solution exacte. Les Chapitres 4, 5 et 6 détaillent les différentes parallélisations de l’algorithme. Le Chapitre 4 décrit l’architecture des machines (grappes de stations de travail (cluster of workstations)) utilisées pour tester les différentes parallélisations effectuées au cours de cette thèse. Il explique la distribution locale utilisant des threads ainsi que la distribution du calcul. Aucune distribution des données n’est menée dans ce chapitre. La parallélisation locale distribue les voxels de la scène parmi les threads, les voxels sont tous présents en mémoire d’un noeud donné. La distribution du calcul se fait sur les différents noeuds et nécessite une duplication des données sur chacun des noeuds du cluster, donc aucune distribution des données n’est conduite. Le Chapitre 5 présente une distribution des données par répartition des listes. Les listes et donc les voxels sont répartis sur les différents noeuds du cluster. Une transition de voxels entre les noeuds est nécessaire à chaque direction afin de garantir une construction de listes complètes de voxels sur chacun des noeuds. Le Chapitre 6 explique la distribution des données par division de la scène en sous-environnements selon la densité des voxels. Ces sous-environnements sont distribués parmi les noeuds du cluster. Des échanges d’informations entre les voxels voisins en terme de visibilité d’une même liste mais localisés sur des noeuds distincts sont réalisés. Ce chapitre propose deux façons de mener ces échanges entre les noeuds. La première consiste à utiliser une topologie cartésienne et à effectuer des communications non bloquantes en communiquant les informations de radiosité entre les noeuds qui sont des voisins directs seulement. La deuxième consiste à utiliser des communications collectives et communiquer les informations de radiosité du noeud courant avec le noeud impliqué même s’ils ne sont pas des voisins directs. Finalement, une comparaison des deux méthodes de distribution des données (par répartition des listes (Chapitre 5) et par division de la scène) est menée pour comparer le temps de calcul de ces deux approches. Le Chapitre 7 présente une amélioration de l’algorithme séquentiel d’illumination. Nous procédons dans ce chapitre à une combinaison des deux étapes essentielles de l’algorithme séquentiel en une seule. Nous adoptons également dans ce chapitre la parallélisation des données étudiée au Chapitre 6 avec les améliorations effectuées. Les conclusions et perspectives font l’objet du dernier chapitre. Pour résumer, la distribution du calcul est la parallélisation idéale pour les scènes qui tiennent en mémoire. Introduction 5 Lorsque les scènes ne tiennent pas en mémoire RAM d’un ordinateur, une distribution des données doit être appliquée ; celle-ci distribue les données en minimisant le temps de calcul. Concernant les perspectives et dans un contexte plus général, on peut dire que la méthode séquentielle d’illumination proposée par P. Chatelier et R. Malgouyres, et parallélisée dans ce présent travail, constitue une partie importante dans le développement d’un moteur de rendu par illumination globale efficace. Dans ce chapitre, nous mettons aussi en évidence les perspectives prometteuses de l’algorithme d’illumination, algorithme qui comportera une partie d’un algorithme de lancer de rayons en cours de réalisation par le doctorant Lukasz Piwowar. Introduction 6 Chapitre 1 Parallélisme et architectures parallèles Au cours des premières années de l’histoire de l’informatique, toutes les machines furent des machines séquentielles. Ces machines utilisent un seul processeur pour résoudre un problème donné. Avec le temps, ces processeurs ont évolué et sont devenus plus rapides, néanmoins la rapidité de ceux-ci reste toujours limitée ; cette limitation vient du fait que la performance qu’un seul processeur peut atteindre reste toujours bornée. Le parallélisme s’est posé comme un concept ou une solution permettant d’améliorer les performances des ordinateurs. Dès les années 50, les premiers essais pour construire des machines parallèles ont commencé, mais c’est seulement durant les années 60 que ce concept théorique a pu être réalisé concrètement et que les premières vraies machines parallèles (des calculateurs mono-processeurs) sont apparues. Dans les années 70 les machines multiprocesseurs apparaissent. Les machines adoptées pour le calcul parallèle ont évolué avec le temps et ont atteint actuellement des capacités de traitement permettant des calculs parallèles rapides et efficaces. De nos jours le parallélisme est devenu très important et son application s’est énormément étendue. On voit alors apparaître les processeurs multi-cœurs, composés d’au moins deux cœurs sur le marché. Ce type d’architecture permet d’augmenter la puissance de calcul sans augmenter la fréquence d’horloge, et donc de réduire la quantité de chaleur dissipée. Le recours au parallélisme ouvre deux perspectives de gains : le temps de calcul et la mémoire. Ces gains offerts par le parallélisme, lui permettent d’être un outil important dans de nombreux domaines comme la modélisation et la simulation (océanographie, prédiction météorologique), l’ingénierie (la mécanique, la robotique et la chimie), en traitement d’images et imagerie médicale, en synthèses d’images, en visualisation scientifique et beaucoup d’autres domaines. Lors d’une parallélisation manuelle d’un algorithme, il est important de considérer la stratégie du parallélisme, le niveau du parallélisme ainsi que la machine adoptée. La stratégie du parallélisme est énormément liée à l’algorithme séquentiel. Elle constitue la base de la parallélisation et nécessite un découpage délicat pour la distribution des tâches ou des données entre les processeurs. Pour le niveau du parallélisme, on en distingue 7 Chapitre 1. Parallélisme et architectures parallèles 8 Fig. 1.1 – Machine de Von Neumann plusieurs ; le parallélisme peut s’effectuer au niveau du programme, de la procédure, de l’instruction ou à l’intérieur d’une instruction [CT93]. Du point de vue machine adoptée pour le calcul parallèle, plusieurs architectures existent de nos jours, le choix de celles-ci est lié à l’application souhaitée ainsi qu’à la disponibilité des machines qui parfois sont coûteuses à l’achat, ce qui limite leur disponibilité. Ce chapitre introduit différentes notions concernant le parallélisme, telles que la machine de Von Neumann, la classification des architectures parallèles, la distribution ou la partage de la mémoire, le parallélisme du contrôle et des données, et les critères d’évaluation d’un algorithme parallèle. Il traite aussi des communications qui sont à la base de toute programmation parallèle pour les multi-ordinateurs (machines à mémoire distribuée). Il décrit aussi les réseaux d’interconnexion ainsi que les modèles et la bibliothèque utilisée pour les communications dans ce genre de machines. 1.1 Machine de Von Neumann En 1945 Von Neumann écrivit un rapport dans lequel il proposa l’architecture interne d’un calculateur universel (ordinateur), connu sous le nom architecture de Von Neumann. Ce calculateur était le meilleur de son temps et constitue toujours aujourd’hui la base de tous les ordinateurs. La machine de Von Neumann est constituée de l’unité arithmétique et logique ou unité de traitement, la mémoire, l’unité de contrôle ou unité de commande, l’entrée et la sortie. La Figure 1.1 montre ce modèle. L’unité arithmétique et logique et l’unité de contrôle constituent la base ou le “cerveau” [Tan05] de l’ordinateur. 1.2 Classification des architectures parallèles (Flynn) Le terme de “parallélisme” reste cependant vague si l’on ne précise pas le type des architectures parallèles qui peut être attribué aux flots d’instructions ou aux flots de données. Le flot d’instructions est une suite d’instructions issues d’une partie contrôle Chapitre 1. Parallélisme et architectures parallèles 9 Fig. 1.2 – Classification de Flynn en direction d’un ou plusieurs processeurs. Un flot de données est une suite de données venant d’une zone mémoire en direction d’un processeur ou venant d’un processeur en direction d’une zone mémoire. La classification des architectures parallèles la plus utilisée est la classification donnée par Flynn [Fly66]. Cette classification a pour critère de sélection les modes de contrôle effectuées par les différents processeurs. Cette classification comprend 4 classes d’architectures (Figure 1.2) : – Machine SISD (Single Instruction Single Data Stream) ou Machine de Von Neumann : C’est le cas des ordinateurs séquentiels. Un ordinateur de ce type peut avoir plusieurs unités fonctionnelles de traitement qui sont dirigées par une seule unité de contrôle ; – Machine SIMD (Single Instruction Multiple Data Stream) : chaque processeur exécute simultanément la même instruction sur plusieurs données différentes. Ce type d’architecture comporte des processeurs multiples et un réseau d’interconnexion servant pour la communication processeur à processeur ou processeur à mémoire ; – Machine MISD (Multiple Instruction Single Data Stream) : chaque processeur peut exécuter plusieurs instructions sur un même ensemble de données. Ce type d’architecture correspond aux machines pipeline ; – Machine MIMD (Multiple Instruction Multiple Data Stream) : chaque processeur suit son propre flot d’instructions et traite une donnée propre. A l’inverse des machines SIMD, les machines MIMD sont asynchrones : chaque processeur évolue indépendamment des autres et peut effectuer des opérations différentes sur des données différentes au même instant. La communication de données ou des résultats entre les processeurs de fait à travers le réseau de communication. Chapitre 1. Parallélisme et architectures parallèles 10 Mémoire partagée Réseau d'interconnexion Réseau d'interconnexion Processeurs Mémoires Processeurs Mémoires caches Fig. 1.4 – Un réseau de machines à mémoire distribuée Fig. 1.3 – Un réseau de machines à mémoire partagée 1.3 Distribution ou partage de la mémoire Du point de vue organisation de la mémoire, il existe essentiellement deux types de machines, les machines à mémoire partagée et les machines à mémoire distribuée constituées d’un ou plusieurs processeurs, d’un ou plusieurs bancs mémoire et d’un réseau d’interconnexion. Ces deux types peuvent être combinés pour aboutir à un troisième type qui est la machine à mémoire virtuelle partagée. – Machine à mémoire partagée (shared memory SM) : la mémoire est partagée par tous les processeurs et donc tous les processeurs y ont accès. Dans ce type de machine le réseau d’interconnexion relie les processeurs à l’ensemble des bancs mémoire (voir Figure 1.3). Chaque processeur a accès à toute la mémoire, il s’agit alors d’un espace d’adressage global. L’inconvénient de la mémoire partagée réside dans la nécessité d’une programmation très délicate afin d’éviter les conflits d’accès à un même emplacement mémoire ; – Machine à mémoire distribuée (distributed memory DM) : chaque processeur à sa propre mémoire qui est locale. Contrairement aux machines SM, le réseau d’interconnexion ne relie pas les processeurs à l’ensemble des bancs mémoire mais relie les processeurs entre eux (Figure 1.4). L’adressage global n’est plus valable dans ce cas. La communication entre les processeurs se fait typiquement par l’envoi des messages ; – Machine à mémoire virtuelle partagée (shared virtual memory SVM) : entre les machines à mémoire partagée assurant un adressage global mais demandant une programmation délicate et les machines à mémoire distribuée plus simples à programmer mais n’assurant pas l’adressage global, il existe les machines à mémoire virtuelle partagée qui combinent les deux mémoires SM et DM. Dans ce type de machine la mémoire est distribuée physiquement mais chaque processeur a un accès à la mémoire des autres processeurs par l’intermédiaire d’un logiciel qui assure Chapitre 1. Parallélisme et architectures parallèles 11 Fig. 1.5 – Classification unifiée des ordinateurs parallèles ce partage de manière transparente. 1.4 Classification unifiée réelle des architectures De nombreux auteurs [Tan91, Akl88] ont essayé de préciser la classification de Flynn [Fly66]. Certains ont essayé de classifier les types d’architectures avec les machines actuelles [GRS92], d’autres en se basant sur ces différentes classifications ont déduit une classification de machines unifiées actuelles [Deg92, GUD96, CT93, CS99, Tan05]. La classification des architectures réelles peut se résumer comme sur la Figure 1.5 et nous allons commenter cette classification dans la suite de cette section. 1.4.1 Les machines MIMD Les machines MIMD ont plusieurs avantages par rapport aux machines SIMD. – Elles ont un parallélisme plus fort que les machines SIMD, – Elles peuvent exécuter plusieurs programmes ou des parties d’un programme sur plusieurs processeurs. Du point de vue mémoire et architectures actuelles, les machines MIMD peuvent se diviser en trois catégories. 1.4.1.1 MIMD à mémoire globale physiquement partagée ou multiprocesseurs Ces ordinateurs sont caractérisés par le fait que les processeurs ne possèdent pas de mémoire locale. La mémoire globale est partagée entre les processeurs et tout accès à cette mémoire est effectué à travers le réseau d’interconnexion. On parle alors d’une Chapitre 1. Parallélisme et architectures parallèles 12 mémoire physiquement centralisée (Figure 1.6) où les processeurs ont le même espace d’adressage et peuvent donc lire et écrire dans la mémoire partagée. Les multiprocesseurs sont faciles à programmer puisque les processeurs peuvent communiquer par simple lecture ou écriture mémoire. Un de leurs inconvénients est qu’ils sont très coûteux en prix à cause de la complexité de la mémoire partagée. Les multiprocesseurs sont divisés en trois types selon l’implémentation de la mémoire : – UMA (Uniform Memory Access) : les processeurs ont un accès uniforme à la mémoire, – NUMA (Non Uniform memory access) : les processeurs ont un accès non uniforme à la mémoire, – COMA (Cache only Memory access) : les processeurs accèdent à la mémoire à travers un cache. Le lecteur trouvera plus de détails sur les types d’implémentation mémoire dans [Tan05]. Pour ce type d’architectures, notons par exemple : SGI Cray (calculateur T3D,T3E, T90, SV1), Compaq DEC (serveurs multiprocesseurs Pentium, Alpha) et IBM (serveurs multiprocesseurs Pentium, PowerPC, PowerIII). Fig. 1.6 – Mémoire physiquement centralisée 1.4.1.2 Fig. 1.7 – Mémoire physiquement distribuée MIMD à mémoire distribuée ou multi-ordinateurs Chaque processeur dispose de sa propre mémoire privée, qu’il est le seul à pouvoir consulter. L’espace d’adressage est donc physiquement distribué. A la différence des multiprocesseurs, les multi-ordinateurs ne peuvent pas communiquer entre eux par simple lecture ou écriture, la communication ou le partage de données entre les processeurs se fait à travers le transfert de messages via le réseau d’interconnexion. Les multi-ordinateurs sont alors plus difficiles à programmer que les multiprocesseurs. Cependant, ils sont moins coûteux à construire. Ce type de machines peut se diviser en deux catégories : – MPP ou processeurs massivement parallèles : ce type de machines correspond à des superordinateurs très coûteux (plusieurs millions d’euros). Ils sont caractérisés Chapitre 1. Parallélisme et architectures parallèles 13 par un réseau d’interconnexion ayant une très haute performance accélérant la circulation des informations cas du transfert de messages. Ils sont utilisés pour des applications spécifiques. Ils sont par exemple utilisés pour des gros calculs scientifiques, industriels etc... – COW (cluster of workstations) ou grappes de stations de travail : ils ont un réseau d’interconnexion du commerce qui est moins performant que celui des MPP. Cependant, aujourd’hui à cause des réseaux d’interconnexion à haut débit, la différence entre les MPP et COW tend à se réduire. Les Intel (calculateurs IPSC,PARAGON,ASCI RED,VIA) et IBM (calculateur SP) sont des exemples des multi-ordinateurs. Le travail de cette mémoire est achevé sur grappes de stations de travail composées des machines bi-processeurs Xeon hyperthreadés. La mémoire est donc distribuée et les processeurs communiquent à travers le transfert de messages. 1.4.1.3 MIMD à mémoire distribuée virtuellement partagée Ce type de machines utilise une structure multi-ordinateurs et utilise le système d’exploitation pour générer une mémoire virtuelle partagée. Chaque processeur dispose d’une partie de la mémoire même si l’intégralité de la mémoire est accessible par tous les processeurs. La mémoire est donc distribuée mais l’espace d’adressage est partagé ; on parle alors d’une mémoire physiquement distribuée (voir la Figure 1.7). 1.4.2 Les machines SIMD En 1966, un premier projet [BBK+ 68] concernant les machines parallèles et spécifiquement la première machines SIMD (ILLIAC IV) a été lancée. Les machines SIMD n’exploitent qu’une seule forme de parallélisme, le parallélisme de données. Dans ce modèle, la même opération est appliquée sur une grande quantité de données. Ce modèle est aussi caractérisé par son fonctionnement fortement synchrone ; chaque instruction doit être complétée avant de commencer la suivante. Les architecture SIMD utilisent un grand nombre (plusieurs dizaines de milliers) de processeurs élémentaires identiques. Ils sont donc caractérisés par un très grand nombre d’unités de traitement simple. Par contre l’unité de contrôle, permettant de lancer des commandes est centralisée. La mémoire physique est distribuée et la communication entre les machines se fait à travers le réseau d’interconnexion. Parmi les machines SIMD citons, TMC (calculateurs Connection Machine) et Intel (Pentium MMX et SSE). Certaines classifications ont divisé les machines SIMD en deux catégories, les SIMD à mémoire distribuée (SIMD-DM) et les SIMD à mémoire partagée (SIMD-SM). Dans ce type de classifications, les SIMD-SM sont les machines vectorielles mono-processeurs, un contrôle et des données centralisés, et réalisant des opérations vectorielles. Les opérations sont réalisées d’une manière séquentielle en mode de fonctionnement pipeline (plus de détails se trouvent dans [GUD96]). Chapitre 1. Parallélisme et architectures parallèles 1.5 14 Parallélisme de données et du contrôle Le parallélisme peut être divisé en deux catégories : le parallélisme de données et le parallélisme du contrôle. Le parallélisme de données distribue les données entre les processeurs et chaque processeur traite une partie des données. Cela est très efficace surtout quand la quantité de données à traiter n’entre pas dans la mémoire d’un seul processeur nécessitant ainsi la division des données (machines mémoire distribuée) pour pouvoir les traiter. Le parallélisme du contrôle consiste à distribuer les tâches ou le travail séquentiel en plusieurs parties qui sont réparties entre les processeurs. Il faut noter que ces deux types de parallélisme sont très fins et demandent une distribution délicate des tâches ou des données. Dans le cas de la distribution du contrôle, des coopérations liées à une certaine dépendance entre les tâches sont demandées. Cela provient du fait que certaines tâches ne peuvent pas s’exécuter avant que d’autres ne soient finies puisque leur exécution est dépendante de celles-ci. Il existe aussi le cas où des échanges d’informations entre différentes tâches, même si elles sont indépendantes, sont nécessaires car la poursuite du calcul requiert une mise à jour de certains résultats localisés sur d’autres processeurs. La distribution de données, elle aussi, nécessite des échanges d’information si les données sont interdépendantes. Dans le cas d’une mémoire distribuée, il faut trouver une stratégie de division de données minimisant le plus les communications et évitant ainsi une perte de performance dans la parallélisation. 1.6 Critère d’évaluation Quand un algorithme est parallélisé, l’idéal serait d’obtenir un temps de calcul divisé par le nombre de processeurs, or ce n’est pas toujours le cas. En effet plusieurs paramètres interviennent dans le cas d’une parallélisation aboutissant à une certaine perte dans les performances. En général deux termes sont mesurés dans une parallélisation, l’efficacité et l’accélération. 1.6.1 Efficacité L’efficacité d’un algorithme est donnée par l’équation suivante : Efficacité = T seq T par × n où : – T seq : le temps séquentiel de l’algorithme ; – T par = max(T par(i)), i ∈ [1 . . . n] où i est le ième processeur et T par(i) le temps en parallèle du processeur i ; – n : nombre de processeurs. L’efficacité maximale d’un algorithme est alors 1. Chapitre 1. Parallélisme et architectures parallèles 1.6.2 15 Accélération L’accélération d’un algorithme est très similaire à celle de l’efficacité. Elle est définie par l’équation suivante : Accélération = T seq T par où : – T seq : le temps séquentiel de l’algorithme, – T par =max(T par(i)), i ∈ [1 . . . n] où i est le ième processeur et T par(i) le temps en parallèle du processeur i. 1.7 1.7.1 Multi-ordinateurs et Communication Propriétés des réseaux d’interconnexion Les caractéristiques des réseaux d’interconnexion des machines à mémoire partagée (SM) et ceux à mémoire distribuée (DM) sont très différentes. Les machines SM nécessitent une bande passante (débit, quantité d’information acheminée par unité de temps) plus grande. Cela vient du fait que ce type de machines achemine une quantité de données plus grande pour alimenter les processeurs. Concernant la latence (le temps mis par le réseau pour réaliser le service demandé) elle doit être plus petite pour les machines SM pour pouvoir garantir des communications rapides. Enfin le réseau d’une machine SM a un adressage global et nécessite alors un acheminement d’information entre le bus de données d’un processeur et un banc mémoire. De nombreuses études ont été faites concernant les réseaux d’interconnexion [Lei91, dR94, GUD96, CT93]. Dans les machines DM, les réseaux d’interconnexion sont appelés topologies et les processeurs reliés par ce réseau sont les noeuds du réseau. Notons quelques définitions et notations permettant de caractériser les réseaux d’interconnexion : – Le degré d’un noeud : le degré d’un noeuds est égal au nombre de ses arêtes adjacentes ; – L’excentricité : l’excentricité d’un sommet est la plus grande distance de ce sommet à un sommet quelconque du graphe ; – Le diamètre : le diamètre D est défini comme le maximum des excentricités des sommets du graphe. Il doit être faible pour permettre des communications efficaces ; – Les sous-topologies : il est préférable qu’elles soient simples (anneaux et tores) ; – Régularité : la régularité du réseau offre un avantage au programmeur lui facilitant la compréhension du réseau et lui permettant ainsi de profiter de sa structure. La topologie la plus simple est la topologie en réseau linéaire, suivie de la topologie en réseau d’anneau. Dans un réseau linéaire, les noeuds ont un ordre croissant de 0 à n − 1, n étant le nombre de noeuds ; chaque noeud possède deux voisins à l’exception du premier et du dernier qui n’en ont qu’un. Dans un anneau tous les noeuds possèdent deux Chapitre 1. Parallélisme et architectures parallèles 16 Fig. 1.8 – Différentes topologies représentant respectivement, un réseau linéaire, un anneau de six processeurs, une grille 2D 4 × 5 et une grille torique 4 × 5 Fig. 1.9 – Hypercube de dimension 0, 1, 2 et 3 respectivement voisins. On trouve aussi la structure de grille où chaque processeur a quatre voisins à l’exception des processeurs situés dans les première et dernière lignes et ceux des première et dernière colonnes. La grille torique est similaire à la grille mais les processeurs des premières et dernières lignes et ceux des premières et dernières colonnes sont reliés. La Figure 1.8 montre une illustration de ces différentes topologies. Une topologie ayant des communications très efficaces est l’hypercube. L’hypercube de degré n est un réseau à 2n noeuds où chaque noeud a exactement n voisins. La Figure 1.9 montre un exemple d’un hypercube de degré 0, 1, 2 et 3. La topologie de l’hypercube possède un inconvénient : son degré n’est pas borné, empêchant la réalisation de la machine physique. Il existe encore d’autres topologies citons, le cube connecté en cycles de dimension n qui consiste à relier un hypercube de chemins n et des anneaux de dimension n. Son degré est 3 (Figure 1.10). Citons également la topologie en arbre binaire constituée d’un arbre de 2n − 1 sommets, où tous les sommets non terminaux ont exactement deux fils (Figure 1.11) ainsi que les réseaux de Bruijn [CT93] et les réseaux Star et Pancake [CNR92]. 1.7.2 Les modèles de communication Les machines à mémoire distribuée ont plusieurs formes de communications. On peut distinguer les deux modes synchrone et asynchrone ainsi que les modes bloquant et non Chapitre 1. Parallélisme et architectures parallèles Fig. 1.10 – Un cube connecté de dimension trois 17 Fig. 1.11 – Une arbre binaire bloquant. 1.7.2.1 Les modes synchrone et asynchrone Le mode synchrone peut être vu comme un mode de communication par rendez-vous. L’envoi et la réception d’un message se font en même temps. Ce mode a pour avantage la sûreté de la réception du message. Ce mode possède néanmoins un inconvénient : le rendez-vous engendre parfois de longs temps d’attente. Le mode asynchrone n’a pas un point de rendez-vous, les envois et les réceptions des messages ne se passent pas en même temps mais se font à des instants quelconques. 1.7.2.2 Les modes bloquant et non bloquant Ces deux modes font partie du mode de communication asynchrone. Dans le mode bloquant, l’envoi d’un message se termine quand le message est envoyé (cela n’est pas une garantie qu’il est bien reçu par le destinataire) et la réception se termine quand les message est reçu. Le mode non bloquant tente de diminuer le temps d’attente en offrant la possibilité de lancer des communications, des envois et des réceptions sans devoir attendre qu’elles soient réalisées. Ce mode consiste à demander à une couche logicielle d’effectuer l’envoi et la réception d’un message quand cela est possible. Il faut noter que dans cette mémoire, les deux modes bloquants et non bloquants sont utilisés pour les communications entre les noeuds. Le choix du mode dépend de la stratégie de la parallélisation ainsi que le nombre de noeuds entrant en communication. 1.7.3 Logiciel de communication pour les multi-ordinateurs Les architectures qui communiquent avec des messages sont connues depuis plusieurs années et des efforts ont été menés, pour l’amélioration des performances de ces communications. Ces efforts ont permis récemment la portabilité du code source permettant aux programmeurs le transport du code de n’importe quelle architecture à une autre. L’interface la plus répandue pour la communication entre les processeurs a été la machine virtuelle parallèle ou PVM (Parallel Virtual Machine) [GBD+ 94]. PVM a été Chapitre 1. Parallélisme et architectures parallèles 18 remplacée par MPI (Message passing interface) [WD96] car MPI a montré plus d’avantages. Les fondateurs de PVM reprochaient à MPI de ne pas avoir une structure rigide et vantaient la simplicité d’utilisation de PVM. MPI l’a emporté sur PVM car elle permet plus d’opérations et contient une plus grande variété de routines. Une étude a été établie pour la comparaison des deux librairies [GL97, GL02]. Notons que les deux interfaces PVM et MPI assurent toutes les deux la portabilité du code. MPI est apparue entre les années 1992 et 1994 grâce aux efforts de plusieurs groupes comprenant des organisations, des groupes de travail et des chercheurs des Etat-Unis et d’Europe. La version d’origine de MPI s’appelle MPI-1. Cette version a été étendue en 1994 vers une version plus riche appelée MPI-2. MPI est le premier standard pour la programmation des processeurs. Il s’agit d’une librairie composée des fonctions et de macros qui peuvent être utilisées avec des programmes en langage Fortran, C et C++. Elle offre plusieurs avantages : – Permet la portabilité du code source ; – Permet une implémentation efficace à travers plusieurs architectures et supporte les architectures hétérogènes ; – Assure une bonne fonctionnalité puisqu’elle contient plus de 115 routines ; – Disponibilité : plusieurs implémentations sont accessibles ; – Utilisable avec le C et le Fortran ; – Permet des communications efficaces car elle évite les copies mémoire ; – Facile à utiliser [Pac95] ; – Efficace pour les systèmes à mémoire distribuée ; – Définit une interface qui peut être implémentée sur différentes plate-formes sans modifications des communications du logiciel. Plusieurs références présentent les caractéristiques de MPI ainsi que ses différentes fonctionnalités et routines [GLDS96, Pac96, GHLL+ 98, aSOaDWD98, GLS99]. MPI est caractérisée par le type de ses communications (points à points, collectives, bloquantes et non bloquantes), le type des données, les topologies virtuelles, les communicateurs et les groupes. 1.7.3.1 Communications offertes par MPI MPI offre deux modes essentiels de communication, les communications point à point qui concernent exactement deux processeurs et les communications collectives qui concerne chacun des processeurs d’un groupe [MMM+ ]. 1. Communications point à point : Il existe 4 modes de communications proposées par MPI : standard, synchrone, buffered et ready (prêt). Dans ces 4 modes l’importance se situe dans la réception du message. Les détails de chaque mode peuvent se décrire comme suit. – Mode standard : l’envoi se termine quand le message est envoyé. Cela ne garantit pas la réception du message, le message est peut être reçu ou non. Ce mode peut être utilisé comme synchrone ou buffered ; Chapitre 1. Parallélisme et architectures parallèles 19 – Mode synchrone : le processeur qui envoie doit être sûr que le message a bien été reçu. Généralement le processeur qui reçoit le message doit prévenir le processeur qui a envoyé le message que celui-ci a bien été reçu. Dans ce cas, l’envoi est considéré comme terminé ; – Mode buffered : garantit la copie du message au système buffer. La réception du message n’est pas garantie. L’inconvénient de ce mode est qu’il faut allouer des espaces pour le buffer ; – Mode ready : comme le mode buffer, le mode ready termine directement et il n’attend pas la réception du message. Mais si le message n’est pas reçu, un drapeau d’erreur sera levé. Notons que chacun de ces modes existe sous la forme avec et sans blocage. 2. Communications Collectives : MPI supporte les communication collectives. Elle contient un grand nombre de fonctions pour la distribution et la redistribution des données, le regroupement des données et les opérations globales sur les données (multiplication, soustraction, somme etc). Ces communications collectives facilitent le travail et évitent de faire des boucles pour les envois et les réceptions dans les opérations collectives quand un processeur communique avec tous les autres ou tous les processeurs communiquent entre eux. Parmi les opérations collectives les plus utilisées citons le broadcast où un processeur envoie à tous les autres, le scatter où un processeur distribue des donnés aux autres, le gather où les données sont collectées de plusieurs processeurs à un seul, le allgather où les données de tous les processeurs sont collectées sur tous les processeurs (Figure 1.12). Parmi les communications collectives importantes, il y a aussi le reduce qui consiste à calculer un résultat utilisant des données de tous les processeurs comme le maximum, le minimum et la somme (Figure 1.13). Fig. 1.12 – Communications collectives Fig. 1.13 – Le reduce, additionnant des données de tous les processeurs Chapitre 1. Parallélisme et architectures parallèles 20 Fig. 1.14 – Une topologie virtuelle de 16 processeurs 1.7.3.2 Le type des données MPI prend en considération de nombreux types de données comme les chaînes de caractères, les entiers normaux, longs et courts, les nombres flottants, les doubles etc... 1.7.3.3 Topologie L’utilisation des communications et de la topologie différencie MPI des autres systèmes utilisant le transfert de messages. MPI permet le classement des processeurs en ordre topologique. La topologie est un mécanisme qui permet de nommer les processeurs d’un groupe. Elle permet d’optimiser les communications entre les processeurs ; les processeurs sont nommés de manière à ce que chaque processeur communique avec les processeurs les plus proches. Les topologies offertes par MPI sont la topologie cartésienne et la topologie des graphes. La Figure 1.14 montre une topologie cartésienne virtuelle avec les lignes qui indiquent la communication entre les voisins. Pour chaque processeur, le numéro (rank) est indiqué ainsi que les coordonnées du processeur sur la grille. 1.7.3.4 Groupe et Communicateur MPI permet l’organisation des processeurs en groupes permettant la communication entre les processeurs d’un même groupe ou les processeurs appartenant à des groupes différents grâce au communicateur. Le communicateur est un objet opaque qui détermine l’environnement de communication où les communications vont s’effectuer. Chaque Chapitre 1. Parallélisme et architectures parallèles 21 Fig. 1.15 – Division d’un groupe en deux groupes chacun ayant son propre intracommunicateur communicateur contient un groupe de processeurs. Il existe deux types de communicateurs : l’intracommunicateur permettant la communication au sein d’un même groupe, et l’intercommunicateur permettant la communication entre deux ou plusieurs groupes différents. Les communicateurs sont dynamiques, ils peuvent être créés et détruits au cours d’un programme. Chaque communicateur a ses attributs qui sont fixés aux moment de sa création. Normalement dans un programme MPI n’ayant qu’un seul groupe de processeurs, un seul communicateur est nécessaire. Il s’agit de MPI_COMM_World, qui est défini par défaut, permettant la communication entre tous les processeurs. Dans certaines applications, une distribution des tâches en groupes indépendants est souhaitable. Dans ce cas la création des différents groupes ayant chacun son propre intracommunicateur facilite la communication entre les processeurs (Figure 1.15). 1.8 Conclusion Les architectures parallèles ont plusieurs caractéristiques importantes et dont il faut tenir compte lors de la parallélisation d’un algorithme. Pour une application donnée, il faut trouver la meilleure manière de décomposer un algorithme et il faut prendre en considération le type de machines à disposition (multi-ordinateurs, multiprocesseurs...) afin d’obtenir une bonne efficacité et une bonne performance. Dans ce chapitre, nous avons présenté différentes architectures parallèles ayant chacune ses caractéristiques. Le travail de mémoire porte sur le parallélisme d’une méthode d’illumination globale par voxels. Il est mis en oeuvre sur un cluster utilisant l’interface MPI pour le transfert des messages et la communication entre les noeuds et dont le principe a été décrit dans ce chapitre. Néanmoins il est toujours envisageable d’utiliser d’autres types d’architecture, comme les multiprocesseurs et de comparer l’influence de l’architecture sur l’efficacité et l’accélération de l’algorithme parallèle. Chapitre 1. Parallélisme et architectures parallèles 22 Chapitre 2 Illumination globale, radiosité et parallélisme La synthèse d’images et l’infographie sont deux termes fortement liés ; le premier génère les images par ordinateur et le deuxième transforme un modèle informatique en une représentation graphique. La synthèse d’images est la génération d’images par ordinateur. Les images de synthèse par ordinateur ont plusieurs applications. Péroche [Pér91] cite cinq domaines d’applications dans lesquelles interviennent les images de synthèse : la conception assistée par ordinateur (CAO) qui comprend trois domaines la mécanique (automobile, aéronautique...), l’électronique (ordinateurs, lave-linge, téléviseurs ...), l’urbanisme et architecture (dessins des projets assistés par ordinateur...), la visualisation scientifique qui inclut la modélisation moléculaire et la dynamique, le graphisme de communication qui englobe les rapports d’activités et les plaquettes publicitaires des entreprises, l’audiovisuel comme les dessins animés les publicités et le cinéma et le domaine artistique utilisant des plaquettes électroniques. L’objectif d’une partie de la synthèse d’images est de créer des images aussi exactes et réalistes que possible. Il existe deux champs essentiels qui jouent un rôle important dans la synthèse d’images : la modélisation géométrique et la visualisation. La modélisation géométrique consiste à décrire les modèles des objets qui constituent l’environnement. Ces objets peuvent être représentés d’une manière simple, par des points, lignes ou triangles. Ils peuvent aussi se représenter mathématiquement par des surfaces implicites (plan, sphère, cylindre...) plus difficiles à manipuler mais paramétrables ; ces surfaces exigent le transfert du modèle mathématique en une représentation visuel ou graphique pour la visualisation du modèle [SK01]. Une représentation, permettant de représenter des objets plus complexes, est aussi possible à l’aide des surfaces paramétrées (Béziers, B-Splines, espaces NURBS). Ces surfaces paramétrées sont basées sur un calcul polynomial [Mal02a]. La visualisation est très importante en synthèse d’images. Elle nécessite le respect des caractéristiques physiques des matériaux et de l’environnement et des phénomènes de transport de la lumière pour une simulation correcte de la distribution de lumière. 23 Chapitre 2. Illumination globale, radiosité et parallélisme 24 La visualisation demande aussi une compréhension de la perception visuelle du système visuel humain. La perception humaine peut être associée directement à la réalité virtuelle, qui est une simulation informatique interactive dans laquelle le graphisme est utilisé afin de pouvoir plonger l’utilisateur dans l’environnement lui donnant ainsi l’impression qu’il est présent dans un monde virtuel. La visualisation doit tenir compte des effets statiques comme la forme, la couleur, les textures et la position des objets et doit tenir compte aussi des effets dynamiques qui ont une influence directe sur les effets visuel comme le changement de la position des objets ou de la caméra. Plusieurs travaux ont été menés dans la littérature pour la simulation de l’éclairement et la génération des images de synthèse réalistes [Tel93, Dam01, DHS04]. Lorsque le réalisme est de rigueur, on parle alors de rendu réaliste (realistic rendering). Le rendu réaliste nécessite la résolution du problème d’illumination avec le plus de précision possible en respectant les caractéristiques physiques de l’environnement. Parmi les premiers modèles de rendu, citons les modèles de Phong et Gouraud [Pho75, Gou71]. Ces modèles ont pris en compte l’illumination directe mais ils ont ignorés l’illumination indirecte causée par les phénomènes d’inter-réflexions entre les surfaces et ne fournissent pas une distribution réelle et précise de la lumière. D’autres méthodes ont été proposées pour une simulation plus précise de la lumière et le calcul de l’illumination. Il existe par exemple les méthodes de lancer de rayons comme le ray tracing et le photon mapping. Il y aussi les méthodes de radiosité qui ont pris en compte des phénomènes des réflexions et inter-réflexions entre les surfaces. La radiosité a été l’une des premières méthodes les plus avancées pour la simulation d’illumination globale ; elle a été considérée comme un outil important pour le calcul des inter-réflexions de la lumière entre des surfaces diffuses, offrant une simulation précise de l’illumination dans une scène. La radiosité a été dépassée par les méthodes à base de rayons comme le photon mapping et le ray tracing, notamment parce qu’elle ne gère pas bien les BRDF (Bidirectional Reflectance Distribution Function). La plupart des algorithmes de radiosité souffrent de problèmes de complexité en mémoire et en temps de calcul, ce qui a restreint leur diffusion dans les applications du commerce et de l’industrie. Le parallélisme permet d’offrir une solution pour ce genre de problèmes grâce à la capacité des machines parallèles qui permettent de diminuer la complexité en temps de calcul et en mémoire dans le calcul de radiosité. Dans ce chapitre, l’illumination globale est expliquée ; les méthodes de calcul d’illumination globale par lancer de rayons ou par radiosité sont aussi décrites. Ensuite, la radiosité est définie avec ses équations d’éclairement et les différentes méthodes de résolution du système d’équations sont expliquées. Finalement les améliorations des algorithmes de radiosité ainsi que l’état de l’art des méthodes utilisées pour paralléliser les algorithmes de radiosité sont exposés. Ce chapitre insiste plus sur la radiosité que sur d’autres méthodes de calcul d’illumination globale. Cela est en effet dû au fait que l’algorithme d’illumination globale que l’on cherche à paralléliser dans ce travail est basée sur l’équation de radiosité qui est discrétisée en voxels et résolue par un algorithme spécial, basé sur des notions de droites discrètes pour la gestion de la visibilité (voir Chapitre 3). Cet algorithme d’illumination Chapitre 2. Illumination globale, radiosité et parallélisme 25 a été étendu du cas diffus idéal au cas BRDF [CM07] par Chatelier et Malgouyres. Ces extensions ne sont pas parallélisées dans ce travail mais feront l’objet des perspectives envisagées. 2.1 Réflexion et réfraction Quand un rayon lumineux se propage dans un environnement et arrive à la surface d’un second milieu, ce rayon subit des phénomènes dit de réflexion et de réfraction. Une partie de la lumière est réfléchie et l’autre partie pénètre dans le second milieu (réfraction). En physique, un milieu se caractérise par un indice de réfraction, qui caractérise la vitesse de propagation de la radiation dans ce milieu. La proportion de la lumière réfléchie dépend des indices de réfractions des deux milieux. L’angle d’incidence est l’angle formé par le rayon incident et la normale à la surface au point d’incidence. D’après les lois de réflexion, l’angle de réflexion est égal à l’angle d’incidence (Figure. 2.1 (a)). Concernant le rayon réfracté il est déterminé par les lois de la réfraction de Snell et Descartes. Le rayon incident et rayon réfracté se situe de part et d’autre du plan tangent et l’angle de réfraction est calculé à partir de l’angle d’incidence et les indices de réfraction des deux milieux. La Figure. 2.1 (b) montre l’angle de réfraction calculer à partir des indices de réfraction des deux milieux et de l’angle d’incidence. Fig. 2.1 – Le modèle spéculaire de Phong 2.2 Modèles d’éclairement Dans un environnement donné, la lumière en provenance d’une source lumineuse et qui interagit avec une surface subit des phénomènes de réflexion. Les phénomènes de Chapitre 2. Illumination globale, radiosité et parallélisme 26 réflexion sont des phénomènes fortement liés aux caractéristiques des matériaux (type de surface, propriétés physique et caractéristiques optiques) de la surface avec laquelle la lumière interagit [Gou05]. Par exemple pour les matériaux conducteurs, laissant très peu d’énergie les pénétrer, une surface lisse (miroir) est idéalement spéculaire (Section 2.2.2) et une surface plus rugueuse est spéculaire mais pas idéalement spéculaire. Pour les matériaux diélectrique ou peu conducteur, la lumière incidente est absorbée par la surface pour être ensuite réfléchi sous forme de lumière diffuse (Section 2.2.1) émise dans toutes les directions. On peut distinguer essentiellement trois modèles d’éclairement le modèle diffus, le modèle spéculaire et la BRDF, qui sont expliqués ci-dessous. 2.2.1 Le modèle diffus idéal ou modèle Lambertien Le modèle Lambertien est le modèle le plus utilisé et le plus simple pour décrire le phénomène de réflexion. Dans ce modèle, l’énergie ré-émise est la même dans toutes les directions. Cette énergie lumineuse dépend du rayon incident, elle est maximale pour un éclairage zénithal et nule pour un éclairage rasant. La Figure 2.2 illustre le modèle Lambertien qui s’exprime sous la forme : Id = Ii × Kdiff × cos θ où : – Id : intensité diffuse ; – Ii : intensité incidente ; – Kdiff : coefficient diffus, constante dépendant du matériau (coefficient de réflexion spéculaire) ; – θ : angle d’incidence de la lumière calculé par rapport au vecteur normal à la surface. Fig. 2.2 – Le modèle Lambertien Chapitre 2. Illumination globale, radiosité et parallélisme 2.2.2 27 Le modèle spéculaire Le modèle spéculaire prend en compte la position de l’observateur dans le phénomène de réflexion contrairement au modèle diffus. On peut distinguer deux cas : le cas spéculaire idéal (miroir) où la lumière est réfléchie dans la direction symétrique par rapport à la normale ; le deuxième cas est le cas spéculaire classique ou le modèle de Phong [Pho75] où la lumière ré-émise est plus intense autour du rayon réfléchi idéal (Figure 2.3). Ce dernier modèle s’exprime comme suit : IS = Ii × KS × cosn θ où : – – – – – IS : intensité spéculaire (intensité de lumière sortante) ; Ii : intensité incidente ; KS : constante dépendant du matériau (coefficient de réflexion spéculaire) ; θ : angle entre la direction de sortie et le rayon réfléchi idéal ; n :puissance qui traduit la concentration de la lumière spéculaire réfléchie du matériau. Fig. 2.3 – Le modèle spéculaire de Phong 2.2.3 BRDF : Bidirectional Reflectance Distribution Function Ce modèle permet de quantifier le rapport entre l’énergie incidente et l’énergie sortante au point d’impact d’un rayon suivant les propriétés du matériau. De nombreuses représentations des BRDFs ont été proposées dans la littérature [War92, KM99, AS00, CM07]. La BRDF peut être vue comme une fonction à quatre paramètres (θin , φin , θout , φout ), les coordonnées sphériques, permettant de quantifier le flux d’énergie sortant dans une direction donnée (θout , φout ) par rapport à un flux incident dans une direction donnée (θin , φin ). La Figure 2.4 montre une représentation d’une BRDF. Chapitre 2. Illumination globale, radiosité et parallélisme 28 Fig. 2.4 – Une BRDF et ses quatre paramètres (θin , φin , θout , φout ) 2.2.4 Angle solide, radiance et irradiance Une définition exacte de l’échange d’énergie radiante nécessite la notion d’angle solide. L’angle solide est utilisé pour mesurer la portion de l’espace occupé par un objet qui est vue à partir d’un point. L’angle solide d’un objet vue à partir d’un point est l’aire de la projection de cet objet sur la sphère unité centrée au point. Si la surface est très petite de surface (∆A), l’angle solide est approximé à la projection au plan perpendiculaire à la direction d’origine, au lieu de la sphère (Figure 2.5), et l’équation de l’angle solide est alors : ∆A ≈ ∆A cos θ r2 où : ∆A cos θ : surface de la projection. r : distance à l’origine Fig. 2.5 – Angle solide pour une petite surface [SP94] Chapitre 2. Illumination globale, radiosité et parallélisme 29 La radiance, dénotée par L, est une mesure locale de la densité de flux d’énergie. Elle représente la quantité totale d’énergie émanant d’un point dans une direction donnée. C’est une puissance par unité de surface et par unité d’angle solide. Elle est utilisée pour décrire le transfert radiatif [SP94]. Elle s’exprime en watts par mètre carré et par stéradian (W m−2 sr−1 ). L’irradiance est l’intégration de l’intensité entrante. Elle représente la quantité d’énergie par unité de surface et s’exprime en watts par mètre carré (W m−2 ). 2.2.5 Illumination locale Le terme illumination locale est un terme simplifié qui suppose que l’illumination d’un point ou d’un élément de surface dépend de la propriété d’un élément de surface ainsi que de la lumière incidente provenant des sources. Etant donnée uniquement une surface, N la normale à cette surface et L la direction de la lumière incidente, la réflexion diffuse peut être calculée en utilisant la loi Lambertienne (Section 2.2.1). Or l’illumination locale est incapable de générer des images vraiment réalistes ; cela vient du fait que seule la lumière en provenance directement des sources lumineuses est prise en considération. En réalité, les surfaces reçoivent aussi de la lumière indirecte résultant des inter-réflexions avec d’autres surfaces. Ce phénomène indirect n’est pas pris en compte par l’illumination locale. 2.2.6 Illumination globale La production des images de synthèse la plus réelle que possible, nécessite une précision de traitement des effets de la lumière. A la différence du modèle d’illumination locale où la surface courante et la direction de la source lumineuse sont seulement pris en considération pour calculer la lumière réfléchie, le modèle d’illumination globale prend en considération les inter-réflexions de la lumière, et donc tous les objets de la scène. Le modèle d’illumination globale permet alors la simulation d’une manière précise des inter-réflexions et par conséquent des effets d’éclairement. 2.2.6.1 Equation d’illumination globale L’équation d’illumination globale traduit l’équilibre énergétique d’une scène et s’exprime avec la radiance. Cette équation se décrit comme suit : l’émission d’un élément est la somme de son émission propre et de la ré-émission de l’énergie qu’il reçoit. Etant donné un point x, soit (θout , φout ) la direction sortante, la radiance L est alors l’inconnue : Z L(x, θout , φout ) = Le (x, θout , φout ) + {z } | {z } | radiance totale radiance propre ρbd (x, θin , φin , θout , φout )Li (x, θin , φin ) cos θin dω | {z } Ω radiance émise (2.1) Les termes de cette équation sont : Chapitre 2. Illumination globale, radiosité et parallélisme – – – – – – – – – – 30 x : point d’émission ; L : radiance du point x ; θin , φin : angles polaires dans un repère local à x, de la direction d’incidence ; θin , φin : angles polaires dans un repère local à x, de la direction de sortie ; Le : radiance d’émission propre à x, s’il appartient à une source lumineuse cette fonction est connue ; Li : radiance incidente en x, dépendante des radiances des autres points de la scène ; Ω : sphère d’intégration centrée en x ; ρbd : la BRDF ; cette fonction est un ratio entre une radiance sortante et un flux de radiance entrante. Elle est supposée connue en tout point x et pour toutes directions ; cos θin : terme traduisant l’unité de surface projetée ; dω : intégrande angle solide. 2.3 Méthodes par lancer de rayons L’illumination globale est un phénomène très étudié par les chercheurs dans le but de pouvoir simuler d’une manière précise les échanges énergétiques et les réflexions. L’ensemble des échanges énergétiques peut être calculé en utilisant un lancer de rayons. Le lancer de rayons est très populaire car il permet de présenter des scènes 3D de façon très réaliste. Il demeure le modèle de simulation d’illumination-réflexion idéal en infographie. 2.3.1 Pixels et rayons La résolution du problème de lancer de rayons est générer tous les rayons qui traversent les pixels de l’image et issus du centre de projection qui est le lieu de l’observateur. Ceci permet le calcul de la moyenne des couleurs de tous les rayons traversant le pixel. 2.3.2 Modèle simple de lancer de rayons Un modèle simple de lancer de rayons traite seulement l’interaction des points de la surface avec les rayons provenant des sources lumineuses. Il traite seulement les rayons provenant de l’illumination directe, c’est le cas de l’illumination locale. Or dans la réalité, il faut prendre en considération l’illumination globale car d’autres rayons lumineux atteignent la surface à travers le phénomène de réflexion et réfraction. 2.3.3 Algorithmes par lancer de rayons Le principe de lancer de rayons peut être appliqué pour le calcul de l’illumination globale à travers le calcul de l’intersection de la lumière par un pixel d’une scène donnée. Chapitre 2. Illumination globale, radiosité et parallélisme 31 Fig. 2.6 – Le rayon d’éclairement Fig. 2.7 – Rayon réfléchi Les algorithmes de lancer de rayons, en général, génèrent le chemin entre les sources de lumière et les points de la scène pour lesquelles on cherche à calculer la valeur de la radiance. Plusieurs algorithmes de lancer de rayons sont connus pour le calcul de l’illumination [DBB03]. Dans ce cadre, deux approches essentielles de lancer de rayons peuvent être utilisées : le lancer de rayons partant des sources lumineuses (light-tracing) ou depuis la caméra (ray tracing). Ces deux approches peuvent être combinées pour aboutir au bi-directional path-tracing. 2.3.3.1 Ray Tracing Le ray tracing fut apparaître en 1980 par Whitted [Whi80] ; Whitted implémente le premier modèle la plus répandu en rendu, utilisant la technique du ray tracing. En physique, les points de départ de la lumière sont les sources lumineuses. La lumière des sources arrive à l’observateur après avoir subi diverses réflexions et réfractions. Parmi les rayons issus d’une source lumineuse, il y en a plusieurs qui n’arrivent pas à l’observateur ce qui pousse à suivre les rayons à l’envers depuis l’observateur vers les sources lumineuses évitant ainsi le traitement des rayons inutiles. C’est le principe du ray tracing qui consiste à parcourir un rayon de l’arrière en prenant l’oeil ou la caméra comme point de départ et suivant le rayon jusqu’au pixel de l’image pour déterminer l’objet de contact. La couleur réfléchie à partir de la direction du rayon est premièrement calculée en calculant la lumière incidente au point de contact. Chapitre 2. Illumination globale, radiosité et parallélisme 32 Cependant pour un rayon donné, il ne faut pas seulement considérer l’illumination directe des sources lumineuses, mais il est important de déterminer la totalité de la lumière qui superpose ce rayon. Ces rayons lumineux peuvent être divisés en quatre classes [Mal02a] : – Les rayons primaires : issues directement de l’observateur ; – Les rayons d’éclairement : provenant d’une source lumineuse vers la surface (Figure 2.6) ; – Les rayons réflechis : provenant d’un phénomène de réflexion à travers l’objet (Figure 2.7) ; – Les rayons de transparence : provenant d’un phénomène de réfraction à travers un objet qui dans ce cas est transparent ou partiellement transparent ; (Figure 2.1). Ces rayons secondaires résultants des réflexions, réfractions et effets spéculaires permettent d’évaluer la lumière transportée à partir du rayon. Cela s’appelle ray tracing récursive de Whitted [Whi80]. Ce ray tracing récursif permet le calcul des réflexions, réfractions, or il est limité aux réflexions spéculaires idéales. Il a été amélioré par Cook qui a étendu le ray tracing, permettant des meilleurs modèles de réflexion [CT82] et utilisant un échantillonnage stochastique [CT86]. Le ray tracing est considéré comme la forme la plus utilisée du ray shooting pour générer des images. Le ray shooting avait beaucoup d’applications en infographie, ce qui a poussé les chercheurs à s’intéresser à accélérer le ray tracing. Plusieurs techniques pour accélérer le ray tracing ont été proposées [Gla89, Shi02, SM03, FF97]. Malgré l’utilisation du ray tracing pour générer des images, il faut indiquer que beaucoup d’algorithmes en illumination globale utilise parfois le ray tracing seulement pour le calcul de visibilité. Le ray tracing peut être aussi utilisé dans d’autres applications que l’infographie comme par exemple [AFF97]. De nos jours, les systèmes et logiciels exécutent rapidement le ray tracing. Aussi grâce aux ordinateurs parallèles et à la capacité du calcul offerte par ceux ci, plusieurs travaux de parallélisation du ray tracing ont été menés sur des multiprocesseurs [KH95, Muu, PMS+ 99], sur des grappes de stations de travail [WSB01, Wal04] ou réalisés entièrement en hardware [SWS02]. Toutes ces améliorations ont permi au ray tracing d’atteindre des capacités temps réel. 2.3.3.2 Light tracing Le light tracing peut être vue comme le dual du ray-tracing. Dans le ray-tracing, le chemin optique est tracé de l’oeil ou la caméra vers les sources de lumière. L’idée du raytracing élémentaire est de ne calculer que des rayons utiles. Or ce tracé du ray-tracing ne suit pas le vrai trajet de lumière. Le light tracing, lui suit le trajet de lumière. Le chemin optique est alors tracé des sources lumineuses vers l’oeil ou la caméra. En ray-tracing, à chaque point d’impact, on teste la présence ou non d’un éclairage direct en vérifiant si les sources lumineuses sont visibles depuis ce point. Cela force la découverte des sources lumineuses pour le rayon courant. En light-tracing, la même idée est utilisée pour forcer la découverte de la caméra. Chapitre 2. Illumination globale, radiosité et parallélisme 2.3.3.3 33 Bi-directional path-tracing Le bi-directional path-tracing consiste à combiner ray-tracing et light-tracing pour profiter des avantages des deux. Des rayons sont tracés depuis la caméra et depuis la source. En connectant les chemins générés, il est possible de calculer la contribution des deux dans le transport de la lumière. Le path-tracing a été développé par Lafortune [LW94] et Veach [Vea94]. 2.3.3.4 Instant Radiosity L’instant radiosity a été introduite par Keller [Kel97]. Elle est différente des méthodes de radiosité usuelles (voir Section 2.4), elle consiste à remplacer l’illumination indirecte diffuse, provenance des autres surfaces autre que les sources lumineuses, dans une scène par une illumination directe diffuse d’un ensemble de sources lumineuses ponctuelles. Des particules sont tracées des sources de lumière (appelées aussi point de lumière virtuelle) en se basant sur la méthode quasi-random work [Kel96]. Au moment où le rayon lumineux rencontre un objet d’une surface, un point de lumière est rajouté au point de contact permettant ainsi d’approximer la lumière réfléchie de cette partie. L’illumination directe résultante de ces sources ponctuelles de lumière est alors cumulée. Des cartes graphiques sont utilisées pour le calcul de l’illumination des sources ponctuelles. Cette approche ressemble au bi-directional path-tracing or elle est plus rapide. 2.3.3.5 Photon Mapping Le photon mapping (carte de photons) introduit dans [JC95b] et notamment étendu dans [Jen95, JC95a, Jen96] est une technique de calcul d’illumination globale. Elle est la plus utilisée à l’heure actuelle car elle est simple à implémenter et offre des temps de calcul raisonnables tout en utilisant une consommation mémoire convenable. Cette méthode fonctionne en deux passes. Une première passe consiste à construire les photon maps et une deuxième passe de rendu. Première passe Le photon mapping se construit par émission des photons à partir des sources lumineuses. Ces photons sont propagés dans la scène et subissent des phénomènes de réflexion, transmission ou absorption. Une Russian Roulette [AK90] est utilisée pour déterminer si le photon est absorbé ou réfléchi. Quand les photons entrent en contact avec des surfaces spéculaires, ils sont mémorisés dans une structure appelée photon mapping. Deux cartes de photons sont calculées, une carte de caustiques et une carte globale. Les caustiques se forment quand la lumière est transmise ou réfléchie à partir des surfaces spéculaires avant d’arriver à une surface diffuse. Le photon mapping est efficace pour le calcul des caustiques. En général, les caustiques se forment quand la lumière est concentrée, demandant ainsi un nombre de photons limité. Chapitre 2. Illumination globale, radiosité et parallélisme 34 Le photon map représente un paquet d’énergie arrivant à une surface. La densité du photon permet alors l’estimation de l’irradiance. La radiance en un point peut alors être calculée en multipliant l’irradiance par la BRDF de la surface. Deuxième passe Le deuxième passe est le calcul du rendu et alors la visualisation de la radiance de chacun des points de l’image. L’utilisation du photon mapping demande un grand nombre de photons pour une bonne visualisation d’une image de haute qualité. Une solution possible est l’utilisation du photon mapping seulement pour les calculs qui sont nécessaires et d’intégrer autres techniques (le ray tracing) pour le calcul de l’illumination directe. L’un des principes du photon mapping est le découpage de l’équation de luminance ré-émise en un point en quatre contributions qui peuvent se résumer comme suit : – L’illumination directe : elle correspond à la lumière qui atteint un point donné directement depuis les sources lumineuses. Cette illumination est calculée utilisant le principe traditionnel du ray tracing proposé par Whitted [Whi80] ; – L’illumination spéculaire : correspond aux effets de réflexions à travers des surfaces spéculaires (miroir). Elle est calculée utilisant le principe du ray tracing ; – Les caustiques : corresponds à la lumière qui atteint une surface en passant par des réflexions spéculaire. Ils sont calculés utilisant le photon map ; – L’illumination indirecte : correspond à la lumière quittant un point donné en passant par au moins une réflexion diffuse. Cette lumière est calculée utilisant le photon map pour le calcul de la radiance. 2.3.3.6 Modèle Metropolis Le modèle Metropolis de calcul d’illumination globale a été développé par Veach et Guibas dans [VG97]. Ce modèle est basé sur la technique d’échantillonnage Metropolis [MRR+ 53] appliquée sur les chemins optiques. Dans l’algorithme Metropolis, l’image est calculée en échantillonnant les chemins correspondant au trajet de la lumière. Ce modèle est caractérisé par les mutations qui s’appliquent aux chemins. Lors de la génération d’une série de chemins, les mutations consistent à recoller ou supprimer des sommets du chemin précédent. Ce modèle offre des avantages et apparaît efficace dans le calcul des images des scènes contenant des chemins de lumière difficiles à calculer comme des fortes illumination indirectes construites à partir d’un nombre de chemins optiques limités. Dans ces cas, les mutations permettent un calcul non coûteux des chemins. Or ce modèle reste compliqué du côté implémentation surtout quand le nombre de chemins augmentent, nécessitant alors des précautions lors de l’application de l’algorithme. 2.3.3.7 Irradiance Caching L’irradiance caching a été introduite dans [WRC88]. Cette technique est utilisée pour accélérer le calcul de l’illumination indirecte, coûteuse en temps de calcul, dans Chapitre 2. Illumination globale, radiosité et parallélisme 35 des scènes diffuses. La complexité en temps de calcul d’illumination indirecte vient du fait qu’un grand nombre de rayons est nécessaire pour le calcul de l’irradiance. En effet l’irradiance varie très lentement à travers les surfaces diffuses. L’irradiance caching part de ce principe et suppose qu’il est suffisant de calculer l’irradiance a des endroits ou points précis et de faire une interpolation pour calculer la valeur de l’irradiance pour les autres points. Dans cette méthode, l’irradiance des points sélectionnés est cachée dans une structure de donnée (octree). Pour les autres points, l’irradiance est interpolée à partir des valeurs cachées. 2.4 Radiosité La radiosité est définie comme la quantité totale d’énergie émise par un point de surface, par unité de surface. Les premiers algorithmes de radiosité apparaissent en 1984 [GTGB84, NN85] dans le but de modéliser les interactions lumineuses entre les surfaces diffuses. Ces algorithmes proviennent de l’application de la théorie de l’énergie radiative au problème d’illumination globale [SH92]. La radiosité a un avantage par rapport au ray tracing et c’est qu’elle est indépendante de la position de l’observateur, elle permet le calcul d’une solution qui est indépendante de celui ci. Après les échanges d’énergies entre les surfaces, si le point de vue de l’observateur change, un minimum de changement est demandé en utilisant la radiosité. Cela n’est pas le cas avec le ray tracing qui calcul une solution dépendante du point de vue de l’observateur. La radiosité utilise les principes d’émission, de réflexion et d’inter-réflexion pour simuler les réflexions et inter-réflexions de la lumière dans la scène pour arriver finalement à un équilibre et une convergence vers la bonne solution de radiosité. 2.4.1 Equation de la radiosité La radiosité représente la quantité totale d’énergie quittant une surface en un point donné par unité de surface. La radiosité en un point x peut être décrite en fonction de la radiance L(x, θ, φ), (θ et φ étant les angles polaires dans un repère local à x) sur la sphère englobante ω par l’équation suivante : Z B(x) = L(x, θ, φ) cos θdω (2.2) Ω La radiosité constitue une solution pour un milieu diffus idéal ; pour ce genre de milieu, l’équation (2.4.1) de radiosité qui est représentée en fonction de la radiance peut se réduire (voir [SP94]) à l’équation suivante : B(x) = E(x) + ρd H(x) où : – E(x) : la propre émission de l’élément en tant que source lumineuse ; (2.3) Chapitre 2. Illumination globale, radiosité et parallélisme 36 – ρd : paramètre de la capacité de ré-émission d’un élément ; – H(x) : densité du flux incident, représentant l’énergie reçue de l’environnement ; Le terme H(x) de l’équation (2.3) est un terme difficile à calculer ; il est représenté en fonction de la radiance incidente Li par l’intégral hémisphérique : Z H(x) = Li (x, θ, φ) cos θdω (2.4) Ω Dans un milieu non participatif où la lumière se propage en ligne droite, en supposant les objets opaques l’équation (2.4) peut s’écrire comme : Z 0 cos θ cos θ V (x, y)dy (2.5) B(x) = Be (x) + ρd B(y) πr2 y∈S où : – Be (x) : la propre émission de l’élément x en tant que source lumineuse ; – ρd : paramètre de la capacité de ré-émission d’un élément ; – r : distance entre les éléments kx − yk ; – cos θ : traduit l’importance de l’incidence dans le modèle d’éclairement diffus ; 0 – cosr2θ : traduit l’influence de y sur x ; – V (x, y) : une fonction binaire (équation (2.6)) représentant la visibilité entre les deux points x et y. La Figure 2.8 montre un exemple du calcul de la radiosité au point x depuis y qui dépend 0 de la distance entre les deux point x et y, et des deux angles θ et θ 1 si y est visible depuis x V (x, y) = (2.6) 0 sinon 2.4.2 Discrétisation de l’équation de radiosité Le calcul de la radiosité est basé sur la discrétisation de la scène, c’est-à-dire sur un maillage des surfaces en patchs. Cela permet alors la discrétisation de l’équation (2.5) qui fait apparaître une notion nouvelle, le facteur de forme (voir Section 2.4.2.4). 2.4.2.1 Radiosité et patchs La subdivision des surfaces en patchs, demande certaines estimations pour le calcul de radiosité. La radiosité est considérée uniforme pour un patch donné. Le paramètre de la capacité de ré-émission d’un élément (ρd ), est encore considéré comme constant sur un patch. Chapitre 2. Illumination globale, radiosité et parallélisme 37 Fig. 2.8 – La radiosité au point x depuis y dépend de la distance entre x et y et de leurs orientations respectives 2.4.2.2 Equation discrétisée L’équation (2.5) de radiosité une fois discrétisée est écrite ([SP94]) : X Bi = Bei + ρi Bj Fij (2.7) j avec : 1 Fij = Ai Z x∈Pi Z y∈Pj 0 cos θ cos θ V (x, y)dydx πr2 (2.8) Le terme Fij de l’équation (2.8) est le facteur de forme. Pi et Pj représente les patchs i et j. Ai et Aj sont les surfaces des deux patchs Pi et Pj . Les autres termes de l’équation (2.7) et (2.8) ont la même signification que dans l’équation (2.5). L’équation (2.7) peut être écrite sous forme matricielle (2.9) formant un système linéaire à résoudre : B1 Be1 ρ1 F11 ρ1 F12 . . . ρ1 F1n B1 B B ρF B ρ F . . . ρ F 2 e2 2 21 2 22 2 2n 2 (2.9) . = . + . · . .. .. . .. .. .. . . . Bn Ben ρn Fn1 ρn Fn2 . . . ρn Fnn Bn L’équation (2.9) peut à son tour s’écrire sous la forme : Chapitre 2. Illumination globale, radiosité et parallélisme 1 − ρ1 F11 −ρ F 2 21 .. . −ρn Fn1 38 ... −ρ1 F1n B1 Be1 1 − ρ2 F22 . . . .. . −ρ2 F2n .. . · B e2 = . .. Bn Ben −ρ1 F12 −ρn Fn2 . . . 1 − ρn Fnn B2 .. . (2.10) Dans le système d’équations (2.10), les coefficients de réflexion (ρ1 ...ρn ) sont des termes dépendant des matériaux et donc ils sont connus. Les termes Be1 ...Ben représente la propre émittance des points comme source de lumière, et ils sont connus aussi. Les deux inconnus sont les facteurs de forme et les radiosités Be1 ...Ben . Résoudre ce système d’équations, revient alors à calculer la matrice de facteurs de forme. Une fois la matrice de facteurs de forme calculée le seul inconnu est alors les radiosités. Les deux calculs de la matrice de facteurs de forme et les radiosités sont expliqués respectivement dans les Sections 2.4.2.4 et 2.4.3. 2.4.2.3 Étapes de résolution Dans le système d’équations (2.10), seule la radiosité initiale (énergie émise localement) et les coefficients de réflexion sont connus. Les valeurs à calculer sont donc les facteurs de forme et les radiosités. Trois étapes sont nécessaires afin de résoudre le système d’équations : – Calculer les facteurs de forme (Section 2.4.2.4) ; – Résolution du système d’équations (Section 2.4.3) ; – Visualisation de la scène : l’étape final de la radiosité est la visualisation des résultats. La radiosité obtenue est une valeur au centre des facettes ; pour obtenir des variations continues de couleurs et de luminosité, il est important d’obtenir une valeur de radiosité aux sommets des facettes (moyennes des valeurs de radiosité des facettes de la valeur des facettes adjacentes) et d’effectuer une double interpolation de la couleur en fonction de la valeur de radiosité en chaque sommet des facettes. Cette étape est similaire à l’interpolation utilisée par Gouraud [Gou71]. 2.4.2.4 Facteur de Forme : définition et calcul Le facteur de forme est un nombre associé à une paire d’éléments et reflète leur dépendance mutuelle. Le facteur de forme Fij de l’équation (2.8) est la proportion de l’énergie totale émise par le patch Pi et reçue par le patch Pj . Le facteur de forme est une quantité géométrique et sa valeur dépend de la forme et de la position des surfaces dans la scène. Plusieurs méthodes ont été proposées pour le calcul de facteurs de forme. Parmi les méthodes de bases citons les méthodes projectives (équivalent de Nusselt), l’hémi-cube et échantillonnage par lignes locales et globales : Chapitre 2. Illumination globale, radiosité et parallélisme 39 – Méthodes projectives : les méthodes projectives sont basées sur l’équivalent de Nusselt [Nus28]. Le facteur de forme d’un point x à un patch P est interprété comme la projection de l’angle solide sous tendu par le patch P : Z 1 cos θdw Fx,P = π ΩP Fx,P représente la fraction de la surface unitaire dans le plan résultant de la projection de la surface du patch P sur le plan tangent à la surface au point x (Figure 2.9). cos θ indique la projection de la surface sur le plan. ΩP est l’hémisphère unitaire centrée au point x représentant l’ensemble de directions permettant à x de voir P . Le facteur π est une normalisation ; – L’hémi-cube : la deuxième méthode permettant le calcul de facteurs de forme est l’hémi-cube. Il est basé sur Nusselt et suppose que l’hémisphère est discrétisée. Il a été proposé par Cohen en 1985 [CG85], qui approxime l’hémisphère par cinq plans de projection formant un demi-cube. Les faces de l’hémi-cube sont discrétisées en proxels (cellules carrées). La projection d’un élément sur l’hémi-cube est représentée par l’ensemble des cellules qui intersectent cette projection (Figure 2.10). Le facteur de forme d’un élément est alors approximé par la somme des facteurs de formes de chaque cellule concernée. Pour une cellule de coordonné (x, y, z), d’aire ∆S, le delta facteur de forme ∆F est calculé suivant les équations ci-dessous : pour la face supérieure ; – ∆F = π(1+x12 +y2 )2 ∆S – ∆F = π(y2 +zz 2 +1)2 ∆S pour les faces latérales. – Échantillonnage par lignes locales et globales : l’échantillonnage par lignes locales pour le calcul de facteurs de forme permet d’évaluer les facteurs de forme de tous les couples (Pi , Pj ), pour un i et un j donnés en échantillonnant des rayons partant du patch Pi , déterminant pour chacun le premier patch Pj rencontré, et mettant à jour le facteur de forme Fij associé. Dans l’échantillonnage par lignes globales, les rayons peuvent également être lancés sans avoir pour origine un élément en particulier. Ces rayons peuvent, selon leur orientation, traverser les surfaces et une estimation des facteurs de forme peut être alors calculée. Une étude de tels échantillonnages de trouve dans [Sbe93]. 2.4.3 Résolution de l’équation de radiosité L’équation de radiosité sous forme intégrale, l’équation (2.5) ainsi que l’équation discrétisée de radiosité équation (2.7) ne permettent pas le calcul de la radiosité. Il est important alors de trouver des méthodes permettant la résolution du système d’équations. Concernant la résolution de l’équation sous forme intégrale, la littérature du calcul numérique [RP98, Gas66, Kre89] propose plusieurs méthodes adaptées à ce genre de calcul. Ces méthodes peuvent être divisées en deux classes : la méthode de quadrature et les méthodes de projection. Les méthodes de quadrature sont des approximations de la Chapitre 2. Illumination globale, radiosité et parallélisme Fig. 2.9 – Nusselt : illustration géométrique du facteur de forme 40 Fig. 2.10 – Hémi-cube : calcul du facteur de forme valeur numérique d’une intégrale. En général, ils remplacent le calcul de l’intégrale par une somme pondérée prise en un certain nombre de points du domaine d’intégration. Pour les méthodes de projection citons la méthode de Galerkin et la méthode de collocation. La méthode de Galerkin pour la résolution de la radiosité fournit une solution approximative de radiosité avec une erreur résidue qui est orthogonal à l’ensemble de solutions et donc à la solution en elle même [HW91b, Zat93, Fle84, SP94]. La méthode de collocation est une alternative de la méthode de Galerkin, elle exige que le résidu soit nul pour tous les points nodaux. Cette méthode est moins complexe que la méthode de Galerkin mais elle extrait moins d’information que celle de Galerkin [SP94]. Des études de la méthode de collocation dans le cas de l’équation de la radiosité ont été menées dans [ACS00, Han02, Han03]. 2.4.3.1 Méthodes Itératives de résolution Concernant l’équation discrétisée de radiosité, les méthodes itératives sont généralement utilisées pour la résolution de ce genre d’équations. Ces méthodes sont les plus utilisées dans la plupart des algorithmes de radiosité. Soit (Bi )i∈[1...n] le vecteur de radiosité de chacun des patchs qu’on cherche à déterminer, et soit (Mi,j )i,j , la matrice de facteur de forme (contenant ρi ), l’équation (2.10) peut s’écrire alors sous la forme (I − M )B = Be qui est de la forme Ax = b. En supposant que la matrice de facteurs de forme est calculée utilisant les méthodes de calcul de facteur de forme (Section 2.4.2.4), la solution de radiosité est alors calculée utilisant les méthodes itératives consistant à résoudre le système Ax = b. Le but de ces méthodes de résolution itérative est de minimiser la différence entre la solution exacte et la solution courante en minimisant le résidu. Si le résidu vaut zéro, cela indique qu’on est arrivé à la solution désirée et qu’on a une bonne convergence. Parmi les méthodes itératives il y a la relaxation de Jacobi, la relaxation de Gauss-Seidel et la relaxation de Southwell. Chapitre 2. Illumination globale, radiosité et parallélisme 41 – La relaxation de Jacobi : Cette méthode garde deux copies de toutes les variable xi c’est à dire elle garde une ancienne valeur et une nouvelle valeur. Elle est illustrée par la suite suivante : bi − (k+1) xi = N X (k) Aij xj j6=i Aii k est l’étape k de l’algorithme et x(0) est initialisée à une valeur quelconque, par exemple Be . – La relaxation de Gauss-Seidel : Elle est simple et efficace. Elle repose sur la relaxation de Jacobi et elle est représentée par l’équation suivante : bi − (k+1) xi = X Aij xk+1 j − 0≤j<i N X Aij xkj i<j≤N Aii x(0) est initialisée à une valeur quelconque, par exemple Be . Cette relaxation a une meilleur convergence que la relaxation de Jacobi quand la matrice A a une diagonale strictement dominante. Elle permet aussi de gagner en mémoire vue qu’un seul vecteur de stockage est utilisé. – La relaxation de Southwell : Cette méthode est différente de la méthode de Jacobi et de Gauss-Seidel. Dans la relaxation de Jacobi et de Gauss-Seidel, la mise à jour de l’élément i se fait en propageant l’énergie de tous les élément vers l’élément i. Cela est décrit par le principe du “gathering” revenant à rassembler la lumière provenant de tous les éléments sur le patch courant. La relaxation de southwell utilise une procédure de “shooting”, où la mise à jour se fait en regardant l’énergie émanante de l’élément i (Section 2.4.4.1). 2.4.4 Algorithmes avancés de radiosité La méthode de radiosité nécessite le calcul de la matrice complète de facteurs de forme (équation (2.9)), ce qui est coûteux à la fois en temps de calcul et en mémoire (stockage de la matrice de facteur de forme). Une solution imaginable pourrait être la réduction du nombre de patchs de la scène, or cela influence sur la précision de la méthode. Dans cette section, différentes méthodes qui ont réduit la complexité soit en temps ou en mémoire de la radiosité et qui ont simplifié la procédure de transfert d’énergie sont expliquées. Chapitre 2. Illumination globale, radiosité et parallélisme 2.4.4.1 42 Radiosité progressive La résolution de l’équation (2.9) de radiosité nécessite le calcul de la matrice des facteurs de forme avant qu’une méthode itérative (Gauss-Seidel) soit appliquée. Une reformulation de la solution peut être effectuée en utilisant Southwell-Relaxation au lieu de Gauss-Seidel. Southwell-Relaxation mène à un algorithme progressif de radiosité. Les deux algorithmes Gauss-Seidel et Southwell-Relaxation fonctionnent de manière réversible. Comme il a été noté dans la Section 2.4.3.1, la méthode de Gauss-Seidel calcule la radiosité Bi du patch i en se basant sur la radiosité de tous les autres patchs. Cela est décrit par le principe du “gathering” ou “rassemblement” qui revient à rassembler toute la lumière provenant de tous les autres patchs sur le patch courant (Figure 2.11). En contraste, la méthode de Southwell utilise une procédure de “shooting” ou “tirage”, qui envoie l’énergie du patch courant à tous les autres (Figure 2.12). Le principe de la radiosité progressive est le suivant : chaque patch maintient une radiosité courante Bi et une radiosité non envoyé ∆Bi représentant la radiosité résiduelle. Le fonctionnement de l’algorithme est alors comme suit : le patch ayant le plus grand ∆Bi est choisi comme émetteur ; il lance sa radiosité aux autres patchs. La radiosité non envoyé ∆Bi des autres patchs est mise à jour et ∆Bi du patch courant passe à zéro après envoi. Cette technique progressive offre plusieurs avantages qui se résument comme suit : – Le calcul de la radiosité se fait au fur et à mesure ; A chaque étape, le patch le plus clair, ayant le plus grand ∆Bi est choisi comme émetteur. A chaque itération, la radiosité du patch est mise à jour rapprochant ainsi le résultat du résultat souhaité. Au niveau d’affichage, l’image est sombre au début, elle devient plus claire à chaque étape grâce à la propagation de l’énergie. Le rapprochement au résultat désiré à chaque itération permet l’affichage de la solution à chaque étape avant d’obtenir une convergence vers la bonne solution. – Minimisation de la mémoire : il n’y a plus besoin de calcul de la matrice complète de facteurs de forme. À chaque étape une colonne de la matrice est utilisée. Dans certains cas, où une source est choisie comme émetteur un certains nombres de fois, il y a besoin d’un re-calcul d’une colonne. Malgré ce calcul qui peut se répéter, il ne faut pas oublier que la mémoire est réduite car une partie de la matrice est utilisée. De plus certains facteurs de forme ne sont pas calculés du tout ; il s’agit des patchs qui ne sont jamais choisis comme émetteur. Malgré les avantages offerts par la méthode de radiosité progressive, un effet non désiré de cette approche au niveau d’affichage se pose parfois. Les endroits de la scène qui ne sont pas directement visible à partir des sources lumineuses, dépendent des phénomènes de réflexions pour recevoir de la lumière ce qui fait qu’ils sont très sombres dans les premières étapes de l’algorithme. Une solution pour ces cas à été proposée par Cohen et ses collègues [CCWG88] qui proposent de rajouter un facteur ambiant pour remédier à ce genre de problème. Chapitre 2. Illumination globale, radiosité et parallélisme Fig. 2.11 – Rassemblement des rayons provenant de plusieurs patchs vers le patch i 2.4.4.2 43 Fig. 2.12 – Envoie de l’énergie du Patch i vers les autres patchs Substructuring et subdivision adaptative Il a été remarqué que la précision désirée diffère entre les deux moments de la réception et de l’émission ; une grande précision est demandée au moment de la réception quant à l’émission, moins de précision est nécessaire. Ces différentes précisions peuvent être accomplies en mémorisant avec chaque patch une certaine subdivision. Quand le patch est émetteur, une résolution fine n’est pas nécessaire alors une résolution moyenne est suffisante, alors qu’en mode réception, la plus fine résolution est choisie. Le seul inconvénient de cette subdivision en patch est qu’elle doit être effectuée à l’avance. Il est possible d’effectuer une subdivision adaptative du maillage qui sera calculée au fur et à mesure quand les informations de radiosité sont disponibles. Cela revient à générer des éléments dans les zones où une remarquable variation de radiosité est repérée. Il est alors possible de mettre un certains seuils et de regarder le gradient ; une subdivision est effectuée quand le gradient dépasse le seuil. Un quadtree peut être utilisé pour représenter la subdivision de la surface. Dans un quadtree (Figure 2.13), en regardant la variation de radiosité, un élément est subdivisé ou non ; chaque noeud représente un patch d’une surface et pointe vers quatre fils correspondant à la subdivision du patch. 2.4.4.3 Radiosité hiérarchique La radiosité hiérarchique est la combinaison de substructuring et subdivision adaptative. Cet algorithme est considéré comme le plus important des algorithmes de radiosité [HSA91, HS92]. La scène n’est pas divisée en avance en maillages ; la subdivision est créée pendant la procédure du calcul de radiosité. Le but de la subdivision est d’établir un certains liens entre deux paires de polygones pour le transfert d’énergie. Une fois les liens établis, la solution itérative de radiosité est calculée. Elle consiste à rassembler la radiosité parmi les liens et la propager. Chapitre 2. Illumination globale, radiosité et parallélisme 44 Fig. 2.13 – Le quadtree utilisé pour la subdivision des éléments La complexité de la méthode hiérarchique est de O(k 2 + n), k étant le nombre de polygones et n le nombre de patchs. La complexité est dépendante du nombre de polygones, ce qui fait que la complexité est quadratique par rapport au nombre de polygones. 2.4.4.4 Radiosité hiérarchique et clustering Le clustering consiste à regrouper des objets pour ainsi estimer l’énergie entre les groupes d’objets. Le clustering peut être utilisé avec les algorithmes de radiosité progressive. Kok [Kok93] a proposé une méthode de groupement des petits patchs pour la méthode de radiosité progressive. Dans cette méthode un groupe envoie et reçoit l’énergie de l’environnement. Le clustering est surtout utilisé avec l’algorithme de radiosité hiérarchique [SAG94, SNSS97, GH96, HDSD99]. L’algorithme hiérarchique de la radiosité a une complexité de O(k 2 + n) ; si k est beaucoup plus grand que n, l’algorithme devient très lent. Une solution consiste à utiliser le principe du clustering et à étendre alors l’algorithme pour qu’il fasse des échanges entre des objets ou groupes d’objets diminuant ainsi le nombre de liens. Or les algorithmes du clustering avec la radiosité hiérarchique sont coûteux en terme de calcul de la visibilité. Des efforts ont été faits pour réduire le calcul de la visibilité ; certains sont basés sur une pré-traitement dépendant de la géométrie de l’environnement [CT97, HW91a, TH93] et proposent donc une estimation précise de la visibilité entre un groupe d’objets. Une estimation moins précise de la visibilité une mais très rapide est présentée dans [MBSB03]. Leblanc et co. [LP00] construisent une hiérarchie appelée “Face clustering”, qui produit des groupes de triangles adjacents ayant Chapitre 2. Illumination globale, radiosité et parallélisme 45 des vecteurs normaux similaires. Notons que le principe du clustering est très utile quand les objets sont séparés (Figure 2.14) et ayant un petit effet sur la précision de la solution finale de radiosité ; dans ce cas il est possible de diminuer le nombre de liens. Pour les objets proches (Figure 2.15), il n’est plus possible de diminuer le nombre de liens ; les liens doivent être accomplis entre des polygones simples pour obtenir plus de précision. Le clustering utilisé avec la radiosité hiérarchique a diminué la complexité de celle-ci de O(n2 + k) à O(k + n) selon l’algorithme. Fig. 2.14 – Clustering : Pour des objets éloignés une seul lien est suffisant Fig. 2.15 – Clustering : Pour des objets proche plusieurs liens sont nécessaire pour plus de précision 2.4.5 Radiosité utilisant l’approche Monte Carlo Le modèle d’illumination peut être traité comme une procédure stochastique de simulation au lieu d’un modèle déterministe. C’est là que se situe l’idée fondamentale des méthodes de Monte Carlo, qui formulent une solution à un problème comme un paramètre de variables aléatoires. L’approche de Monte Carlo peut être utilisée pour résoudre l’équation de radiosité au lieu des méthodes déterministes. La méthode de radiosité progressive peut être vue comme une stratégie d’énergie émanante (shooting-energy). Les sources et les surfaces émettent l’énergie vers d’autres surfaces. Cette énergie émise est Chapitre 2. Illumination globale, radiosité et parallélisme 46 interprétée d’une manière déterministe ; les particules sont émises des sources dans différentes directions, quand ils rencontrent les objets, ils subissent des réflexions et des réfractions ou perd de l’énergie. Ce modèle est implémenté par une approche Monte Carlo. L’utilisation de Monte Carlo offre des avantages et des inconvénients. La solution est correcte donnant une bonne illustration des inter-réflexions dans l’environnement ce qui est un avantage ; aussi il n’y a pas besoin de stocker les facteurs de formes ce qui minimise la mémoire. L’inconvénient de la méthode de Monte Carlo est que dans le cas d’une discrétisation fine, des artéfacts sont remarqués exigeant une augmentation du nombre de rayons. La technique de Monte Carlo est utilisée dans la méthode de radiosité pour le calcul des facteurs de formes ainsi que pour la résolution de l’équation de radiosité. Les facteurs de formes sont simulés en faisant une répartition des droites en respectant une distribution du cosinus. Deux manières pour cette répartition sont possibles ; une génération locale ou globale des droites. Une génération locale peut être faite en utilisant une technique proposée par Tobler et ses collègues [TNSP98], basée sur la méthode de Nusselts qui génère la distribution du cosinus. Cette technique consiste à choisir un point x ayant une distribution uniforme de la surface d’un patch p, prendre un point aléatoire y d’une sphère unitaire tangente au patch p au point x ; la droite générée suit alors la direction xy (Figure 2.16). La génération globale est différente de la génération locale, elle ne fait pas une répartition à partir d’un patch précis mais elle peut traverser la scène toute entière. Plusieurs techniques ont été utilisées pour générer les droites globales citons parmi ces technique “Bundles of Lines” qui est un groupe parallèle de droites obtenu en définissant une certaines distances entre les droites représentant la résolution. Ces droites sont construites à partir du plan tangent à une sphère (Figure 2.17). Les droites générées d’une manière globale ou locale peuvent être utilisées pour le calcul des facteurs de formes entre les patchs, évitant le stockage de la matrice de facteurs de forme. La résolution de l’équation de radiosité en utilisant la technique de Monte Carlo est effectuée en étendant l’équation de radiosité en une série de Neumann. Notons finalement que la méthode de Monte Carlo a été utilisée par plusieurs chercheurs pour le calcul de l’illumination globale et de la radiosité montrant des résultats encourageant [Neu95, SPNP96, CMS98, Bes01, FP93]. 2.4.6 Autres algorithmes de radiosité Les algorithmes avancés de la radiosité ont réduit la complexité du calcul. Ces méthodes sont les plus répandues dans le cadre du calcul de la radiosité. Il y a toujours d’autres approches adaptées pour le calcul de la radiosité. Il y a par exemple les méthodes de radiosité à base d’ondelettes [PB94, GSCH93, CAH00, HCA00]. Aussi les méthodes de radiosité utilisant un modèle géométrique comme la méthode étudiée dans Chapitre 2. Illumination globale, radiosité et parallélisme Fig. 2.16 – Génération locale de droites 47 Fig. 2.17 – Génération globale de droites utilisant une génération parallèle (Bundle of lines) [AMP00a, AMP00b], qui propose l’utilisation d’un atlas “disk-like patches”, constitué de patchs qui recouvrent une surface et qui peuvent se chevaucher. 2.5 État de l’art : parallélisation des méthodes de radiosité La plupart des méthodes de radiosité sont coûteuses en temps de calcul et en mémoire. Cela a poussé les chercheurs à avoir recours au parallélisme afin de minimiser ces deux facteurs permettant ainsi de traiter de grandes scènes qui n’entrent pas en mémoire en un temps de calcul minimisé. Les différentes caractérisations des méthodes de radiosité reposent sur la stratégie utilisée pour paralléliser l’algorithme ainsi que l’architecture de la machine (multi-ordinateurs, multiprocesseurs, etc ...) et son système de mémoire (partagée ou distribuée). La stratégie de parallélisme diffère selon l’algorithme de radiosité ; l’algorithme est la manière de calculer la matrice de radiosité et de facteur de forme. Comme il a été noté en Section 2.4.4 plusieurs simplification sont effectuées pour la résolution de l’équation de radiosité. Par exemple la méthode progressive de radiosité choisit le patch ayant la plus grande énergie comme émetteur, il émet l’énergie à tous les autres ; la parallélisation de cet algorithme est alors différente de celui de la radiosité hiérarchique et le clustering où une subdivision a lieu pour établir un lien pour le transfert d’énergie. Du point de vue système de mémoire, on peut distinguer deux systèmes : Le système à mémoire partagée et le système à mémoire distribuée. Le système à mémoire distribuée peut être divisé en deux systèmes à son tour ; les grappes de stations de travail et le système distribué à mémoire partagée. Les grappes de stations de travail sont composées de plusieurs machines où le transfert entre les machines est effectué en utilisant une stratégie de transfert de messages. Le système distribué à mémoire partagée utilise Chapitre 2. Illumination globale, radiosité et parallélisme 48 des variables partagées pour la communication (plus de détails sur le système mémoire se trouvent dans le chapitre 1). Dans les sections qui viennent, une présentation des différentes stratégies est présentée. 2.5.1 Parallélisation de la radiosité progressive L’algorithme de radiosité progressive est un algorithme interactif permettant de visualiser des images intermédiaires. La procédure consistant à choisir le patch ayant la plus grande énergie comme émetteur fait augmenter la rapidité de convergence de l’algorithme. Malgré cela le temps de calcul de radiosité demeure important nécessitant ainsi du calcul parallèle pour améliorer l’interactivité en réduisant le temps de calcul autant que possible. Plusieurs travaux de parallélisme ont été effectués pour paralléliser la méthode de radiosité progressive. Dans [BW90] la méthode de radiosité progressive est parallélisée sur de multiprocesseurs graphique de machine à mémoire partagée. La génération des facteurs de forme, la distribution de la lumière et le choix du patch émetteur est effectuée en parallèle sur les processeurs. Recker et co. [RGG90] proposent deux méthodes pour accélérer la méthode de radiosité progressive. L’algorithme de l’hémi-cube est modifié pour accélérer le calcul du facteur de forme. La méthode de radiosité est parallélisée sur des grappes de stations de travail ayant un parallélisme grossier (coarse grained network cluster of Hewlett Packard workstations). Cette parallélisation est système client serveur. le serveur maintient la liste des patchs et la radiosité des éléments. Un processeur est utilisé pour l’affichage. Les autres n − 2 processeurs sont les clients. Les clients ont une copie dupliquée de la géométrie de l’environnement. La communication entre le serveur et les clients se déroule de la manière suivante : le serveur détermine les n − 2 patchs ayant la plus grande radiosité, et fait un envoi du type broadcast donnant un patch à chaque client. Les clients calculent le vecteur de facteur de forme du patch à tous les éléments et le renvoient au serveur. Le serveur renvoit alors à chacun des clients un nouveau patch et la procédure se poursuit. Une parallélisation applicable pour des machines SIMD et MIMD et basée sur une projection de l’environnement est présentée dans [VP92]. Dans cette approche une surface de projection similaire a celle proposée dans [RR97] ; cette surface de projection est décrite comme étant un plan capable de capter 90 pourcent de la lumière venant du patch émetteur. Bouatouch et co. [BMP] ont présenté une approche qui consiste à paralléliser la méthode de radiosité en utilisant une mémoire virtuelle partagée. Dans cette parallélisation, les émissions sont effectuées en parallèle. Chaque processeur choisit un patch émetteur, trouve le facteur de forme entre ce patch et les autres patchs de la scène et distribue l’énergie de ce patch émetteur aux autres patchs de la scène. Le travail de chaque processeur est indépendant des autres processeurs, ce qui ne nécessite pas une synchronisation entre les processeurs. La mise à jour des valeurs de radiosité est effectuée en parallèle. Chapitre 2. Illumination globale, radiosité et parallélisme 49 Pour accélérer les émissions, le patch choisi doit avoir une énergie maximale, ce choix est simple dans un algorithme séquentiel mais il est dur en parallèle car un processeur ne doit pas choisir un patch déjà choisi par un autre processeur. Une solution consiste à mettre à zéro l’énergie du patch émetteur quand il est choisi par un processeur ; cela oblige à faire une section critique (voir [BMP]). Or la section critique crée des attentes importantes. Ces attentes peuvent être diminuées en traitant la mise à jour de la radiosité ainsi que la sélection du patch émetteur en parallèle. Cet algorithme parallèle a été testé sur un nombre de processeurs allant de 1 à 32 avec des scènes allant de 2000 à 50000 patchs ; une accélération presque égale au nombre de processeurs et une efficacité de 82 pourcent est remarquée. Une méthode basée sur la circulation des données des patchs a été proposée dans [Aaz96]. La parallélisation est effectuée sur des multi-ordinateurs (coarse grained) en tenant compte de certaines topologies particulières entres les machines. Dans l’algorithme parallèle, P émissions concurrents de radiosité sont effectuées en même temps sur les multi-ordinateurs. Aykanat et ses collèges ont montré que pour leur algorithme l’utilisation d’une topologie simple (ring) à la place des topologies riches comme l’hypercube, ne dégrade pas l’efficacité de l’algorithme. La parallélisation est établie de manière synchrone permettant l’obtention de plus de cohérence en même temps une convergence plus rapide. Renaud et Rousselle [RR97] utilisent des machines SIMD caractérisées par un grand nombre de simples processeurs dont la puissance est donnée par le nombre de processeurs plutôt que par la capacité du calcul. Le calcul de facteur de forme et de l’émission (patch ayant l’énergie la plus grande) est parallélisé permettant un calcul rapide du système d’équations de radiosité. Une estimation de facteur de forme est obtenue en utilisant une surface circulaire (disk projection area) de projection basée sur la méthode de Nusselt [Nus28] diminuant largement le temps de calcul. Guittton et co. [GRS95] parallélisent une méthode stochastique de calcul de radiosité réalisée sur des machines à mémoire distribuées, un cluster utilisant le transfert de messages comme moyen de communication entre les noeuds. La méthode divise la scène en plusieurs parties et donne à chaque processeur une de ces parties ; cela évite la limitation à des scènes qui sont plus petites que la mémoire du processeur et permet donc de traiter des grandes scènes. La division de la scène est régulière, elle peut être en grille, tranche ou pyramide, le nombre de divisions est calculé de manière à respecter l’équilibrage de charge entre les processeurs. Chaque processeur traite ses propres rayons, s’il n’y a pas intersection des rayons avec les patchs, le calcul est transféré à l’espace voisin à l’aide du transfert des messages. Cette parallélisation utilise des threads pour repartir les tâches et augmenter ainsi le degré du parallélisme. Dans [YIY97] Yu et co. font intégrer une subdivision des surfaces en maillage. Une première division en maillage triangulaire est effectuée, pour chacun des patchs de ce maillage, une subdivision peut se faire s’il y a encore besoin. Une distribution statique est effectuée afin de distribuer les patchs entre les processeurs. Chapitre 2. Illumination globale, radiosité et parallélisme 2.5.2 50 Parallélisation de la radiosité hiérarchique Malgré la complexité minimisée offerte par la radiosité hiérarchique par rapport à l’algorithme classique de radiosité. Cette méthode demeure complexe pour des grandes scènes nécessitant ainsi un calcul en parallèle. Plusieurs approches ont été utilisées pour paralléliser l’algorithme de la radiosité hiérarchique. [SGL94] présente un algorithme parallèle de calcul de la radiosité hiérarchique. Ils ont utilisés des arbres binaires au lieu des quadtree pour faciliter le calcul de visibilité dans leur algorithme séquentiel. Ils ont remarqué qu’une distribution statique engendre des déséquilibres de charges importantes, car la distribution des charges pour les paires de polygones n’est pas uniforme. Une distribution dynamique est alors effectuée pour obtenir un équilibrage de charge. L’implémentation parallèle de l’algorithme attribue à chaque processeur sa propre queue de travail. A chaque subdivision des patchs, de nouveaux travaux sont rajoutés à la queue du processeur impliqué. Si un processeur finit ses travaux, il peut aider les autres processeurs à finir leur queue de travail. L’accès d’un processeur aux données d’un autre est direct à cause de l’utilisation de machine distribuée à mémoire partagée. Dans l’algorithme il y a aussi utilisation du ray-casting, du shear warp volume rendering et ray tracing qui sont aussi parallélisés afin de minimiser le temps de calcul le plus possible. Les résultats obtenus sont encourageants. T.A. Finkhouser décrit dans son papier [Fun96] l’implémentation d’une méthode de radiosité basée sur une technique de groupement itératif utilisant une solution hiérarchique concurrente de radiosité. Le système est un système maître esclaves utilisant les messages TCP comme moyen de communication. La parallélisation consiste à répartir les patchs de la scène en groupes, les processeurs traitent différents groupes en parallèle et calcule la radiosité. Les esclaves représentent les différents processeurs et calculent la radiosité de leur groupe des patchs. Le maître effectue l’équilibrage de charges et la distribution des données. Il sélectionne le groupe à traiter par les processeurs, un groupe particulier pour être traité par un processeur donné. La construction des groupes effectuée par le maître est très délicate et doit prendre en considération les tailles du groupe. Une fois les groupes construits, le maître envoie un groupe parmi les groupes présents à un processeur donné et il lui envoie aussi tous les patchs qui sont visibles à travers les patchs du groupe choisi. Une fois les données envoyées, le maître annonce au processeur qu’il peut commencer son traitement de radiosité. Les esclaves à la fin de leur exécution du calcul de radiosité, envoient au maître les nouvelles valeurs, le maître les met à jour pour qu’ils soient prêt à être traitées par les esclaves pour plus tard. Cette parallélisation a montré une amélioration du temps de 65-75 pourcent pour de nombre d’esclaves variant entre 1 et 8. [FY97] propose un algorithme qui partitionne une scène complexe en petites sous scènes ou cellules dépendantes de cohérence spatiale et visuelle. Chacune des sous scènes peut être parallélisée individuellement. La parallélisation utilise l’idée maître esclaves comme dans [Fun96], or elle est plus fine que celle-ci, car elle distribue les patchs entre les esclaves, ce qui permet de se contenter des esclaves avec des mémoires plus petites et Chapitre 2. Illumination globale, radiosité et parallélisme 51 ayant moins de capacité de calcul. Fang et Yang ont remarqué que la méthode d’émission est meilleur que celle du rassemblement pour leur algorithme, contrairement à ce qui a été noté dans [SGL94] où le rassemblement est meilleur que le shooting sur des architectures à mémoire partagée pour des simples scènes. Cela est dû au fait que la méthode du rassemblement demande plus d’itérations que l’émission, aussi avec l’émission (shooting) il y a une convergence qui est plus rapide car les patchs ayant la plus grande énergie sont choisi comme émetteur. L’algorithme est désigné pour des machines parallèles à mémoires distribuées utilisant le transfert de message. Dans [RS97] Richard et co. proposent un algorithme parallèle pour le calcul de la radiosité diffus et spéculaire. La parallélisation est effectuée sur des machines distribuées à mémoire partagée. Comme [SGL94], le parallélisme est généré d’une manière dynamique utilisant des queues de travaux. Quand le processeur finit le traitement de ses queues il peut aider les autres à finir leurs queues pour garantir ainsi l’équilibrage de charge. Le traitement diffus et spéculaire ensemble consomme plus de mémoire que le modèle diffus seul ; le programme spéculaire doit traiter plusieurs sources (patchs) pour chaque destination. Des efforts supplémentaires pour diminuer la mémoire utilisé par le programme doivent être réalisés permettant ainsi le traitement de plus grandes scènes. Meneveaux et co [MB98] et [MB99] proposent un algorithme hiérarchique parallèle de type (SPMD) pouvant être appliqué à tout type d’environnement architectural complexe. Cet algorithme utilise l’environnement de programmation parallèle MPI et peut être exécuté sur un réseau hétérogène de machines, une machine parallèle ou les deux ensembles. L’environnement est découpé en plusieurs régions appelées cellules. Pour chaque cellule, des groupes de surfaces (ou clusters) sont déterminés et un graphe représentant la visibilité entre ces clusters est construit. Ce graphe est divisé en sous graphes et chaque sous graphes est attribué à un processeur qui est chargé à calculer l’éclairement des clusters qui lui ont été attribué. Dans cet algorithme, chaque processeur effectue le calcul de radiosité des ses propres groupes en utilisant une approche de rassemblement (gathering) ; le rassemblement sur un processeur donné peut demander des informations d’autres processeurs nécessitant ainsi de transfert des données entre les processeurs. Un ordonnancement efficace du calcul est alors nécessaire pour réduire les échanges d’informations entre le disque et la mémoire [Men98, MBM97]. Dans cet article, une méthode dynamique d’équilibrage de charges est mise en oeuvre. Cette méthode est testée sur différents ordinateurs à réseau Ethernet local et une remarquable accélération est notée. Garmann [Gar99] présente une analyse expérimentale de la radiosité hiérarchique. Des mesures concernant trois sujets importants sont étudiées : équilibrage de charge, communication et congestion. – Équilibrage : La méthode de radiosité hiérarchique est divisée en plusieurs tâches et les dépendances entre les tâches sont décrites. Un partitionnement de l’algorithme en graphe est effectué et le degré de partitionnement est mis en oeuvre. Le graphe a un faible partitionnement à cause de la grande quantité de communication causée par le calcul de visibilité. Un partitionnement spatial a montré des résultats meilleurs que le Metis ; Chapitre 2. Illumination globale, radiosité et parallélisme 52 – Communication : La quantité de tâches change d’une itération à une autre et alors un équilibrage de charge est nécessaire et ne pourra pas être évité ; – Congestion : L’apparition de la congestion est due au fait que le nombre de canaux entre les paires de processeurs utilisé pour la radiosité hiérarchique est plus grand que le nombre de canaux disponibles par les super-ordinateurs. Dans [SH00] Sillion et Hasenfratz décrivent une extension de l’algorithme de radiosité hiérarchique pour la simulation de l’illumination globale. Ils décrivent une méthode basée sur un scheduler qui a permis une parallélisation simple avec un certains ordonnancement des travaux. Ils ont montré qu’un groupement de travaux est suffisant pour éviter les pertes de temps en synchronisation. Les tests sont effectués sur un système distribué à mémoire partagée. Une accélération remarquable est obtenue en utilisant toute la capacité des machines. 2.5.3 Autres méthodes Plusieurs chercheurs ont essayé d’améliorer la méthode de radiosité en présentant de nouvelles approches ou stratégie de parallélisme. Dans [RAPP97], Renambot et co. présentent une nouvelle technique de calcul de la radiosité qui consiste à partager la scène initiale en sous environnements et à calculer la radiosité de chacun de ces sous environnements. Les échanges de radiosité entre les sous environnements sont effectués en utilisant le concept d’interfaces virtuelle et de masque de visibilité. L’interface virtuelle facilite le transfert d’énergie entre les sous environnements. Au début chacun des sous environnements est traité ; une fois les environnements traités, le transfert d’énergie de chaque environnement local à son voisin est effectué. Ce transfert d’un environnement à son voisin a nécessité l’introduction d’un masque de visibilité qui détermine la visibilité du patch par rapport à son environnement. Le masque de visibilité est une hémisphère échantillonnée identique à celle utilisée généralement pour trouver le facteur de forme. Le masque de visibilité est crée pour les sources existant dans l’environnement local et sa valeur est mise à jours quand c’est nécessaire. La Figure 2.18 illustre l’idée du masque de visibilité ; pour un rayon rencontrant un objet dans l’environnement local, le masque de visibilité est mis à faux, sinon la visibilité est vraie. Notons que dans cette méthode il faut faire attention au placement de l’interface virtuelle pour une meilleure performance ; par exemple une interface collée à un mur peut arrêter la propagation de la lumière. La parallélisation de la méthode consiste alors à distribuer les sous environnements entre les processeurs et ensuite à renvoyer les masques de visibilité entre les processeurs pour effectuer les échanges de radiosité. Chaque processeur doit donc avoir accès aux masques de visibilité générés par les autres processeurs. Cette parallélisation a été testée sur des machines distribuées à mémoire partagée SGI Origin 2000 et a diminué le temps de calcul d’un facteur de 5. Dans [DDP99] Durant et co. présentent une approche rapide qui a produit une solution précise d’illumination pour l’illumination directe (scène avec plusieurs sources de Chapitre 2. Illumination globale, radiosité et parallélisme 53 Fig. 2.18 – Interface virtuelle [RAPP97] lumière) et aussi pour l’illumination indirecte pour les scènes qui sont frappées par la lumière indirecte. Durant et co ont étendu la notion du squelette de visibilité qui a été présentée dans [DDP97]. Le squelette de visibilité est une structure de donnée qui code toutes les relations de visibilité globale d’une scène en 3D. Cette notion a été étendue en remplaçant la représentation de noeuds et arcs par une structure hiérarchique de liens d’un polygone à un polygone (sommet à un polygone). Ces extensions ont permis le calcul d’un facteur de forme point-polygone exact pour une paire de sommet-polygone dans une scène. Cavin présente dans [Cav00, CAP98] des techniques de partitionnement et d’ordonnancement pour la parallélisation d’un algorithme de radiosité hiérarchique à base d’ondelettes sur des ordinateurs à mémoire distribuée virtuellement partagée ; cette parallélisation a permis une bonne répartition de la charge de travail entre les processeurs tout en garantissant la localité des données en mémoire. 2.6 Illumination globale aujourd’hui Le parallélisme utilisé pour paralléliser les méthodes de radiosité a réussi à diminuer le temps de calcul et parfois la mémoire (mémoire distribuée) de celles-ci. Or le parallélisme n’est pas seulement appliqué sur les méthodes de radiosité, il s’applique aussi sur les différents algorithmes de lancer de rayons comme le ray tracing [FSGS04, RAH07], le photon mapping [GWS04] et d’autres. Récemment, les concepts des cartes graphiques ou GPU (graphics hardware acceleration) sont suggérés pour améliorer le calcul de l’illumination globale. Les méthodes d’illumination globale sont utilisées pour générer des images réelles et de nos jours, un des axes privilégiés de la recherche est d’arriver à résoudre ces calculs d’illumination avec des solutions interactives utilisant la puissance des cartes graphiques. Les cartes graphiques ont évolué et ont atteint une capacité de Chapitre 2. Illumination globale, radiosité et parallélisme 54 traitement largement accélérée. Les cartes graphiques sont alors utilisées dans le ray tracing [PBMH02], le photon mapping [Lar04]. Aussi ils sont utilisées pour le calcul de la radiosité ; la résolution de la radiosité nécessite un certains nombre d’itérations, en limitant ce nombre, il est possible d’effectuer le calcul de la radiosité sur carte graphique [NPG03]. 2.7 Conclusion Dans ce chapitre, des notions de synthèse d’images, d’infographie et des modèles d’illumination ont été introduites. Les algorithmes de lancer de rayons sont exposés. Ces algorithmes sont utilisés pour le calcul d’illumination globale. La radiosité avec ses différentes équations ainsi que les méthodes de résolution du système d’équations sont présentées. Les méthodes avancées de radiosité sont expliquées. Parmi ces méthodes avancées, La radiosité progressive n’a pas réduit la complexité mais a permis la visualisation d’un résultat intermédiaire après un certains temps permettant ainsi une visualisation des étapes de la simulation jusqu’à la convergence. La radiosité hiérarchique et son extension au clustering étant linéaire en temps de calcul a montré une bonne efficacité pour le calcul de radiosité. Malgré les améliorations offertes par les algorithmes avancés, le traitement de radiosité sur des grandes scènes demeure non raisonnable du point de vue temps de calcul ainsi que consommation mémoire, menant au parallélisme qui est la solution idéale pour ce genre de problèmes. Les différentes parallélisations des méthodes de radiosité ont montré un calcul accéléré par rapport au calcul séquentiel et ont parfois réduit l’espace mémoire demandé (cas où les données sont distribuées). Une majeure partie du chapitre concerne les approches de radiosité ainsi que les différentes parallélisations des méthodes de radiosité. Une concentration est faite sur la radiosité car la méthode d’illumination globale par voxels qu’on cherche à paralléliser au cours de ce travail présente des points communs avec la radiosité. Cette méthode est différentes des méthodes avancées de radiosité présentées dans ce chapitre. Elle se caractérise par le calcul de la visibilité avec une complexité optimale. Elle est basée sur une discrétisation des surfaces en voxels et un partitionnement de l’espace en droites 3D de voxels. Chapitre 3 Méthode d’illumination globale par voxels : Algorithme et étude de convergence Les algorithmes d’illumination globale sont basés sur des algorithmes de lancer de rayons, des algorithmes avancés de radiosité, (la radiosité hiérarchique, progressive, clustering) ou sur des méthodes différentes comme les techniques de type Monte Carlo. La méthode d’illumination à paralléliser dans ce travail est une approche de radiosité nouvelle présentée par Chatelier et Malgouyres [CM06] ; elle est basée sur une discrétisation des surfaces en voxels. Cette méthode est fondée sur des notions de géométrie discrète. L’espace peut être partitionné en des droites discrètes, chaque voxel appartient à une et une seule droite. Pour une direction donnée, ces droites peuvent être vues comme des listes de visibilité contenant des voxels classés par ordre de visibilité. Ces listes de visibilité vont permettre des échanges d’énergie entre les voxels mutuellement visibles. Dans ce chapitre, des notions de géométrie discrète sont expliquées. Ces notions sont les bases pour comprendre l’algorithme séquentiel d’illumination globale que l’on cherche à paralléliser au cours de cette thèse. L’algorithme séquentiel de Chatelier et Malgouyres [CM06] est ensuite expliqué. Une étude de complexité spatiale et temporelle est notamment exposée et les temps de calcul sur différentes scènes sont présentés montrant la nécessité d’avoir recours au parallélisme pour ce genre de traitement. Finalement une étude de convergence de l’algorithme d’illumination est effectuée. Elle consiste à faire varier le nombre d’itérations et de directions afin de voir les effets de ces deux facteurs sur la vitesse de convergence de l’algorithme. 3.1 Notion de géométrie discrète La géométrie discrète est un domaine de recherche assez récent qui a pour but de représenter des modèles discrets. De nos jours, la géométrie discrète est utilisée dans le 55 Chapitre 3. Méthode d’illumination globale par voxels 56 domaine de l’infographie, l’imagerie médicale (superposition d’images, réalité virtuelle) ou le traitement d’images (squelettisation, détection de contour, segmentation). La méthode d’illumination globale de Chatelier et Malgouyres discrétise les surfaces en voxels ; cette méthode utilise des notions de géométrie discrète (les droites discrètes et le partitionnement de l’espace) pour le calcul de l’illumination. 3.1.1 Voxel Un voxel est un élément de volume. Il représente l’analogie du pixel mais en trois dimensions. Il peut être vue comme une cube unitaire identifié par les trois coordonnées (x, y, z) de son centre et ayant les arêtes parallèles aux axes de coordonnées. 3.1.2 Adjacence 3.1.2.1 4-adjacence et 8-adjacence Soient les points x et y ∈ Z2 , x est définit par (x1 , x2 ) et y est définit par (y1 , y2 ). On définit les notions suivantes : 4-adjacence : y est 4-adjacent à x si |y1 − x1 | + |y2 − x2 | ≤ 1. 8-adjacence : y est 8-adjacent à x si max(|y1 − x1 | , |y2 − x2 |) ≤ 1. Les Figures 3.1 et 3.2 montrent un exemple de points respectivement 4-adjacents et 8adjacent au point x. Ces points sont aussi appelés respectivement les 4 voisins et les 8 voisins du point x. Soit E une partie de Z2 . Un point x est dit 4-adjacent (ou 8-adjacent) à E si et seulement si x ∈ / E et x est 4-adjacent (8-adjacent) à un point de E. Fig. 3.1 – Le point x et ses 4 voisins 3.1.2.2 Fig. 3.2 – Le point x et ses 8 voisins 6-adjacence, 18-adjacence et 26-adjacence Soient x (x1 , x2 , x3 ) et y (y1 , y2 , y3 ) deux points de Z3 . On définit les notions suivantes : 6-adjacence : x et y sont dits 6-adjacent s’ils partagent une face, c’est-à-dire si |x1 − y1 |+ |x2 − y2 | + |x3 − y3 | = 1. Chapitre 3. Méthode d’illumination globale par voxels 57 18-adjacence : x et y sont dits 18-adjacent s’ils partagent une face ou une arête, c’est à dire ils sont 26-adjacent et ont une coordonnée en commun. 26-adjacence : x et y sont dits 26-adjacent s’ils partagent une face ou une arête ou un sommet, c’est à dire si max(|x1 − y1 | , |x2 − y2 | , |x3 − y3 |) = 1. Les Figures 3.3, 3.4 et 3.5 montrent un exemple de points respectivement 6-adjacents, 18-adjacent et 26-adjacent au point x. Ces points sont aussi appelés les 6 voisins, les 18 voisins et les 26 voisins du point x. Soit E une partie de ∈ Z3 . Un point x est dit 6-adjacent (ou 18-adjacent ou 26-adjacent) à E si et seulement si x ∈ / E et x est 6-adjacent (ou 18-adjacent ou 26-adjacent) à un point de E. Fig. 3.3 – Le point x et ses 6 voisins Fig. 3.4 – Le point x et ses 18 voisins Fig. 3.5 – Le point x et ses 26 voisins 3.1.3 Chemin et connexité 3.1.4 Un k-Chemin Soit k = {4, 8} en 2D. Un k-chemin est une séquence finie d’éléments de points P1 , ..., Pn ∈ Z2 , tel que pour i = 1, ..., n − 1, le point Pi+1 est k-adjacent au point Pi . Soit k = {6, 18, 26} en 3D. Un k-chemin est une séquence finie d’éléments de points P1 , ..., Pn ∈ Z3 , tel que pour i = 1, ..., n − 1, le point Pi+1 est k-adjacent au point Pi . Chapitre 3. Méthode d’illumination globale par voxels 3.1.5 58 Composante connexe Une partie A de Z2 ou Z3 est appelée k-connexe si et seulement si pour n’importe quelle paire d’éléments de points P1 , P2 de A, il existe un k-chemin inclut dans A qui lie le point P1 au point P2 . 3.1.6 Droites discrètes 3.1.6.1 Droites discrètes 2D Les premiers objets étudiés en géométrie discrète furent les droites 2D discrètes. La représentation des droites discrètes est différente de la représentation des droites continues. Quand on veut discrétiser une droite continue, il faut prendre les points entiers qui représentent cette droite. Une droite continue vue sur une grille peut passer par des points entiers mais la plupart du temps, elle intersecte des arêtes de la grille (voir la Figure 3.6). La définition de la droite discrète revient alors à définir le choix des points entiers. Fig. 3.6 – Une droite continue sur une grille. Cette droite peut intersecter plusieurs arêtes de la grille Reveillès en 1991 [Rev91] donne une définition fondamentale de la droite discrète 2D. Une droite discrète ayant un vecteur directeur (a, b) peut être représentée par l’ensemble des points : (x, y) ∈ Z2 / 0 ≤ ax − by + µ < ω (3.1) où : µ : représente la position de la droite ω : représente l’épaisseur de la droite, ω caractérise aussi la connexité. La Figure 3.7 montre un exemple d’une droite 2D et l’effet de la variation de ω sur la droite. Reveillès a établi que : – si ω < max(|a| , |b|) alors la droite n’est pas 8-connexe, – si ω = max(|a| , |b|) alors la droite est 8-connexe d’épaisseur minimale, Chapitre 3. Méthode d’illumination globale par voxels 59 – si max(|a| , |b|) < ω ≤ |a| + |b| alors la droite est 8-connexe mais non 4-connexe d’épaisseur minimale, – si ω = |a| + |b| alors la droite est 4-connexe d’épaisseur minimale, – si ω > |a| + |b| alors la droite est épaisse. Une droite discrète est dite naïve (ω = max(|a| , |b|)) si elle est d’épaisseur minimal pour être 8-connexe, et standard (ω = |a| + |b|)) si elle est d’épaisseur minimale pour être 4-connexe. 3.1.6.2 Droites discrètes 3D Isabelle Debled-Rennesson [DR95] a proposé la définition de la droite discrète 3D. Etant donnée un vecteur de direction (a, b, c) ∈ Z3 avec a ≥ b ≥ c, la droite discrète 3D peut être définie comme l’ensemble de points x, y, z ∈ Z3 tel que : µ ≤ cx − az < µ + ω (3.2) µ0 ≤ bx − ay < µ0 + ω 0 Cette droite 3D représente l’intersection de deux plans discrets, chacun de ces plans est le plongement de l’extrusion de deux droites discrètes 2D dans l’espace. Le cas a ≥ b ≥ c est considéré car les autres cas peuvent être déduit par symétrie. Les paramètres ω et ω 0 ont une influence sur la connexité ; – si ω < a ou ω 0 < a, la droite n’est pas connexe, – si a ≤ ω ≤ a + c et a ≤ ω 0 ≤ a + b, la droite est 26-connexe, – si a + c ≤ ω et a ≤ ω 0 < a + b, ou a + b ≤ ω 0 et a ≤ ω < a + c, la droite est 18-connexe, – si a + c ≤ ω et a + b ≤ ω 0 , la droite est 6-connexe. 3.1.7 Autres objets discrets Hormis les droites discrètes, il faut noter qu’il existe des paramétrisations d’autres objets discrets telles les plans discrets [AAS97] les cercles, sphères, ellipses... et dont plus de détails se trouvent dans [And00, AJ97, And03]. 3.1.8 Partitionnement de l’espace La droite discrète 3D discrète peut se définir en utilisant deux projections [DR95]. Pour l’algorithme d’illumination de [CM06], ces deux droites 2D sont suffisantes pour reconstruire la droite 3D ; il y a parfois des bulles qui apparaissent, or ces bulles ne gènent pas les résultats d’illumination (plus de détails se trouvent dans [Cha06]). La Figure 3.8 montre un exemple d’une droite 3D discrète et ses deux projections. Si on prend le cas d’une direction ayant un vecteur directeur v̂ = [a, b, c] avec a, b, c ∈ Z 3 où Chapitre 3. Méthode d’illumination globale par voxels ! " 2 1 60 ! " 2 1 !=1, "=2 !=1, "=1 ! " 2 1 ! " 2 1 !=1, "=4 !=1, "=3 2 (x, y) ∈ Z /µ ≤ ax − by < µ + ω Fig. 3.7 – Une droite discrète 2D : différente épaisseur avec (a, b) = (2, 1) 10 7 3 z y x Fig. 3.8 – Une droite 3D discrète ayant un vecteur directeur (10, 7, 3) et ses deux projections Chapitre 3. Méthode d’illumination globale par voxels 61 a ≥ b ≥ c ≥ 0 ; les projections en 2D sont dans les plans (Oxy) and (Oxz) et donc ωbc est nul. La droite discrète 3D est équivalente à l’ensemble des (x, y, z) ∈ Z2 tel que : µab ≤ −bx + ay < µab + ωab µ ≤ −cx + az < µ + ω ac ac ac Vue que a, b, c, ωab , ωac sont fixes, seule la position de la droite est choisie. L’ensemble des voxels est représenté par L(µab , µac ). L’ensemble de droites 3D discrète Li,j représenté par {Li,j }(i,j)∈Z2 = {L(i × ωab , j × ωac )}(i,j)∈Z2 peut être défini comme suit : i × ωab ≤ −bx + ay < i × ωab + ωab j × ωac ≤ −cx + az < j × ωac + ωac i × ωab ≤ −bx + ay < (i + 1) × ωab or j × ωac ≤ −cx + az < (j + 1) × ωac Etant donné un voxel, (x, y, z) ∈ Z3 , ce voxel appartient à une droite Li,j où i = c and j = b −cx+az c. i et j sont calculés à partir des coordonnés du voxel et du b −bx+ay ωab ωac vecteur directeur de la direction. Donc étant donnée une direction, l’espace peut être partitionné en des droites 3D discrètes de même direction. Un voxel (x, y, z) ∈ Z3 , appartient à une seule de ces droites discrètes. 3.2 La Radiosité : définition et équation La radiosité est définie comme l’énergie totale émise par un point d’une surface par unité de surface. L’équation de la radiosité est une équation physique traduisant un transfert d’énergie entre différents éléments. La forme générale de l’équation de radiosité a été donnée au Chapitre 2, Section 2.4.1 : Z B(x) = Be (x) + ρd 0 cos θ cos θ V (x, y)dy B(y) π kx − yk2 y∈ scène (3.3) Cette équation a été discrétisée dans [Mal02b]. L’équation discrétisée est la suivante : B(x) = Be (x) + ρd X B(V (x, ~σ )) cos θ(x, V (x, ~σ ))A(~σ ) (3.4) ~ σ ∈D L’explication de l’équation est : la quantité totale de lumière émise par un point est égale à la propre émittance du point comme source de lumière (le terme Be (x)) et quelque ré-émission que le point reçoit de son environnement (la somme). La signification des différents termes de cette équation discrète est la suivante : – Be (x) : la propre émittance du point en tant que source lumineuse ; Chapitre 3. Méthode d’illumination globale par voxels 62 Fig. 3.9 – Etant donné une direction ~σ et un point x, V (x, y) est une fonction de visibilité retournant le premier voxel y rencontré à partir de x dans la direction ~σ . θ représente l’angle entre la normal au point x et la droite partant de x dans la direction ~σ – ρd : paramètre de la capacité de réémission d’un élément. Un point émet une fraction de la lumière qu’il reçoit ; – D : l’ensemble des directions dans l’espace ; – V (x, ~σ ) : Une fonction de visibilité qui retourne le premier point rencontré à partir de x dans la direction ~σ (voir la Figure 3.9) ; – B(V (x, ~σ )) : la radiosité du premier point rencontré à partir de x dans la direction ~σ ; – A(~σ ) : Une fraction de l’angle solide associée à la direction ; – cos θ(x, V (x, ~σ )) traduit l’importance de l’incidence dans le modèle d’éclairement diffus. 3.3 Résolution de l’équation : méthode quasi-linéaire Une première résolution de l’équation (3.4) de radiosité a été donnée par Malgouyres [Mal02a]. La scène est discrétisée (subdivisée en voxels) en n’encodant des voxels que sur les surfaces. Ensuite la résolution de l’équation se répartie en deux étapes : – la première étape consiste à calculer pour tout (x, ~σ ) le voxel V (x, ~σ ). Ce calcul est basé sur le lancer de rayon discret qui représente le rayon par une droite discrète ; cette droite est parcouru utilisant l’algorithme de lancer de rayon depuis son point de départ jusqu’à arriver à un voxel de l’objet. Une optimisation du lancer de rayon usuel, utilisant des bounding box stockées dans un octree est adoptée ; cette optimisation a permis de simplifier les tests d’intersection d’un rayon avec tous les objets de la scène ; – La deuxième étape est la résolution de l’équation par des méthodes itératives convergente (Chapitre 2, Section 2.4.3.1) comme la méthode de Jacobi ou GaussSeidel). Cette première résolution a une complexité raisonnable mais en pratique sur des scènes 3D le coût est assez important. Chatelier et Malgouyres [Cha06] ont trouvé un moyen d’améliorer cette résolution : ils ont proposé un algorithme quasi-linéaire de résolution Chapitre 3. Méthode d’illumination globale par voxels 63 Fig. 3.10 – Le parcours des voxels dans un ordre quelconque pour les mettre en place dans les listes auxquelles ils appartiennent ne garantit pas la visibilité entre les voxels. Un tri de chacune des listes en terme de visibilité est nécessaire dont les détails seront expliqués dans les sections suivantes. 3.3.1 Partitionnement de l’espace et visibilité L’idée de partitionnement de l’espace en droites 3D et l’appartenance d’un voxel à une et une seule droite permet de résoudre le problème de visibilité. Etant donné une direction ~σ , un tableau bi-dimensionel peut être créé. Ce tableau aura pour indice i, j, où (i, j) représente l’indice d’une liste Li,j de l’espace. Les voxels de la scène sont parcourus, le (i, j) de chaque voxel est trouvé et le voxel est stocké dans la liste (i, j) à laquelle il appartient. Or la mise en place des voxels dans les listes auxquelles ils appartiennent ne garantit pas la visibilité entre les voxels d’une même liste (Figure 3.10). Il faut trier les listes des voxels pour garantir la visibilité. Or ce tri est coûteux surtout quand les listes sont denses (contenant beaucoup de voxels). Dans [CM06] une manière permettant d’éviter ce tri est explicitée. En parcourant les voxels avec un ordre particulier, (l’ordre lexicographique (Section 3.3.2)), il est possible d’éviter le tri des listes et de mettre les voxels directement dans leur ordre correct (l’ordre de visibilité) dans la liste correspondante. 3.3.2 Ordres lexicographiques Comme il a été noté dans la Section 3.3.1, il est possible d’éviter le tri des voxels par ordre de visibilité en choisissant un certain ordre particulier dans le parcours des voxels. Cet ordre est l’ordre lexicographique (Figure 3.11). En général il y a 48 ordres lexicographiques. Parmi ces 48, 24 sont utiles, les autres étant simplement les ordres opposés. En plus ces 24 peuvent se réduire à 4 ((x ↑ y ↑ z ↑),(x ↑ y ↓ z ↓),(x ↑ y ↑ z ↓ Chapitre 3. Méthode d’illumination globale par voxels 64 Fig. 3.11 – Le parcours des voxels dans l’ordre lexicographique garantit la visibilité entre les voxels ),(x ↑ y ↓ z ↑)) en utilisant les symétries. Par exemple les ordres (x ↑ y ↑ z ↑) est le même que (y ↑ x ↑ z ↑) donc le placement de y avant x ou x avant y, ne change rien. Notons que le choix de l’ordre lexicographique dépend du vecteur directeur de la direction. La Figure 3.12 illustre un exemple du choix de l’ordre lexicographique. Pour une direction ayant un vecteur directeur v~1 , l’ordre lexicographique choisi est (x ↑ y ↓ z ↑) et pour v~2 , l’ordre lexicographique choisi est (x ↓ y ↑ z ↓) qui est le réciproque de (x ↑ y ↓ z ↑). 3.3.2.1 Discrétisation de la scène La discrétisation de la scène en voxels est effectuée en utilisant un algorithmes de discrétisation mais cela se situe hors du cadre de cette thèse. Plus de détails sur les algorithmes adoptés pour la discrétisations se trouvent dans [Cha06] à la page 80. Fig. 3.12 – Le choix de l’ordre lexicographique dépend du vecteur direction de la direction. Si le vecteur directeur est v~1 , l’ordre lexicographique choisit est (x ↑ y ↓ z ↑), et si c’est v~2 , l’ordre lexicographique choisit est (x ↓ y ↑ z ↓) Chapitre 3. Méthode d’illumination globale par voxels 3.3.3 65 Calcul de l’ensemble des directions Dans l’équation (3.4), la somme est effectuée autour d’un ensemble D des directions ~σ . Cet ensemble de directions doit être assez isotrope et paramétré de façon à générer plus ou moins de directions. Une sphère discrète convient bien pour la génération de ses direction ; le rayon de la sphère détermine le nombre de directions (Figure 3.13). Fig. 3.13 – L’ensemble de directions est construit à partir d’une sphère discrète. Le rayon de la sphère contrôle le nombre de directions 3.3.4 Étapes de l’algorithme Pour résoudre l’équation (3.4) d’illumination, Chatelier et Malgouyres [CM06] utilise une méthode itérative convergente qui est la méthode de Gauss-Seidel necessitant plusieurs itérations afin d’obtenir une convergence vers la bonne solution d’illumination. La résolution complète de l’équation nécessite le calcul de l’ensemble des directions (Section 3.3.3). L’algorithme illustrant les différentes étapes du calcul de l’illumination est montré en Algorithme 3.1. Notons que les étapes les plus importantes du point de vue calcul de cet algorithme sont la mise en place des voxels et la propagation de la lumière dans les listes. Etant donnée une direction, la mise en place des voxels dans les listes consiste à parcourir les voxels de la scène selon l’ordre lexicographique approprié, trouver pour chaque voxel la liste (i, j) à laquelle il appartient et insérer le voxel en queue de cette liste (i, j). La propagation de la lumière dans les listes consiste à échanger la lumière entre les voxels voisins en terme de visibilité ; pour cela une propagation avant et arrière est effectuée pour assurer un échange réciproque entre deux voxels voisins. La Figure 3.14 montre un exemple de la propagation de la lumière dans les listes. Chapitre 3. Méthode d’illumination globale par voxels 66 Fig. 3.14 – La propagation de la lumière dans les listes nécessite un échange mutuel de lumière entre les voxels appartenant à une même liste et voisins en terme de visibilité Préparer les 4 ordres lexicographiques Construire l’ensemble de directions Pour(chaque itération) Pour(chaque direction) Sélectionner l’ordre lexicographique approprié Pour (chaque voxel) mettre le voxel en fin de la liste à laquelle il appartient Fin Pour Pour (chaque liste) Propager la lumière dans la liste Fin Pour Remise à zéro des listes Fin Pour Fin Pour Algorithme 3.1 – Algorithme quasi-linéaire du calcul de l’illumination Chapitre 3. Méthode d’illumination globale par voxels 3.3.5 Complexités 3.3.5.1 Complexité temporelle 67 Du point de vue complexité, si on note N le nombre de voxels dans la scène, I le nombre d’itérations et D le nombre de directions, la complexité de l’algorithme d’illumination est 4 × O(N log N ) + I × D × (O(N ) + O(N )) = O(N log N ) + O(I × D × N ) Le premier terme 4 × O(N log N ) est le temps de trier les voxels par ordre lexicographique. Puisque le nombre d’ordres lexicographiques est limité (4 ordres lexicographiques), les quatre tris des voxels sont considérés comme un pré-calcul ; les voxels sont triés une fois au début avant de commencer l’algorithme de calcul de l’illumination globale et les quatre vecteurs triés sont gardés en mémoire. Le deuxième terme O(I ×D×N ) est le temps du calcul de l’illumination. Il représente la mise en place et la propagation de la lumière dans les listes. Ce temps dépend de 3 variables : – I est le nombre d’itérations qui est nécessaire pour la convergence vers la bonne solution d’illumination ; I est généralement bornée 4 à 6 itérations sont suffisantes pour des grandes scènes ; – D est le nombre de directions. Cette constante est indépendante du nombre de voxels, elle dépend de l’intensité des sources lumineuses. Elle est augmentée pour éviter les effets d’aliasing quand les sources ont une large intensité lumineuse ; – N est le nombre de voxels qui dépend des scènes et pourra augmenter largement pour des grandes scènes. 3.3.5.2 Complexité spatiale Soit N le nombre de voxels de la scène, ces voxels sont stockées en mémoire en O(N ). Dans une direction, l’ensemble de toutes les listes contient une référence unique à chaque voxel, si bien que la complexité spatiale de cet ensemble est de O(N ). Les ordres lexicographiques précalculés sont stockés dans des tableaux et coûtent O(N ). Un tableau bi-dimensionnel est utilisé pour stocker les listes. Le nombre de listes est lié au carré de la largeur de la scène. √ Seules les surfaces des objets étant discrétisées, cette largeur est en moyenne en O( N ). O(N ) listes sont donc nécessaires. Les listes sont remises à zéro à chaque direction, le coût de stockage n’augmente donc pas au fur et à mesure du déroulement de l’algorithme. Au final, la complexité spatiale est un O(N ) qui peut être confondu avec le O(N ) nécessaire pour stocker les données à traiter. Chapitre 3. Méthode d’illumination globale par voxels 68 (a) (b) (c) Fig. 3.15 – (a) Une scène 3D avant le calcul de l’illumination. (b) Représentation voxels de la scène, pour le calcul de l’illumination. (c) Scène 3D affichée avec les données calculées de l’illumination Chapitre 3. Méthode d’illumination globale par voxels 3.4 69 Résultats La Figure 3.15(a), reprise de [Mal02b], permet la visualisation d’une scène avant le calcul de l’illumination. Cette scène est discrétisée en voxels (Figure 3.15(b)) ensuite le calcul de l’illumination est effectuée. Le résultat visuel final du calcul de l’illumination est montré en Figure 3.15(c) qui reflète l’éclairage final de la scène. Concernant les temps de calcul, l’algorithme d’illumination est testé sur différentes scènes prenant différent nombres de directions permettant ainsi de voir la variation du temps en fonction du nombre de directions. La Figure 3.16 montre le temps séquentiel du calcul d’illumination pour différents nombre de directions ; les tests sont effectués sur une scène d’un salon contenant un million sept mille voxels avec 6 itérations. La Figure 3.17 montre le même test effectué sur la scène du salon, se répéter sur trois différentes scènes. La première scène est la scène d’une cabine, la deuxième est la scène d’une salle de travail et la troisième est la scène d’une église ; ces trois scènes contiennent respectivement 3,1 millions, 3,25 millions et 3,5 millions voxels. Les résultats montrent que les quatre tris pré-calculés des voxels et qui ont une complexité 4 × O(N log N ), N étant le nombre de voxels, n’ont aucune influence sur les résultats, c’est toujours le coup linéaire qui domine. Il est clair aussi que le temps varie d’une manière linéaire par rapport au nombre de directions. 1000 Salon Temps (minutes) 800 600 400 200 0 2000 4000 6000 8000 10000 12000 Nombre de directions Fig. 3.16 – Temps de calcul en fonction du nombre de directions de l’algorithme séquentiel d’illumination pour la scène d’un salon Chapitre 3. Méthode d’illumination globale par voxels 70 Cabine Eglise Salle de travail 1200 Temps (minutes) 1000 800 600 400 200 0 1000 2000 3000 4000 5000 6000 Nombre de directions 7000 8000 Fig. 3.17 – Temps de calcul en fonction du nombre de directions de l’algorithme séquentiel d’illumination pour trois différentes scènes 3.5 Étude de convergence Dans l’algorithme séquentiel d’illumination globale ainsi que dans les parallélisations de cet algorithme [CM06, ZCFM06, ZFM06] qui seront étudiées en détails dans les chapitres suivant, la méthode itérative de Gauss-Seidel est utilisée pour résoudre le système d’équations. La plupart des algorithmes d’illumination par radiosité utilisent des méthodes itératives afin de résoudre le système d’équations, car les méthodes directes sont coûteuses en terme de complexité. Les méthodes itératives ne calculent pas une solution exact mais une solution approchée avec une certaine erreur [RF98]. La résolution du système d’illumination avec la méthode de Gauss-Seidel, nécessite plusieurs itérations afin d’obtenir une convergence vers la bonne solution d’illumination. Or l’équation d’illumination à résoudre, équation (3.4), ne dépend pas seulement du nombre d’itérations, mais elle contient aussi un facteur de direction. Le facteur de direction est calculé en utilisant une sphère discrète qui génère un ensemble de directions. Le nombre de directions dépend du rayon de la sphère discrète ; un rayon plus élevé génère plus de directions [Mal02b, Cha06] qu’un rayon moins élevé. En terme de précision des résultats d’illumination, il est intéressant de regarder l’influence des deux facteurs, le nombre d’itérations et le nombre de directions, sur la convergence de l’algorithme vers la bonne solution d’illumination. Les Chapitre 3. Méthode d’illumination globale par voxels 71 tests de convergence consistent à fixer le nombre de directions et à faire varier le nombre d’itérations afin de voir l’influence de ce facteur sur la convergence. De même, ces tests consistent à fixer le nombre d’itérations et à faire varier le nombre de directions. Le nombre de directions est définit par rapport à la sphère discrète en prenant en compte toutes les directions ou seulement un pourcentage de ces directions choisies d’une manière aléatoire. Les sections qui viennent montrent les erreurs obtenues en changeant le nombre de directions ainsi que le nombre d’itérations en regardant leurs effets vers la convergence de la solution d’illumination. 10 10 Erreur moyenne (toutes les directions) Erreur maximale (toutes les directions) Erreur moyenne (80% des directions) Erreur maximale (80% des directions) 1 1 0.1 Erreur Erreur 0.1 0.01 0.01 0.001 0.001 0.0001 0.0001 1e−005 1e−005 0 30 60 90 120 150 180 Rayon de la sphère discrète 210 240 270 300 Fig. 3.18 – Effet de la variation du rayon de la sphère discrète sur l’erreur. Pas d’Epsilon 3.5.1 Erreur moyenne (toutes les directions) Erreur maximale (toutes les directions) Erreur moyenne (80% des directions) Erreur maximale (80% des directions) 0 30 60 90 120 150 180 Rayon de la sphère discrète 210 240 270 300 Fig. 3.19 – Effet de la variation du rayon de la sphère discrète sur l’erreur. Epsilon=10−5 Scène de référence L’étude de convergence requiert un calcul séquentiel exact d’illumination accompli sur une scène spécifique, cette scène sera appelée “scène de référence” car elle sera considérée comme une scène fournissant le résultat exact d’illumination. L’étude de convergence de l’algorithme d’illumination reviendra alors à calculer l’illumination de la scène variant le facteur de direction ou d’itération, et mesurer l’erreur de la scène obtenue par rapport à la “scène de référence”. Le calcul de cette “scène de référence”, demande une prise d’un nombre de directions relativement large afin de garantir un calcul exact d’illumination ainsi qu’un nombre d’itérations suffisant permettant de garantir la convergence vers une solution exact d’illumination, avec la moindre erreur possible. 3.5.2 Mesure d’erreur Pour une scène donnée, la première étape est le calcul de la “scène de référence”. La valeur d’illumination d’un voxel v de cette scène est dénotée comme l’“illumination Chapitre 3. Méthode d’illumination globale par voxels 72 exacte”. Ensuite pour cette même scène, le nombre de directions est fixé (rayon de la sphère discrète) ainsi que le nombre d’itérations et la valeur d’illumination des voxels est calculée ; la valeur d’illumination d’un voxel v de la scène sera notée l’“illumination courante”. Une erreur entre l’“illumination exacte” et l’“illumination courante” pour chacun des voxels est calculée. Cette erreur permet de voir l’influence de la variation du nombre de directions et du nombre d’itérations sur le résultat d’illumination. Dans l’algorithme d’illumination [CM06], les voxels d’une scène renferme plusieurs informations (émittance, reflectance, coefficient de réflexion, etc...). Ces informations sont utilisées pour le calcul d’illumination. Or l’étude de convergence requiert une seule information ; c’est la valeur d’illumination (RGB) de chacun des voxels de la scène. La première erreur à calculer est l’erreur moyenne : P nbV oxels Erreur où Erreur = |fi − gi |, fi et gi sont respectivement erreur moyenne = i=0nbV oxels l’“illumination courante” et l’“illumination exacte” d’un voxel i. nbV oxels est le nombre de voxels de la scène. L’erreur maximale, représentant la valeur maximale des erreurs (RGB) d’illumination des voxels de la scène. L’erreur maximale est importante afin de savoir la valeur maximale des erreurs des voxels de la scène. Les deux erreurs erreur moyenne et erreur maximale, considère l’Erreur comme i| . La mesure étant |fi − gi |. Or il est aussi important de mesurer l’erreur réelle |fig−g i de l’erreur réelle peut être problématique dans certains cas, spécialement si les valeurs d’illumination traitées sont petites. Dans ces cas, pour un voxel donné, si l’“illumination exacte” est relativement petite, l’erreur réelle peut atteindre une valeur élevée, sans que f et g de ce voxel ne soient tellement différents. Afin de résoudre un tel problème, une notion d’epsilon est introduite : i| si gi > epsilon . En variant epsilon il est erreur réelle (avec epsilon) = |fig−g i possible de diminuer l’influence des valeurs d’illumination très faibles qui parfois génèrent des erreurs relatives importantes sans justification du point de vue de la précision. 3.5.3 Résultats Les tests de convergence sont effectués pour la scène d’une cabine composée de 3.1 million de voxels. Les Figures 3.18, 3.19 et 3.20 montrent les résultats de convergence en utilisant 6 itérations et en variant le rayon de la sphère discrète. Une variation du rayon de la sphère discrète implique une variation du nombre de directions. Au début toutes les directions générées par la sphère sont prises en compte, puis un certain pourcentage de ces directions, prises d’une façon aléatoire, est considéré. 80 percent indique que seulement 80 pourcent de ces directions sont prises. Les résultats montrent que l’erreur diminue quand le rayon de la sphère discrète augmente, donnant plus de précision aux résultats. Il a été remarqué à travers les résultats, qu’il y a un risque de diminution de la rapidité de convergence en prenant, d’une manière aléatoire, un pourcentage (80 pourcent) des directions générées par la sphère discrète. Il est clair en regardant les Chapitre 3. Méthode d’illumination globale par voxels 73 résultats que le fait de prendre une partie des directions n’est pas suffisant et il est préférable de prendre l’ensemble complet de directions. 10 Erreur moyenne (toutes les directions) Erreur maximale (toutes les directions) Erreur moyenne (80% des directions) Erreur maximale (80% des directions) Erreur moyenne (toutes les directions) Erreur maximale (toutes les directions) 1 0.01 Erreur Erreur 1 0.0001 1e−006 0.1 1e−008 1e−010 0.01 0 30 60 90 120 150 180 Rayon de la sphère discrète 210 240 270 300 Fig. 3.20 – Effet de la variation du rayon de la sphère discrète sur l’erreur. Epsilon=10−7 2 3 4 5 6 Nombre d’itérations 7 8 9 Fig. 3.21 – Effet de la variation du nombre d’itérations sur l’erreur. Pas d’Epsilon les Figures 3.21, 3.22 et 3.23 montrent l’erreur obtenue en fixant le rayon de la sphère discrète à 55 et variant le nombre d’itérations. Il est possible de voir que quand le nombre d’itérations augmente, l’erreur diminue d’une manière linéaire. Cette chute de l’erreur est plus rapide que celle obtenue en augmentant le nombre de directions. Cela montre la grande importance du nombre d’itérations sur la convergence de l’algorithme d’illumination. Il est sûr que le nombre de directions a une influence remarquable, mais c’est surtout le nombre d’itérations qui a une plus grande influence sur la convergence. 100 Erreur moyenne (toutes les directions) Erreur maximale (toutes les directions) 100 Erreur moyenne (toutes les directions) Erreur maximale (toutes les directions) 10 1 1 0.1 Erreur Erreur 0.01 0.0001 0.01 0.001 1e−006 0.0001 1e−008 1e−005 1e−010 1e−006 2 3 4 5 6 Nombre d’itérations 7 8 9 Fig. 3.22 – Effet de la variation du nombre d’itérations sur l’erreur. Epsilon=10−5 2 3 4 5 6 Nombre d’itérations 7 8 9 Fig. 3.23 – Effet de la variation du nombre d’itérations sur l’erreur. Epsilon=10−7 Chapitre 3. Méthode d’illumination globale par voxels 3.6 74 Conclusion L’algorithme d’illumination présenté dans ce chapitre est quasi-linéaire, mais c’est la constante I × D × N (Section 3.3.5.1) qui induit un temps de calcul important pour de grandes scènes. C’est là où la parallélisation joue son rôle afin d’améliorer le temps de calcul pour des grandes scènes (millions de voxels) contenant de sources intenses et nécessitant donc un grand nombre de directions et d’itérations. L’étude de convergence de l’algorithme d’illumination montre les effets de variation des deux facteurs le nombre d’itérations et le nombre de directions sur la convergence de l’algorithme. Le nombre d’itérations même s’il est bornée, est un facteur très important sur la convergence. En incrémentant ce facteur, il est possible de minimiser largement l’erreur. Concernant le facteur de directions, celui-ci a aussi une grande influence sur la convergence et son incrémentation diminue l’erreur. Les résultats des tests sur le facteur de directions ont montrés qu’il est préférable en générant un ensemble de directions à travers une sphère discrète de prendre tout l’ensemble de directions et non une partie de cet ensemble. Ce facteur a une influence importante sur la convergence mais son influence est moins directe que le facteur d’itérations qui lui, permet une chute rapide de l’erreur. Il faut noter que l’algorithme d’illumination par voxels [Cha06] est plus coûteux en temps de calcul que les algorithmes de radiosité par patchs ou les algorithmes de lancer de rayons. Cela est dû au fait que les patchs, qui peuvent être de tailles variables et dynamiques, sont souvent mieux adaptés à la représentation des grandes surfaces que les voxels, qui sont de tailles identiques. Pour des scènes contenant trop de détails, les voxels doivent être petits pour permettre plus de précision dans le calcul, ce qui augmente considérablement le temps de calcul. Les chapitres qui suivent présentent différentes parallélisations qui vont améliorer le temps de l’algorithme séquentiel et minimiser la mémoire. Les deux premières parallélisations sont la parallélisation locale et la distribution du calcul. Elles ne distribuent pas les données et nécessitent une duplication des voxels sur les noeuds des grappes pour le calcul d’illumination. Les deux autres parallélisations distribuent les données et permettent alors le traitement de grandes scènes qui n’entrent pas en mémoire. Notons finalement qu’une version étendue de cet algorithme du cas diffus idéal au cas BRDF a été proposée par Pierre Chatelier [CM07]. Ces extensions seront parallélisées dans un prochain travail. Une autre version de l’algorithme est aussi en cours par un doctorant (Lukasz Piwowar) ; cette version tend à réduire le nombre de voxels en offrant un affichage non aliasé diminuant largement le temps de calcul. La combinaison de l’algorithme [CM06] avec celui de Lukasz Piwowar permettra probablement d’offrir un algorithme séquentiel compétitif par rapport aux autres algorithmes d’illumination globale comme la radiosité par patchs ou le photon mapping. Chapitre 4 Parallélisation locale et distribution du calcul L’algorithme séquentiel de calcul de l’illumination globale nécessite une augmentation du nombre de directions quand l’intensité des sources lumineuses augmente. Cet algorithme a montré des temps de calcul élevés à la fois quand le nombre de directions augmente et quand le nombre de voxels augmente. Cela fait appel au calcul parallèle qui constitue une solution pour améliorer les performances en temps. Dans ce chapitre, une présentation des machines utilisées pour tester les différentes parallélisations réalisées dans ce mémoire est effectuée. Ce chapitre traite deux parallélisations distinctes de la méthode d’illumination globale effectuées sur un cluster localisé au LAIC, comprenant des noeuds à mémoire distribuée. Nous avons utilisé le transfert de messages comme moyen de communication entre les noeuds. Les deux parallélisations ne distribuent par les données mais les dupliquent sur les noeuds. La première parallélisation est locale : elle consiste à utiliser la programmation multithreadée utilisant les threads pour effectuer des activités en parallèle. Le travail avec les threads est efficace grâce à la structuration physique des noeuds constitués de bi-processeurs. La deuxième parallélisation est une distribution du calcul qui répartit l’ensemble de directions entre les noeuds permettant ainsi un traitement en parallèle des directions. Ces deux approches sont détaillées et testées sur différentes scènes montrant des résultats très encourageants. 4.1 Description des machines utilisées pour le calcul parallèle Les machines utilisées pour tester les différentes parallélisations au cours de cette thèse, sont des grappes de stations de travail (cluster of workstations), des machines MIMD à mémoire distribuée ou multi-ordinateurs (voir Section. 1.4.1.1). Chaque processeur dispose de sa propre mémoire privée. L’espace d’adressage est physiquement 75 Chapitre 4. Parallélisation locale et distribution du calcul 76 distribué. La communication entre les processeurs se fait à travers le transfert de messages via le réseaux d’interconnexion ; la librairie MPI est utilisée pour le transfert de messages. Deux clusters sont utilisées pour les tests, le cluster localisé au LAIC (cluster Laic) et le cluster localisé à l’ISIMA (cluster Isima). Une présentation de ces deux grappes est décrite ci-dessous. 4.1.1 Cluster Isima Les grappes de stations de travail se compose de 15 machines, 1 machine maître (noeud de management) et 14 noeuds de calcul. Ces noeuds sont des machines bi-processeurs Xeon hyperthreadés 2.8 GHz, ayant chacune 2 Go de RAM et munie d’un disque 73 Go SCSI. 4.1.2 Cluster Laic Les grappes de stations de travail se compose de 11 machines, 1 machine maître (noeud de management) et 10 noeuds de calcul. Ces noeuds sont des machines bi-processeurs Xeon hyperthreadés 2.67 GHz, ayant chacune 2 Go de RAM et munie d’un disque 73 Go SCSI. Fig. 4.1 – Quatre activités exécutées en séquentiel 4.2 4.2.1 Parallélisation locale Threads et programmation multithreadée La programmation multithreadée est une programmation qui utilise les threads et qui permet d’accomplir des activités en parallèle. Blaess [Bla00] traduit le mot thread par une “file d’exécution”, c’est-à-dire un déroulement particulier du code du programme qui se produit parallèlement à d’autres entités en cours de progression. Les threads sont caractérisés par un même espace d’adressage ce qui leur permet de partager des données. Chapitre 4. Parallélisation locale et distribution du calcul 77 Fig. 4.2 – Quatre activités exécutées en parallèle en utilisant les threads. Théoriquement, le temps final est le temps de l’activité la plus longue Dans une application donnée, des threads sont crées selon le nombre d’activités à accomplir et chacun de ces threads est responsable d’une certaine activité. La programmation multithreadée a pour avantage d’aider à augmenter la parallélisation. Dans une application non threadée, le temps pour accomplir quatre activités est la somme des temps nécessaires pour accomplir chacune de ces activités (Figure 4.1). Or dans une application multithreadée, on peut imaginer le temps pour accomplir quatre activités comme le temps de la plus longue activité (Figure 4.2). En pratique c’est pas toujours le cas, l’efficacité des threads est très liée au système utilisé (bi-processeur multithreadé ou hyper-threadé...) et qui parfois limite l’efficacité des threads. Un même travail multithreadé effectué sur des mono-processeurs est plus lent que s’il est achevé sur des biprocesseurs ; cela vient du fait que les bi-processeurs sont capables de lancer des threads sur chacun des deux processeurs alors que dans une application mono-processeur tous les threads sont lancés sur un même processeur. Les threads peuvent aider à maximiser la parallélisation. Ils peuvent exécuter plusieurs activités en parallèle. Prenons par exemple le cas d’un programme où un thread donné a besoin d’attendre un système de finir. Pendant ce temps d’attente, les autres threads peuvent accomplir plusieurs travaux accélérant ainsi le temps total d’exécution du programme. Il faut noter que les threads ne sont intéressants que dans les applications comprenant plusieurs tâches qui peuvent s’exécuter en parallèle. La programmation avec les threads est complètement inutile si les opérations sont dépendantes et si une opération doit attendre l’opération précédente pour pouvoir s’exécuter. Chapitre 4. Parallélisation locale et distribution du calcul 78 L’implémentation des threads sous linux (norme POSIX) peut se faire sous deux possibilités : l’implémentation dans l’espace noyau et l’implémentation dans l’espace utilisateur. Dans notre travail l’implémentation est effectuée dans l’espace utilisateur, utilisant la bibliothèque POSIX de linux référencée par POSIX threads ou Pthreads. 4.2.2 Utilisation des threads dans la méthode d’illumination globale La méthode d’illumination globale en séquentiel, comprend deux étapes essentielles, la distribution des voxels dans les listes et la propagation de la lumière dans les listes, qui sont coûteux en temps de calcul et qui se répètent à chaque direction. Ces deux étapes peuvent être partagées en plusieurs sous tâches indépendantes qui sont distribuées parmi les threads pour être traitées en parallèle. Les sections qui viennent expliquent l’utilisation des threads dans chacune de ces deux étapes du calcul d’illumination globale. 4.2.2.1 Distribution des voxels dans les listes La distribution des voxels dans les listes consiste à parcourir les voxels dans l’ordre lexicographique, trouver le i et j (partition de l’espace en droites) de chacun des voxels selon la direction (Figure 4.3) et insérer le voxel selon son (i, j), dans la liste à laquelle il appartient (voir Chapitre 3). Ce travail n’est pas coûteux pour une petite scène mais pour traiter des grandes scènes formées de millions des voxels, il devient important. La diminution du coût de ce calcul est possible grâce à l’utilisation des threads : l’ensemble de voxels peut être réparti sur les threads pour se traiter en parallèle. Pour une direction donnée, le vecteur de voxels (Figure 4.3) représentant les voxels de la scène est distribué parmi les threads. Cette distribution consiste à donner à chacun des threads une partie plus ou moins équitable de voxels afin d’équilibrer la charge de travail pour tous les threads. Cela évite les temps d’attentes causés par des threads qui ont fini le traitement de leurs tâches avant d’autres qui ont plus de travail à faire. Une fois les voxels répartis sur les threads, chaque voxel est inséré dans la liste à laquelle il appartient en respectant le parcours des voxels dans l’ordre lexicographique. L’ordre lexicographique maintient la visibilité entre les voxels lors de leur mise en place dans les listes de visibilité. Cet ordre est donc important et ne doit pas être bouleversé faute d’influence sur la visibilité des voxels. Le fait de distribuer les voxels sur les threads afin d’être traités en parallèle risque de ne pas maintenir l’ordre lexicographique lors de la mise en place des voxels dans leurs listes. La Figure 4.4 montre un exemple d’un vecteur de voxels rangés dans un certains ordre lexicographique et distribués sur trois threads. Quand les threads démarrent leur travail parallèle, les voxels “e”, “g” et “i” ayant le même (i, j) risquent de ne pas être mis dans le bon ordre de visibilité si le thread2 met son voxel “g” avant le voxel “e” du thread1 alors que les données du thread2 viennent après ceux du thread1 dans l’ordre lexicographique (le voxel “e” vient avant le voxel “g” dans l’ordre lexicographique). Chapitre 4. Parallélisation locale et distribution du calcul 79 Fig. 4.3 – Des voxels classés dans l’ordre lexicographique et leur (i, j) pour une direction donnée Fig. 4.4 – Distribution des voxels sur trois threads. Le risque de perdre le bon ordre des voxels si thread2 met son voxel “g” avant le voxel “e” du thread1, alors que “g” vient après “e” dans l’ordre lexicographique La solution à ce problème consiste à créer une structure de données distincte pour chacun des threads dans laquelle le thread met toutes ses listes de visibilité. La Figure 4.5 montre un exemple de création de trois structures de données distinctes pour la mise en place des listes de visibilité pour chacun des trois threads. Cela évite les accès concurrents des threads aux listes de visibilité et permet aux threads une construction des listes sans tenir compte d’aucune contrainte de priorité parmi les threads. 4.2.2.2 Propagation de la lumière dans les listes Regroupement des structures Dans l’étape de mise en place des voxels dans les listes, chaque threads insère ses voxels un par un dans leurs listes correspondantes, dans la structure de données destinée au thread en question. Après cette étape, une propagation de la lumière dans les listes Chapitre 4. Parallélisation locale et distribution du calcul 80 Fig. 4.5 – Création d’une structure de données distincte pour chacun des threads dans laquelle le thread met ses listes de visibilité est nécessaire pour le calcul de l’illumination. La propagation de la lumière dans les listes consiste à propager la lumière entre les voxels voisins en terme de visibilité appartenant à une même liste. Or les listes de visibilité construites au cours de la mise en place des voxels ne sont pas des listes complètent car des structures de données distinctes sont créées pour chacun des threads. Un regroupement des voxels appartenant à une même liste mais présents sur une structure de donnés distincte est nécessaire ; cela permet d’obtenir une seule structure contenant toutes les listes de visibilité de la scène. Une manière de faire le groupement consiste à regrouper les voxels appartenant à une même liste en suivant le même parcours de voxels effectué au moment de la construction des listes par les threads, tenant compte ainsi de l’ordre des structures de données. Par exemple dans la Figure 4.6, les voxels du thread1 se situent avant thread2 dans l’ordre lexicographique et ceux du thread2 se situent avant ceux du thread3. Cela indique qu’il faut partir des listes du thread1, insérer en queue de liste tous les voxels d’une même liste localisés sur les structures de données construites par les autres threads. Les voxels sont rajoutés en queue de liste afin de respecter l’ordre lexicographique des voxels. Une fois le regroupement effectué, les listes de voxels sont partagées entre les threads pour être traitées en parallèle. La distribution des listes entre les threads consiste à donner à chaque thread une partie des listes. Or cette distribution doit être convenable. Une distribution des listes en divisant le nombre de listes par le nombre de threads n’est pas une bonne distribution car certaines listes sont vides ainsi que certaines listes contiennent plus de voxels que les autres ce qui obligera les threads qui ont moins de voxels à attendre les autres threads ayant plus de voxels. Afin d’obtenir une bonne minimisation de temps, il ne suffit pas de diviser le nombre total des listes sur le nombre de processeurs, mais il faut compter le nombre des voxels dans chaque liste et donner à chaque processeurs un nombre de Chapitre 4. Parallélisation locale et distribution du calcul 81 listes contenant un nombre de voxels plus ou moins égal. C’est alors en parcourant les listes comptant le nombre de voxels dans chaque liste qu’une distribution des listes sur les threads, équitable en charge, est achevée. Après le regroupement et la distribution des listes entre les threads, les threads peuvent commencer l’étape de propagation de la lumière dans les listes (Figure 4.7). Cette étape est simple et comme dans le calcul séquentiel, elle consiste à faire un échange mutuel de lumière entre les voxels voisins en terme de visibilité. Malgré la possibilité du regroupement, le coût de regroupement reste élevé pour de grandes scènes contenant des listes denses en nombre de voxels. Le regroupement a diminué l’efficacité des threads et une manière de l’éviter est alors souhaitable. Fig. 4.6 – Regroupement des données des threads Eviter le regroupement L’étape du regroupement consiste à regrouper les voxels d’une même liste pour construire des listes complètent qui seront ensuite distribuées entre les threads qui vont y propager la lumière. Le regroupement est coûteux en temps de calcul, une manière de Chapitre 4. Parallélisation locale et distribution du calcul 82 Fig. 4.7 – Après le regroupement des listes, les listes sont distribuées entre les threads qui vont y propager la lumière Fig. 4.8 – Le regroupement peut être évité. Chacun des threads effectue des échanges de lumières entre les voxels consécutifs d’une même liste. Une étape supplémentaire est rajoutée pour échanger la lumière entre les voxels appartenant à une même liste mais présents sur une structure de données d’un thread distinct l’éviter est possible. Dans la phase de la mise en place des voxels dans les listes effectuée par les threads, les structures de données destinées à chaque threads et contenant une partie des voxels des listes peuvent être livrées à des threads une nouvelle fois ; les threads vont effectués l’étape de propagation de la lumière pour propager la lumière dans ces listes. Cette phase consiste à propager la lumière entre les voxels d’une même liste. Or les listes sont incomplètes car un regroupement n’a pas été fait. Malgré cela, il est possible de maintenir un résultat correct. Une étape est rajoutée, elle consiste à échanger la lumière entre le dernier voxel d’une liste (i, j) localisée sur un thread donné et le premier voxel de la même liste (i, j) localisée sur le thread suivant. La Figure 4.8 montre la propagation effectuée par les threads dans les listes incomplètes. Quand chacun des threads fini la propagation dans les listes incomplètes, une étape supplémentaire est rajoutée pour échanger la lumière entre les voxels “e” et “g”, “f” et “u”, “j” et “n”, Chapitre 4. Parallélisation locale et distribution du calcul 83 comme étant des voxels consécutifs d’une même liste. 240 230 220 Temps (minutes) 210 200 190 180 170 160 150 1 2 3 4 5 6 7 Nombre de threads 8 9 10 Fig. 4.9 – L’effet de la variation du nombre de threads sur le temps. Le temps minimum est obtenu avec deux threads 1200 Sans threads Deux threads Temps (minutes) 1000 800 600 400 200 0 1000 2000 3000 4000 5000 6000 Nombre de directions 7000 8000 Fig. 4.10 – Temps en fonction du nombre de directions scène d’une cabine 4.2.2.3 Résultats Les tests sur l’utilisation des threads pour la distribution et la propagation de la lumière dans les listes sont testés sur un noeud bi-processeur du cluster Laic. Un premier test permettant de tester l’effet de la variation du nombre de threads sur le temps a été effectué. Le temps obtenu sur une scène d’un salon fixant le nombre de directions à 2000, le nombre d’itérations à 6 et en variant le nombre des threads est montré en Chapitre 4. Parallélisation locale et distribution du calcul 1400 84 Sans threads Deux threads 1200 Temps (minutes) 1000 800 600 400 200 0 1000 2000 3000 4000 5000 6000 7000 8000 Nombre de directions Fig. 4.11 – Temps en fonction du nombre de directions scène de l’église 1200 Sans threads Deux threads Temps (minutes) 1000 800 600 400 200 0 1000 2000 3000 4000 5000 6000 Nombre de directions 7000 8000 Fig. 4.12 – Temps en fonction du nombre de directions scène de la salle de travail Figure 4.9. Le temps minimum est atteint avec deux threads ; cela est normal car on travaille avec des noeuds bi-processeurs, les deux threads peuvent donc se répartir sur les deux bi-processeurs. En plus quand le nombre de threads augmente, plus d’échanges sont nécessaires entre les structures de données des threads pour échanger la lumière entre les voxels d’une même liste mais localisés sur différents threads, ce qui augmente encore le temps. Un autre test consistant à fixer le nombre des threads à 2, le nombre d’itérations à 6 et variant le facteur de direction est effectué. Ce test est effectué sur trois différentes scènes, la scène d’une cabine, d’une église et d’une salle de travail. Les Figures 4.10, 4.11 et 4.12 montrent les résultats obtenus. Un gain variant de 30 à 40 pourcent est obtenu grâce à l’utilisation des threads. Chapitre 4. Parallélisation locale et distribution du calcul 4.3 85 Distribution du calcul Comme il a été noté au Chapitre 3, l’équation de radiosité (3.4) est linéaire par rapport aux nombre de directions. Si D est l’ensemble de directions, et D1 , D2 , . . . , Dm des sous-ensembles formant une partition deX D, alors il est possible de diviser la somme X X X en plusieurs somme = + +... + . D D1 D2 Dm L’équation (3.4) peut s’écrire comme suit : B(x) = Be (x) + ρd X B(V (x, ~σ )) cos θ(x, V (x, ~σ ))A(~σ ) ~ σ ∈D = Be (x) + ρd X B(V (x, ~σ )) cos θ(x, V (x, ~σ ))A(~σ ) ~ σ ∈D1 +ρd X B(V (x, ~σ )) cos θ(x, V (x, ~σ ))A(~σ ) ~ σ ∈D2 + .. . +ρd X B(V (x, ~σ )) cos θ(x, V (x, ~σ ))A(~σ ) ~ σ ∈Dm Fig. 4.13 – Distribution du calcul. Les données sont dupliquées sur chaque noeud. Chaque noeud traite un ensemble de directions. Une phase de mise en commun des résultats est nécessaire afin d’obtenir une solution finale d’illumination Chapitre 4. Parallélisation locale et distribution du calcul 86 Fig. 4.14 – Echange d’illumination entre les voxels dupliqués sur les noeuds La distribution du calcul consiste alors à distribuer les directions entre les noeuds des grappes. Chacun de ces noeuds traite un ensemble distinct de directions (Figure 4.13). Les données sont dupliquées entre les noeuds et donc chacun des noeuds possède une copie de tous les voxels de la scène : les données ne sont pas distribuées. Le principe général de cette parallélisation revient alors à paralléliser la boucle intérieure de directions de l’algorithme d’illumination globale (TAB. 3.1). Il est important que la charge du travail, c’est-à-dire l’ensemble de directions données à chaque noeud, soit égale pour éviter les attentes entre les noeuds. Cette parallélisation offre deux avantages majeurs : – Nécessite un minimum de communication entre les noeuds : les échanges entre les noeuds sont effectués, grâce à la librairie MPI, à la fin de chaque itération quand tous les noeuds auront finis le traitement d’illumination pour l’ensemble des directions qui leur a été assigné. Ces échanges consistent à mettre à jour l’illumination des voxels en ajoutant l’illumination gagnée par chaque voxel dupliqué sur les noeuds pour l’ensemble de directions (Figure 4.14) ; – La possibilité d’utiliser les threads pour augmenter la parallélisation : la distribution des directions sur les noeuds bi-processeurs des grappes de stations de travail n’empêche pas l’utilisation des threads qui peuvent être utilisés pour augmenter aussi le grain de la parallélisation. Les threads sont utilisés (voir Section 4.2) pour les deux calculs importants, la mise en place et la propagation de la lumière dans les listes. Notons finalement que la distribution des directions est très essentielles pour l’algorithme d’illumination car le facteur de directions augmente avec l’intensité des sources lumineuses, il n’est pas borné comme le facteur d’itérations, et donc paralléliser ce facteur permet une réduction importante du temps de calcul. Chapitre 4. Parallélisation locale et distribution du calcul 2000 directions Temps Accélération 149 76 1,96 50 2,98 37 4,03 30 4,97 25 5,96 21 7,094 18 8,28 17 8,76 15 9,93 Nombre de noeuds 1 2 3 4 5 6 7 8 9 10 87 4597 directions Temps Accélération 340 173 1,96 114 2,98 86 3,95 69 4,93 57 5,96 49 6,94 43 7,91 38 8,95 35 9,71 TAB 4.1 – Distribution du calcul (scène du salon) : temps de calcul et accélération en fonction du nombre de noeuds pour deux différents nombres de directions Sans threads Deux threads 140 Temps (minutes) 120 100 80 60 40 20 0 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 4.15 – Distribution du calcul effectuée sur la scène d’un salon utilisant 2000 directions et 6 itérations Chapitre 4. Parallélisation locale et distribution du calcul 4.4 88 Résultats de la parallélisation La distribution du calcul a été testée sur le cluster Laic. Les tests sans l’utilisation des threads et utilisant deux threads sont effectués sur une scène d’un salon composé d’un million sept mille voxels. Les tests consistent à varier le nombre de noeuds, fixer le nombre d’itértions à 6 et mesurer le temps de calcul. La Figure 4.15 et la Figure 4.16 montrent les résultats de ces tests obtenus en utilisant 2000 et 4597 directions respectivement. Cette parallélisation divise le temps de calcul par un facteur plus ou moins égal au nombre de noeuds (tableau 4.1). Le temps de calcul est donc inversement proportionnel au nombre de noeuds (Temps de calcul en parallèle × nombre de noeuds = temps séquentiel). L’efficacité de cette parallélisation atteint 98 pourcent. Le temps est réduit encore plus avec l’utilisation des threads permettant un gain variant de 30 à 40 pourcent. Les threads permettent de profiter de l’utilisation de la capacité entière du noeud. Cette approche a montré une bonne accélération en temps de calcul ; sa seule limitation est qu’elle ne distribue pas la mémoire : si l’on souhaite traiter des scènes qui n’entrent pas en mémoire RAM de l’ordinateur, on ne pourra pas utiliser cette approche. 350 Sans threads Deux threads 300 Temps (minutes) 250 200 150 100 50 0 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 4.16 – Distribution du calcul effectuée sur la scène d’un salon utilisant 4597 directions et 6 itérations 4.5 Conclusion Dans ce chapitre, nous avons étudié deux parallélisations : la parallélisation locale et la distribution du calcul. La première parallélisation sert à augmenter le grain du Chapitre 4. Parallélisation locale et distribution du calcul 89 parallélisme traitant des tâches locales en parallèle en utilisant des threads et se servant ainsi de toute la capacité des bi-processeurs. La deuxième parallélisation est très efficace montrant un gain élevé divisant le temps de calcul par le nombre de noeuds. Ces deux parallélisations sont donc performantes. La seule limitation provient de la mémoire. Les données ne sont pas distribuées mais sont dupliquées sur les noeuds, ce qui restreint l’utilisation de ces deux approches pour des scènes qui entrent en mémoire RAM d’un noeud. Pour de petites scènes il n’y a aucun problème. Le problème se pose quand les données augmentent en taille. La distribution des données répartit les données entre les noeuds minimisant ainsi la mémoire requise pour chacun des noeuds. L’implémentation est plus complexe à cause de la dépendance entre les voxels de la scène dans l’algorithme d’illumination, nécessitant des échanges réguliers entre les noeuds. La distribution des données constitue le but majeur de cette thèse et sera détaillée dans les chapitres à venir. Chapitre 4. Parallélisation locale et distribution du calcul 90 Chapitre 5 Distribution des données par répartition des listes La distribution du calcul de la méthode d’illumination globale (Chapitre 4) a accéléré énormément l’algorithme séquentiel montrant un temps divisé par le nombre de noeuds. Cependant, cette distribution reste restreinte à des scènes qui entrent en mémoire centrale de chacun des noeuds du cluster car les données sont dupliquées sur les noeuds. La méthode d’illumination globale que l’on cherche à paralléliser au cours de cette thèse [CM06] discrétise les surfaces en voxels. Les voxels ont une taille uniforme et portent des informations sur la propriété des surfaces (normale, émittance, coefficient de réflexion...). Pour de grandes scènes contenant des millions de voxels, les données risquent de ne plus tenir en mémoire, nécessitant ainsi un recours à la distribution des données. Dans ce chapitre, une distribution des données par répartition des listes est proposée. Elle est obtenue en distribuant des listes de voxels entre les noeuds d’un cluster. La méthode de calcul d’illumination globale partitionne l’espace en listes de voxels où les voisins dans une liste sont des voisins en terme de visibilité (Chapitre 3). La distribution des listes de voxels entre les noeuds répartit les voxels et donc les données. Une telle distribution facilite la propagation de la lumière car les listes de visibilité présentes sur chacun des noeuds sont des listes complètes. Mais les listes de visibilité changent à chaque direction nécessitant ainsi des échanges réguliers de voxels entre les noeuds. Dans ce chapitre, une étude détaillée de la distribution des données par répartition des listes est présentée. La manière d’organiser et de gérer les échanges représente la partie délicate de cette parallélisation et sera alors traitée soigneusement. Les résultats de cette parallélisation sont obtenus pour trois scènes différentes et sont présentés en fin de chapitre. 5.1 Description générale de la méthode La distribution des données par répartition des listes distribue des listes de voxels. La distribution des listes des voxels n’a pas la même implication que la distribution 91 Chapitre 5. Distribution des données 92 des voxels. Elle garantit la présence des listes complètes de voxels sur un même noeud, c’est-à-dire l’ensemble de tous les voxels appartenant à une même liste. La présence des listes complètes sur un noeud offre un avantage pour la propagation de la lumière dans les listes sur un noeud donné : cet avantage est la capacité du noeud à propager la lumière dans ses propres listes sans être obligé d’échanger la valeur d’illumination avec les voxels d’un autre noeud car aucun voxel appartenant à une même liste ne peut se retrouver sur un autre noeud. Comme il a été noté dans le chapitre 3, les listes sont caractérisées par un couple d’entiers (i, j) représentant la partition de l’espace en droites discrètes. La distribution des listes entre les noeuds est accomplie en donnant à chaque noeud un couple différent ou un intervalle des i et des j. Or quand la direction change les (i, j) des voxels changent : un voxel qui a un certain (i, j) et qui appartient à la liste L(i,j) pour une direction donnée, peut subir un changement de son ancien (i, j) qui devient (i0 , j 0 ), et appartiendra alors à une autre liste L(i0 ,j 0 ) . Paralléliser les listes demande alors une transition des voxels entre les noeuds afin de construire des listes complètes sur chacun des noeuds, permettant de réaliser la propagation de la lumière entre les voxels. La Figure 5.1 illustre le principe de cette parallélisation. Chacun des trois noeuds est responsable du traitement d’un intervalle des i et j. Avec le changement de direction les i et j des voxels changent, les listes présentes sur chacun des noeuds ne sont pas nécessairement complètes : par exemple la liste (6, 7) est présente sur trois noeuds différents nécessitant des échanges de voxels pour reconstruire une liste complète. Fig. 5.1 – La distribution des listes sur 3 noeuds différents. Le changement de direction (lignes pointillées) fait changer les listes à laquelles les voxels appartiennent et génère des listes incomplètes de voxels Chapitre 5. Distribution des données 5.2 5.2.1 93 Tri des directions Ordre lexicographique L’algorithme séquentiel de calcul d’illumination globale [CM06] comprend une phase de pré-calcul qui représente les 4 tris des voxels selon les 4 ordres lexicographiques effectué une seule fois pour toute, tout en mémorisant les 4 tris de voxels. Cette phase est de complexité 4 × O(N logN ) où N représente le nombre de voxels de la scène. Lors du parcours de l’ensemble de directions, l’ordre lexicographique change en passant d’une direction à une autre si l’orientation de celle-ci change. À chaque changement de direction, au lieu de re-trier les voxels à chaque fois, il est possible de choisir parmi les quatre tris de voxels, le tri convenable. Malheureusement, ce pré-calcul ne reste pas valable pour la parallélisation des listes. Lors de la parallélisation des listes, les listes sont distribuées entre les noeuds et à chaque direction, les voxels sont échangés entre les noeuds. Cela rend impossible le précalcul de 4 tris de voxels en ordre lexicographiques car les voxels appartenant à un noeud donné ne sont pas toujours les même à cause de la transition des voxels entre les noeuds. Il est alors nécessaire à chaque direction de re-trier les voxels. Faire le tri à chaque direction surtout si les directions exigent un changement de l’ordre lexicographique à chaque fois, bouleverse tout l’ordre de voxels. Cela rend le tri coûteux et risque une augmentation du temps de calcul d’illumination alors que le but est d’essayer de baisser la complexité temporelle autant que possible. Pour résoudre ce problème, la solution est proposée ; pourquoi ne pas trier les directions de manière à engendrer le moins de changement d’ordre lexicographique. Un tri de directions consiste à trier les directions selon leur vecteur directeur (a, b, c). 8 possibilités existent selon le signe du vecteur directeur ((a > 0, b > 0, c > 0), (a > 0, b > 0, c < 0), (a > 0, b < 0, c > 0), (a > 0, b < 0, c < 0), (a < 0, b < 0, c < 0), (a < 0, b < 0, c > 0), (a < 0, b > 0, c < 0), (a < 0, b > 0, c > 0)) et chacune de ces 8 possibilités correspond à un ensemble de directions ayant un vecteur directeur satisfaisant le signe d’un de ces 8 cas et générant un ordre lexicographique particulier. Cela maintient l’ordre lexicographique stable pour plusieurs directions et génère huit changement d’ordre lexicographique durant une itération, ces ordres sont les suivants : ((x ↑, y ↑, z ↑), (x ↑, y ↑, z ↓ ), (x ↑, y ↓, z ↑), (x ↑, y ↓, z ↓), (x ↓, y ↓, z ↓), (x ↓, y ↓, z ↑), (x ↓, y ↑, z ↓), (x ↓, y ↑, z ↑)). Il faut noter finalement que le tri des directions minimise au plus le nombre de changement de l’ordre lexicographique et le maintient stable pour un grand ensemble de directions. Un autre problème se pose. Il s’agit de maintenir les voxels en provenance des autre noeuds dans leur ordre lexicographique avec les voxels déjà présents sur le noeud. En effet, les voxels déjà présents sur un noeud donné sont triés dans l’ordre lexicographique. Or les voxels qui transitent et qui sont en provenance des autres noeuds doivent être rajoutés à leur bon emplacement dans l’ordre lexicographique parmi les voxels existants sur le noeud (voir Section 5.5). Chapitre 5. Distribution des données 5.2.2 94 Directions voisines La distribution des listes demande des échanges de voxels entre les noeuds. Minimiser ces échanges est souhaitable afin de minimiser le temps perdu pour l’envoi et le rassemblement des données entre les noeuds. Le couple (i, j) qui dénote la liste à laquelle un voxel appartient peut être calculé à partir de l’équation (5.1). Cette équation est dépendante des coordonnées (x, y, z) du voxel et du vecteur directeur (a, b, c) de la direction à traiter. Etant donné un voxel v de coordonnées (x, y, z) et une direction D, le couple (i, j) est calculé à partir de l’équation (5.1). En changeant la direction D vers une direction voisine D0 , l’équation (5.1) mène à une nouvelle liste (i0 , j 0 ) qui est très proche de (i, j), à laquelle le voxel v appartient. Des directions voisines engendre alors une petite variation de la valeur de (i, j). Fig. 5.2 – La distribution des listes entre les noeuds consiste à donner à chacun des noeuds un intervalle (i, j) spécifique à traiter Fig. 5.3 – Le nombre de voxels qui sort à l’extérieur d’un noeud sera minimisé (partie hachurée) en prenant deux directions voisines La parallélisation des listes distribue des listes de voxels entre les noeuds en spécifiant pour chacun des noeuds un intervalle (i, j) spécifique à traiter (Figure 5.2). L’intervalle est choisit de manière à établir un équilibrage de charge entre les noeuds sera détaillé en Section 5.3. Le tri des directions de l’espace pour qu’elles soient voisines, provoque une petite variation de (i, j) ce qui implique que la plupart des voxels reste sur un noeud donné et seule une petite partie transite vers un autre noeud (Figure 5.3). Le tri des directions les rendant voisines est achevé à travers un parcours particulier de la sphère discrète illustré dans la Figure 5.4. i × ωab ≤ −bx + ay < (i + 1) × ωab j × ωac ≤ −cx + az < (j + 1) × ωac (5.1) Chapitre 5. Distribution des données 95 htb Fig. 5.4 – Parcours de la sphère pour obtenir des directions voisines 5.2.3 Tri final Comme il a été noté dans les Sections 5.2.1 et 5.2.2, deux tris des directions sont nécessaires. Le premier est le tri des directions selon le vecteur directeur de la direction. Cela permet de garder un ordre lexicographique stable générant seulement 8 changements d’ordre lexicographique. Le deuxième est le tri des directions en directions voisines minimisant ainsi les échanges de données entre les noeuds du cluster. Ces deux tris peuvent être satisfaits en traversant chaque 1/8 de la sphère discrète suivant le parcours montré en Figure 5.4. Le choix du 1/8 de la sphère garantie la maintenance d’un même ordre lexicographique pour toutes les directions et le parcours à l’intérieur d’un même quadrant garantit la génération de directions voisines. 5.3 Distribution statique et dynamique des listes La distribution des listes de voxels entre les noeuds se fait en désignant à chacun des noeuds un intervalle bornée de (i, j) correspondant aux listes Lij dont il sera responsable. Cette distribution nécessite des échanges de voxels entre les noeuds à chaque direction afin de construire des listes complètes de voxels contenant tous les voxels de la scène appartenant à une même liste. A travers un tri convenable de voxels, il est possible en passant d’une direction à une autre d’avoir un minimum de voxels qui transitent d’un noeud à un autre. Malgré la minimisation des échanges, il y a toujours des voxels qui transitent entre les noeuds, ce qui fait qu’au bout d’un certains nombre de directions, un déséquilibre est remarqué nécessitant un équilibrage de charge entre les noeuds. Il existe deux manières de réaliser la distribution des listes en respectant l’équilibrage de charge : la première est une distribution statique et la deuxième une distribution dynamique et ces deux distributions sont détaillées ci-dessous. Chapitre 5. Distribution des données 5.3.1 96 Distribution statique des listes La première idée pour distribuer les listes entre les noeuds consiste à calculer pour tous les voxels de la scène et pour toutes les directions, les plus grandes valeurs des i et j qui peuvent être atteintes. Une fois ces valeurs calculées, une distribution statique des i, j dépendant du nombre de noeuds est effectuée (voir Figure 5.5) de sorte que chacun des noeuds aura à traiter une longueur d’intervalle des i et j plus ou moins égale. Fig. 5.5 – Distribution statique et déséquilibre du nombre de voxels entre les noeuds Or cet équilibrage statique a beaucoup d’inconvénients. Etant donné une scène en 3D, les (i, j) des voxels pour une direction donnée sont largement liés à l’architecture de la scène. Cela fait que cette distribution statique, quand on traite de milliers des directions, peut mener à un déséquilibre entre les noeuds, où certains noeuds ont beaucoup moins de voxels que d’autres. Ce déséquilibre obligera les noeuds qui ont moins de voxels à attendre ceux qui ont plus de voxels. Ceci est un inconvénient pour la parallélisation et provoque une augmentation du temps de calcul et une désynchronisation entre les noeuds (Figure 5.5). L’inefficacité de la distribution statique des listes, pousse à trouver un autre moyen pour la répartition des listes entres les noeuds pouvant maintenir un équilibrage de charge entre les noeuds ; cette distribution est la distribution dynamique des listes que nous abordons maintenant. Chapitre 5. Distribution des données 97 Fig. 5.6 – Distribution dynamique des listes : (a) Calcul du nombre de voxels des listes sur chacun des noeuds. (b) La distribution globale des listes parmi tous les noeuds (c) Algorithme élastique d’équilibrage de charge : la meilleur distribution lignes permettant de distribuer l’intervalle des i de l’algorithme élastique. (d) La meilleur distribution colonnes permettant de distribuer les j pour aboutir à une distribution finale des intervalles des (i, j) parmi les noeuds Chapitre 5. Distribution des données 5.3.2 98 Distribution dynamique des listes La distribution statique des listes apparaît non raisonnable car elle ne maîtrise pas le nombre de voxels entre les noeuds et peut causer des déséquilibres importants. Malgré la petite quantité de voxels qui transitent entre les noeuds, la répartition des voxels évolue avec la direction, il est alors intéressant de trouver pour une direction donnée la bonne distribution des listes qui permettra d’établir l’équilibre de voxels entre les noeuds en donnant à chacun, un intervalle (i1 ...in ) et (j1 ...jn ) de listes à traiter. La meilleure manière d’établir un équilibre de voxels entre les noeuds est d’adopter une distribution dynamique de voxels qui peut changer avec la direction afin de maintenir tout au long du calcul de l’illumination, un équilibre de charge entre les noeuds. Il faut noter que le problème d’équilibrage de charge est NP-complet en 2D, c’est pour cela qu’on effectue une équilibrage de charge en 1D. L’algorithme d’équilibrage de charge adopté pour équilibrer les charges entre les noeuds est basé sur l’algorithme élastique expliqué dans [MP97, MR92, Mig92], et duquel un algorithme plus général d’équilibrage de charge par redistribution des données est dérivé [Fes98, FMP98]. Les étapes effectuées par chacun des noeuds du cluster afin d’équilibrer les charges et d’arriver à une bonne distribution des listes entre les noeuds sont les suivantes : • Compter le nombre de voxels appartenant à chacune des listes. Les listes ne sont pas encore construites, la reconstruction se fait après l’envoi et la réception des voxels. Malgré cela, il est possible de compter le nombre de voxels que chaque liste va contenir en calculant le (i, j) de chaque voxel et en rajoutant 1 au compteur d’une liste donnée à chaque fois qu’un voxel appartenant à cette liste est rencontré. Chaque noeud construit alors une matrice contenant le nombre de voxels pour chacune de ses listes (Figure 5.6 (a)) • Effectuer des échanges collectifs entre les noeuds pour échanger le nombre de voxels que chaque liste contient en additionnant les voxels d’une même liste présente sur différent noeuds. Cela permet d’obtenir une matrice représentant une distribution globale des (i, j) de la scène (Figure 5.6 (b)). • Trouver à partir de la matrice de distribution globale, la meilleur distribution des (i, j) entre les noeuds qui permet d’établir un équilibrage de charge entre les noeuds affectant à chacun des noeuds environ le même nombre de voxels. L’algorithme élastique est utilisé pour trouver cette distribution [MP97, MR92, Mig92]. L’application de cet algorithme en 2-D est effectué comme suit : – Trouver le nombre de divisions ligne et celui des divisions colonnes. Ces nombres dépendent du nombre de noeuds. Le nombre de divisions lignes est donné par la racine carrée du nombre de noeuds arrondie à la partie entière la plus proche. Le nombre de divisions colonnes pour chacune des divisions lignes est calculé en divisant le nombre de noeuds par le nombre de divisions lignes et s’il y en a un reste, il est réparti sur chacune des divisions colonnes jusqu’à ce qu’il soit nul. Par exemple dans le cas de 13 noeuds, 4 divisions lignes sont nécessaires, quant à la divisions colonnes, la première ligne est répartie en 4 colonnes et les autres lignes sont réparties en 3 colonnes chacune (Figure 5.7) ; Chapitre 5. Distribution des données 99 – Calculer la somme de chacune des lignes ; diviser la somme totale des voxels de la scène par le nombre de lignes, et trouver la distribution des lignes correspondantes. Par exemple avec 3 noeuds, 2 divisions lignes sont nécessaires ; la première division ligne doit contenir deux fois plus de voxels que la deuxième division ligne car elle est distribuée en 2 colonnes alors que la deuxième n’est pas répartie, elle contient une colonne unique (Figure 5.6 (c)) ; Fig. 5.7 – Divisions par lignes et colonnes dépendant du nombre de noeuds – Effectuer la distribution par colonne. La distribution par colonne est effectuée en additionnant chacune des colonnes pour les lignes concernées. La meilleure division colonne, qui cède le même nombre de voxels à chaque partie, est ensuite calculée (Figure 5.6 (d)) ; – Déduire la distribution final des (i, j). L’exemple en Figure 5.6 (d) montre les intervalles (i,j) permettant d’aboutir à un équilibrage de charge entre les noeuds et délivrer à chacun des noeuds plus ou moins un nombre de voxels equitable. Pour cet exemple, le N oeud 1 traite les i = (0...3) et j = (0...3), le N oeud 2 traite les i = (0...3) et j = (4...6) et N oeud 3 traite les i = (4, 5) et j = (0...6). L’idée de listes de visibilité de l’algorithme d’illumination fait que les listes de voxels changent en changeant de direction. La transition des voxels entre les noeuds se fait alors à chaque changement de direction. Il est vrai que le nombre de voxels qui transitent est limité, pourtant il est désirable d’effectuer un équilibrage à chaque changement de direction afin de maintenir un équilibre parfait entre les noeuds. L’équilibrage de charge dynamique adopté n’est pas coûteux s’il est effectué un nombre de fois limité, or s’il doit être effectué à chaque direction, le temps de calcul devient énorme. La complexité temporelle vient du fait que, compter le nombre de voxels pour toutes les listes présentes sur un noeud est coûteux, ensuite le transfert de ces nombres entre les noeuds pour faire la somme entre les listes ayant un même (i, j) parmi tous les noeuds est encore coûteux. Dans l’algorithme d’illumination globale, les mêmes directions se répètent à chaque itération. Il est possible alors d’effectuer l’équilibrage pour toutes les directions de la première itération, mémoriser chaque distribution (i, j) trouvée en mémoire, et ensuite pour les directions des autres itérations, charger la distribution correspondante directement de la mémoire. La mémorisation de ces distributions n’est pas coûteuses : elle revient à maintenir (N ombre de noeuds)3/2 entiers à chaque direction. Il est possible Chapitre 5. Distribution des données 100 aussi de se poser la question pourquoi ne pas faire un équilibrage de charge de temps en temps quand un déséquilibre remarquable est remarqué ? La Figure 5.8 montre l’effet de variation de la fréquence d’effectuer l’équilibrage de charge sur le temps de calcul sans et avec l’utilisation des threads. L’équilibrage de charge est fait de temps en temps quand un déséquilibre d’un pourcentage donné (axe des x) entre les noeuds est remarqué. Il est clair que le temps diminue au début jusqu’à la valeur 30 ; après cette valeur, quand l’équilibrage est effectué plus souvent le temps de traitement augmente. Le meilleur temps de calcul est obtenu pour la valeur 100, quand l’équilibrage est effectué à chaque direction indiquant une synchronisation complète entre les noeuds. La Figure 5.9 montre un test effectué pour tester l’équilibrage de charge sur la scène de la salle de travail composée de 3.25 millions de voxels en prenant une direction aléatoire. Il est clair que le nombre de voxels présents sur les noeuds est équilibré en allant de 2 à 10 noeuds. 800 Sans threads Deux threads Temps (minutes) 700 600 500 400 300 200 100 0 10 20 30 40 50 60 70 80 90 100 Pourcentage de déséquilibre Fig. 5.8 – L’effet d’augmention de la fréquence d’équilibrage de charge sur le temps 5.4 Remplissage et échange des données Après avoir trouvé les intervalles i et j permettant d’établir un équilibrage de charge à travers une bonne distribution des listes, pour un noeud donné, les voxels n’appartenant pas à l’intervalle des i et j désigné au noeud, doivent être remplis pour être envoyés au noeud destinataire. Donc à chaque changement de direction, chaque noeud doit parcourir ses voxels rangés dans l’ordre lexicographique, et décider selon le (i, j) de chacun, s’il doit rester sur le noeud ou s’il doit quitter vers un autre noeud. Les voxels qui doivent quitter le noeud sont mis à leur emplacement dans la structure d’envoi. La structure d’envoi est une matrice de dimension 1, libellée par rapport au noeud destinataire, où chaque case contient tous les voxels destinés à un noeud donné. Le parcours des voxels dans leur Nombre de voxels Chapitre 5. Distribution des données 101 1.65e+006 1.55e+006 1.45e+006 1.35e+006 1.25e+006 1.15e+006 1.05e+006 950000 850000 750000 650000 550000 450000 350000 2 noeuds 3 noeuds 4 noeuds 5 noeuds 6 noeuds 7 noeuds 8 noeuds 9 noeuds 10 noeuds 1 2 3 4 5 6 7 8 Identité (rank) du noeud 9 10 Fig. 5.9 – Le nombre de voxels est equilibré sur les noeuds en allant de 2 à 10 noeuds ordre lexicographique assure que tous les voxels rangés pour être envoyés à un même noeud destinataire (voxels appartenant à chaque case de la matrice) sont aussi rangés sans l’ordre lexicographique, évitant ainsi le tri de ces voxels dans l’ordre lexicographique à la réception. Or pour le fusion des données reçues avec ceux existant sur un noeuds, un certains tri est nécessaire, dont plus de détails sont donnés en Section 5.5. Une fois le remplissage des données effectué, les échanges des ensembles de voxels, entre les noeuds, sont effectués. Ces échanges comprennent l’envoi des voxels aux autres noeuds et la réception des voxels des autres noeuds. Les données à envoyer sont envoyées dans leur ordre lexicographique au noeud destinataire. Les voxels reçus sont encore libellés par rapport au noeud duquel ils proviennent. Il faut noter que lors des échanges des voxels, toute les informations du voxel sont transmises. Chaque voxel contient plusieurs informations. Les infomations d’un voxel sont les coordonnées (x, y, z) (trois entier), la normale (3 float), la couleur en RGB (trois float), la radiosité cumulée en RGB (3 float), l’émittance (1 float), le coefficient de radiosité (1 float) et le cosinus de l’angle (1 float). La Figure 5.10 montre un exemple du remplissage des voxels. Au début les voxels de la scène sont rangés dans leur ordre lexicographique, pour une direction Direction1, les voxels (initialement pas encore distribués entre les noeuds) sont distribués entre les noeuds de sorte à établir des listes complètes sur chacun des noeuds (noeud 1 par exemple traite les listes dont i = 1...5 et j = 1...2) permettant la propagation de la lumière dans les listes. Quand la direction change, Direction2, la distribution des listes n’est pas la même (noeud 1 par exemple traite les listes dont i = 1...3 et j = 1...3) et donc les voxels qui ne conviennent pas à la distribution recherchée doivent être envoyés au noeud impliqué. Les voxels sont rangés dans des structures d’envoi libellées par rapport au noeud destinataire et les envois réceptions sont achevés entre les noeuds. Chapitre 5. Distribution des données 102 Fig. 5.10 – Distribution des données par répartition des listes entre les noeuds : (a) Une première distribution des voxels de la scène par distribution des listes. (b) Pour un changement de direction, la distribution des listes change et les voxels à échanger sont rangés dans des structures d’envoi libellées par rapport au noeud destinataire. (c) Fusion des voxels reçus des autres noeuds avec les voxels présents sur le noeud Chapitre 5. Distribution des données 5.5 103 Fusion des données Les donnés reçues par chacun des noeuds sont libellées par rapport au noeud d’envoi. Pour un noeud donné, l’ensemble des voxels qui y sont présents sont rangés dans l’ordre lexicographique : chacun des ensembles de voxels en provenance des autres noeuds vers le noeud courant sont aussi rangés en ordre lexicographiques. A partir de tous ces ensembles, il faut arriver à construire un seul ensemble de voxels rangés en ordre lexicographique. Cela est possible grâce à l’algorithme de la recherche dichotomique [Sed01] qui va permettre de fusionner chacun des ensembles triés avec les voxels déjà existant sur le noeud. Une fois cette étape effectuée, la distribution des voxels dans leurs listes et la propagation dans ces listes sont effectuées ; les listes sont des listes complètes de voxels contenant tous les voxels d’une même liste. La recherche dichotomique dans une tableau de taille N nécessite au plus O(log2 (N )) comparaisons, elle est alors coûteuse pour un grand nombre de voxels. Or pour l’algorithme d’illumination que l’on cherche à paralléliser, les voxels échangés entre les noeuds sont, la plupart du temps, limités en nombre (les directions sont voisines, le couple (i, j) varie lentement), ce qui fait que la fusion des données n’est pas très coûteuse. La Figure 5.10 montre un exemple de fusion des données présentes sur chacun des noeuds avec les données reçues des autres noeuds afin de construire un vecteur de voxels final contenant tous les voxels présents sur le noeuds rangés dans l’ordre lexicographique. Ces voxels sont ensuite mise en place dans leurs listes pour y propager la lumière. 5.6 Étapes de l’algorithme d’illumination par répartition des listes Après avoir expliqué la parallélisation des données par répartition des listes ainsi que les parties essentielles de cette parallélisation, il est important de noter les étapes de cette parallélisation enchaînées en ordre. Ces étapes sont effectuées par chacun des noeuds et peuvent se résumer comme suit : – Générer les directions voisines et les trier en fonction du signe de leur vecteur directeur en suivant le parcours de chaque 1/8 de la sphère discrète (Figure 5.4) Pour chaque itération et pour chaque direction, faire : – Trier les voxels si nécessaire. L’ordre lexicographique reste le même pour un ensemble de directions et 8 changements de cet ordre sont rencontrés pour toutes les directions ; – Si c’est le cas de la première itération, trouver la bonne distribution des listes entre les noeuds en suivant toutes les étapes marquées en Section 5.3.2 et mémoriser cette distribution en mémoire. Si on n’est pas à la première itération, la bonne distribution des listes est obtenue directement en effectuant son chargement de la mémoire ; – Remplir les voxels à envoyer ; Chapitre 5. Distribution des données 104 – Envoyer les voxels parmi les noeuds ; – Recevoir les voxels en provenance des noeuds ; – Fusionner les voxels reçus avec ceux présents sur un noeud, en respectant l’ordre lexicographique ; – Mettre les voxels dans leurs listes et propager la lumière entre les voxels d’une même liste ; – Remise à zéro des listes. 5.7 Parallélisation locale et distribution des données Comme il a été noté en section 4.2, les deux étapes essentielles de calcul d’illumination globale (la mise en place des voxels dans leurs listes de visibilité et la propagation de la lumière dans ces listes) peuvent être parallélisées localement en distribuant les voxels sur différents threads. Scène d’une église Scène d’une cabine 500 1000 4597 directions 6271 directions 800 Temps (minutes) Temps (minutes) 400 300 200 600 400 200 100 0 0 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 5.11 – Temps en fonction du nombre de noeuds scène de la cabine 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 5.12 – Temps en fonction du nombre de noeuds scène de l’église La distribution des données par répartition des listes place les voxels de manière à avoir des listes complètes de voxels sur chacun des noeuds. Les échanges de voxels se font selon le (i, j) (partitionnement de l’espace en droites) de chacun des voxels. C’est juste après la transition des voxels entre les noeuds et la fusion de ceux-ci en ordre lexicographique que la dernière étape qui consiste à mettre en place et propager la lumière dans les listes de visibilité est achevée. Cette dernière étape est la même qu’en séquentiel et elle peut donc être parallélisée localement sur chacun des noeuds en distribuant les voxels sur les threads (voir Section 4.2). Cette parallélisation locale permet de profiter de toutes les capacités des noeuds du cluster sur lequel la distribution de données est menée. Les résultats et les tests effectués sur la parallélisation locale et la distribution des données par répartition des listes sont montrés dans la section 5.8. Chapitre 5. Distribution des données 5.8 105 Résultats et discussion Les résultats de la distribution des données par répartition des listes ont été testés sur le cluster Laic. Trois scènes sont utilisées pour les tests, la scène de la cabine, de l’église et de la salle de travail. Les premiers tests consistent à utiliser 6 itérations et différents nombre de directions pour les trois scènes. Une nombre de directions égale à 4597 est testé pour les trois scènes, 6271 directions pour la scène de l’église et 8209 pour la scène de la salle de travail. Les temps de calcul pour chacune des trois scènes sont montrés respectivement dans les Figures 5.11, 5.12 et 5.13. Il est possible de remarquer que le temps de calcul diminue quand le nombre de noeuds augmente. Scène d’une salle de travail 4597 directions 8209 directions Temps (minutes) 1000 800 600 400 200 0 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 5.13 – Temps en fonction du nombre de noeuds scène de la salle de travail Une description détaillée du temps de chaque opération de la parallélisation est montré en Figure 5.14 et 5.15. Ces 2 figures représentent respectivement la scène de l’église avec 6207 directions et la scène de la salle de travail avec 4597 directions. En effet, l’algorithme séquentiel comprend deux temps de calcul qui sont importants, la mise en place de voxels et la propagation de lumière dans les listes. Lors de la distribution des données par répartition des listes, les mêmes opérations présentes en séquentiel se répètent et ces opérations sont divisées par le nombre de noeuds. En plus d’autres opérations se rajoutent. Ces opérations sont le temps du remplissage de voxels à envoyer, d’équilibrage de charge, d’échanges des données et de fusion des données. Une discussion des temps révélés par ces figures peut se résumer comme suit : – Remplissage de données : le remplissage de données est une opération coûteuse en temps de calcul car un parcours de tous les voxels doit être effectué, et les voxels à envoyer doivent être stockés dans la structure de données correspondante. On peut constater dans les Figures 5.14 et 5.15 que cette opération est plus ou moins divisée par le nombre de noeuds et donc diminue bien quand le nombre de noeuds Chapitre 5. Distribution des données 900 550 Fusion Envoi et réception Remplissage Equilibrage Mise en place et propagation 800 Fusion Envoi et réception Remplissage Equilibrage Mise en place et propagation 500 450 Temps (minutes) 700 Temps (minutes) 106 600 500 400 300 400 350 300 250 200 150 200 100 100 50 0 0 2 4 6 Nombre de noeuds 8 10 Fig. 5.14 – Distribution temporelle des différentes opérations de la parallélisation en fonction du nombre de noeuds (scène de l’église) 2 4 6 Nombre de noeuds 8 10 Fig. 5.15 – Distribution temporelle des différentes opérations de la parallélisation en fonction du nombre de noeuds (scène de la salle de travail) augmente ; – Equilibrage de charge : les Figures 5.14 et 5.15 montrent que le temps d’équilibrage de charge ne varie pas trop en fonction de la variation du nombre de noeuds ; il est presque stable en temps. Notons que cet équilibrage n’est effectué que pour les directions de la première itération (voir section 5.3.2) ; – Echange des données : le temps des échanges est négligeable par rapport au temps des autres opérations ; cela est du au fait qu’un petit pourcentage de voxels est échangé entre les noeuds à chaque direction ; 3 Scène d’une église Scène d’une cabine Scène d’une église Scène d’une salle de travail 2.4 2.5 2.2 Accélération Accélération 4597 directions 6271 directions 2 2 1.8 1.6 1.4 1.5 1.2 1 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 5.16 – Accélération en fonction du nombre de noeuds pour trois différentes scènes 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 5.17 – Accélération en fonction du nombre de noeuds pour la scène de l’église – Fusion des données : Le temps de fusion consiste à fusionner les voxels reçus avec Chapitre 5. Distribution des données 107 les voxels existants sur le noeud. Ce temps dépend de la quantité des données à échanger entre les noeuds et ne varie pas énormément avec le nombre de noeuds. Scène d’une salle de travail 4597 directions 8209 directions 2.6 2.4 Accélération 2.2 2 1.8 1.6 1.4 1.2 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 5.18 – Accélération en fonction du nombre de noeuds scène de la salle de travail 4 Scène d’une cabine (sans thread) Scène d’une cabine (2 threads) 500 400 3 Accélération Temps (minutes) Scène d’une cabine (sans thread) Scène d’une cabine (2 threads) 3.5 300 200 2.5 2 1.5 1 100 0.5 0 0 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 5.19 – Temps en fonction du nombre de noeuds pour la scène de la cabine avec et sans threads 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 5.20 – Accélération en fonction du nombre de noeuds pour la scène de la cabine avec et sans threads Du point de vue accélération, la Figure 5.16 montre l’accélération en fonction du nombre de noeuds des trois scènes en prenant un même nombre de directions (4597) pour les trois scènes et 6 itérations. Il est possible de remarquer qu’une accélération de maximum 2.85 est remarquée avec 10 noeuds. Aussi les Figures 5.17 et 5.18 montrent l’accélération en fonction du nombre de noeuds pour la scène de l’église et de la salle de travail respectivement prenant en compte deux facteurs de directions pour chacune des scènes. Une accélération de maximum ≈2.4 est remarquée avec 10 noeuds. On peut dire en se basant sur ces tests que l’accélération offerte par cette parallélisation n’est pas énorme. Cela est dû aux opérations rajoutées par la parallélisation ainsi qu’au temps Chapitre 5. Distribution des données 108 nécessaire pour gérer et échanger les données. Quand le nombre de voxels transitant augmente, le temps de remplissage de ces voxels dans des structures d’envoi augmente, le temps des envois et réceptions augmente, ainsi que le temps de fusion des données reçues par un noeud avec les données déjà existantes augmente ce qui fait qu’au final, le temps de toutes les opérations rajoutées par la parallélisation augmente. La parallélisation locale utilisant les threads peut être rajoutée à la distribution des données comme expliqué en Section 5.7. Cette parallélisation permet d’augmenter la parallélisation en profitant de toute la capacité des noeuds du cluster (chaque noeud est un bi-processeur). Les Figures 5.19 et 5.20 montre respectivement le temps et l’accélération en fonction du nombre de noeud pour la scène de la cabine utilisant 4597 directions et 6 itérations. Les threads font augmenter l’accélération à un facteur de 3.2 avec 10 noeuds. 5.9 Conclusion La distribution des listes a permis la distribution des voxels et donc des données. Cette parallélisation permet de traiter de grandes scènes qui n’entrent pas en mémoire centrale d’un noeud. Une réduction du temps de calcul est obtenue en augmentant le nombre de noeuds permettant d’arriver à une accélération d’un facteur de 3.2 avec 10 noeuds. Cette accélération ainsi que l’efficacité de cette parallélisation ne sont pas aussi performantes que prévu initialement. Cela est dû aux différentes opérations rajoutées par la parallélisation. Malgré le fait que la quantité de données transitante ne dépasse pas 10% du nombre total de voxels présents sur un noeud, cette parallélisation demande un temps pour gérer les différentes opérations imposées par l’enchaînement des tâches de l’algorithme d’illumination. On peut dire que cette parallélisation aurait pu être efficace si les voxels avaient été stables sur les noeuds, c’est-à-dire si les listes étaient toujours complètes sur les noeuds ce qui permettrait d’éviter plusieurs opérations. Malheureusement, ce n’est pas le cas. Il y a toujours un pourcentage de voxels qui transitent entre les noeuds diminuant l’efficacité de la parallélisation. Pour toutes ces raisons, le chapitre suivant traite une deuxième parallélisation, la distribution des données par division de la scène en des sous-parties indépendantes. Cette approche réalise la transmission des données nécessaires entre les noeuds sans avoir recours à une transmission des voxels entre les noeuds. Une fois distribués entre les noeuds, les voxels restent stables. Chapitre 6 Distribution des données par division de la scène La distribution des données par répartition des listes étudiées au Chapitre 5, a permi de distribuer la mémoire et de minimiser le temps de calcul. Une autre approche importante à tester est la distribution des données par division de la scène. Dans cette approche la scène est distribuée, selon la densité des voxels, sur les différents noeuds du cluster, assignant à chacun des noeuds une partie équitable des voxels. Les voxels sont fixes sur les noeuds et ne transitent pas comme dans la distribution des listes. Les échanges d’illumination sont effectués entre les voxels voisins en terme de visibilité et localisés sur des noeuds distincts. Deux approches sont prévues pour cette parallélisation et sont étudiées dans ce chapitre. La première consiste à établir une topologie cartésienne entre les noeuds. Chaque noeud communique et échange les informations d’illumination avec les deux noeuds qui sont voisins. La deuxième approche consiste à faire des communications collectives pour les échanges de données entre les noeuds. Chaque noeud communique alors avec tous les autres noeuds et non plus seulement avec ses voisins directs. Cette deuxième approche a montré des meilleurs résultats par rapport à la première, communiquant les informations d’illumination aux noeuds impliqués directement sans se restreindre aux noeuds voisins pour la communication. 6.1 Principe La distribution des données par division de la scène consiste à diviser la scène en plusieurs parties ou sous-environnement séparées par des barrières virtuelles. Les barrières sont déposées de manière à respecter la densité équitable des voxels entre les noeuds (Section 6.2). L’idée de cette distribution en sous-environnement ressemble à celle de “l’interface virtuelle” utilisée dans [RAPP97]. La distribution des données par division de la scène se distingue de l’approche de répartition des listes (Chapitre 5) par le fait que les voxels ne transitent pas mais sont 109 Chapitre 6. Distribution des données par division de la scène 110 stables sur les noeuds ce qui élimine tout risque de déséquilibre entre les noeuds. Les échanges d’illumination sont effectués entre les voxels voisins en terme de visibilité mais localisés sur des noeuds distincts. Dans l’algorithme d’illumination à paralléliser [CM06], la propagation de la lumière pour le calcul de l’illumination se fait entre les voxels voisins d’une même liste de visibilité. En divisant la scène en parties, pour chaque direction, les listes de visibilité sont construites sur chacun des noeuds. Des voxels appartenant à une même liste peuvent être localisés sur différents noeuds. Cela exige des échanges de la valeur d’illumination des voxels concernés entre les noeuds. Normalement les échanges concernent l’illumination du premier et le dernier voxel d’une liste donnée qui sera communiquée à son voisin en terme de visibilité dans la liste de visibilité localisée sur les noeuds précédents ou suivants (Figure 6.1). Deux différentes approches sont utilisées pour appliquer cette distribution : la première consiste à utiliser une topologie cartésienne et des communications non bloquantes et la deuxième utilise des communications collectives pour les échanges entre les noeuds. Les détails de ces deux approches ainsi que les résultats fournis sont décrits en Section 6.3 et Section 6.4. Fig. 6.1 – Echanges d’illumination entre les noeuds. Les échanges concernent le premier et le dernier voxel de chaque liste et leurs voisins en terme de visibilité localisés sur les noeuds précédents ou suivants 6.2 Division de la scène La division de la scène est une division en dimension 1. L’image 3D est divisée selon la dimension la plus grande (longueur, largeur ou hauteur). La division prend en considération la densité des voxels ainsi que le nombre de divisions. Le nombre de divisions dépend du nombre de noeuds du cluster sur lequel la parallélisation va s’effectuer. Le but est d’arriver à donner à chaque partie et par la suite à chaque noeud du cluster, Chapitre 6. Distribution des données par division de la scène 111 le même nombre de voxels (Figure 6.2). L’algorithme utilisé pour rechercher la meilleur division de la scène est similaire à celui vu en Section 5.3.2, basé sur l’algorithme élastique. Cependant au lieu de faire une distribution par ligne puis une distribution par colonne, une seule distribution en une dimension est réalisée. Cette distribution se fait suivant l’un des trois axes, x, y, ou z. Fig. 6.2 – Distribution de la scène selon la densité Fig. 6.3 – Une topologie cartésienne à une dimension entre les noeuds 6.3 6.3.1 Approche par topologie cartésienne et communications non bloquantes Principe MPI permet de construire une topologie virtuelle entre les noeuds. La topologie virtuelle est un mécanisme qui consiste à nommer les noeuds en lien avec la procédure de communication. Elle facilite le codage au programmeur pour les envois et réceptions des messages et aussi optimise les communications entre les noeuds. La distribution des données par division de la scène est accomplie par division de la scène en sous-environnements séparés par des barrières. Une communication entre les noeuds est essentielle afin d’échanger la lumière entre les voxels d’une même liste présents sur plusieurs noeuds. Cette communication concerne en général le premier et le dernier voxel de chaque liste non vide présents sur un noeud donné car c’est ces voxels qui peuvent avoir des voisins en terme de visibilité localisés sur d’autres noeuds. Chapitre 6. Distribution des données par division de la scène 112 Les clusters utilisés pour la parallélisation sont des machines à mémoire distribuée. Chacun des noeuds n’a alors aucune information sur les listes des voxels localisés sur les autres noeuds et ignore alors les listes vides et non vides présents sur les autres noeuds. Pour une liste donnée non vide, chacun des noeuds se trouve incapable de déterminer l’identité du noeud avec lequel les informations d’illumination du premier et du dernier voxel d’une liste donnée doivent être communiquées. Pour cela une première approche peut être établie pour accomplir cette parallélisation. Chacun des noeuds, même s’il ignore avec quel noeud les informations de chacune de ses listes doivent être effectuées, peut envoyer les informations du premier et du dernier voxels de chacune de ses listes non vides aux noeuds précédent et suivant. Ce n’est qu’au moment de la réception des données par chacun des noeuds que le noeud peut décider s’il peut mettre à jour la valeur d’illumination reçue ou si cette information doit être transférée de nouveau. Une topologie cartésienne 1D (Figure 6.3) pour faciliter la communication est appliquée entre les noeuds. Cette topologie facilite la procédure de communication entre les noeuds directement voisins. Aussi des communications non bloquantes peuvent être menées pour effectuer les envois et réceptions des données d’illumination. Fig. 6.4 – Les étapes de la transmission entre les voisins pour une topologie cartésienne Chapitre 6. Distribution des données par division de la scène 6.3.2 113 Application de la parallélisation L’application d’une topologie cartésienne 1D et des communications non bloquantes pour effectuer la distribution des données par division de la scène peut être réalisée comme suit. Pour une direction donnée, chaque noeud remplit les informations du premier et du dernier de chacune de ses listes non vides dans une structure de données libellée par rapport au noeud suivant ou précédent. Une fois remplies, ces informations sont envoyées au noeud précédent et suivant respectivement. Chacun des noeuds a le droit de communiquer uniquement avec le noeud suivant ou précédent et ignore toute information des listes vides ou non vides présentes sur les différents noeuds. C’est seulement au moment de la réception des données par un noeud, que celui ci remarque que certaines données ne peuvent pas être mise à jour, car la liste correspondante qui doit recevoir la donnée est vide. A ce moment, le noeud doit re-transmettre cette information à un noeud précédent ou suivant selon qu’elle provient du noeud suivant ou précédent respectivement. Les informations à re-transmettre sont aussi stockées dans une structure de données libellée par rapport au noeud suivant ou précédent. Les re-transmissions continues jusqu’au moment où le premier et le dernier noeuds sont atteints ou si aucune information n’est reçue par une liste non vide nécessitant une re-transmission. Toutes les communications utilisées pour communiquer entre les noeuds sont non bloquantes permettant à chacun des noeuds de faire son travail sans être obligé d’attendre que les autres finissent un travail précédent. Après toute les re-transmissions et la mise à jour de l’illumination des voxels, les noeuds peuvent commencer à traiter la prochaine direction et la procédure continue. La Figure 6.4 montre une scène distribuée sur 5 noeuds et les étapes des échanges d’illumination entre les voxels pour une direction donnée. La première transmission transmet la valeur d’illumination du premier voxel d’une liste donnée avec le noeud précédent et du dernier voxel d’une liste donnée avec le noeud suivant. La deuxième transmission concerne les informations qui n’ont pas pu être mise à jour car elles sont reçues par des listes vides. Ces transmissions continues autant que nécessaire. Pour cet exemple 3 transmissions sont suffisantes pour mettre à jour la valeur d’illumination des voxels. Dans cet exemple, la liste (2, 2) est vide sur tous les noeuds à l’exception du noeud 4, malgré cela les noeuds ne peuvent pas le savoir et l’information d’illumination doit passer par tous les noeuds sans qu’elle soit mise à jour car les listes sont vides. Cela correspond à un inconvénient de cette approche où les noeuds n’ont aucune information sur les listes vides et non vides présentes sur les autres noeuds nécessitant le recours à plusieurs transmissions avant d’arriver à mettre à jour l’illumination des voxels. 6.3.3 Résultats Les résultats de cette parallélisation sont testés pour deux scènes, le scène de la cabine et de l’église. Les tests sont effectués avec 4597 directions et 6 itérations. La Figure 6.5 Chapitre 6. Distribution des données par division de la scène 114 montre la variation du temps en fonction du nombre de noeuds et la Figure 6.6 montre l’accélération, une accélération de 3.5 est obtenue avec 10 noeuds. 4 Scène d’une cabine Scène d’une église 600 Scène d’une cabine Scène d’une église 3.5 3 Accélération Temps (minutes) 500 400 300 2.5 2 200 1.5 100 0 1 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 6.5 – Temps en fonction du nombre de noeuds utilisant une topologie cartésienne et des communications non bloquantes 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 6.6 – Accélération en fonction du nombre de noeuds utilisant une topologie cartésienne et des communications non bloquantes Les Figures 6.7 et 6.8 montrent la distribution de temps des différentes opérations de cette parallélisation pour les deux scènes, la scène de la cabine et la scène de l’église respectivement. “Premier Echange” représente le temps de la première transmission des données entre les noeuds, “Autres Echange” représente le temps pour les autres transmissions, et “Mise en place et propagation” représente le temps de la mise en place des voxels dans leurs listes et la propagation de la lumière dans ces listes. Il est remarquable que le temps de “Autres Echange” est zéro avec deux noeuds car une seule transmission est suffisante. Ce temps augmente légèrement entre 3 et 4 noeuds et augmente encore plus en allant de 5 à 10 noeuds. Concernant le temps du “Premier Echange”, ce temps est grand au début et diminue quand le nombre de noeuds augmente car dans ce cas il y a plus de probabilité de tomber sur des listes vides sur un noeud. Finalement le temps de “Mise en place et propagation” est dépendant du nombre de noeuds et diminue largement en fonction de celui-ci. Il faut noter finalement que l’approche de division de la scène utilisant la topologie virtuelle et les communications non bloquantes peut être intéressante dans le cas où la plupart des listes présentes sur les noeuds ne sont pas vides nécessitant moins de transmissions entre les noeuds. Malheureusement ce n’est pas toujours le cas pour les scènes en général, la plupart des fois plusieurs listes vides sont rencontrées nécessitant plusieurs transmissions et diminuant ainsi la performance et l’efficacité de la parallélisation. Chapitre 6. Distribution des données par division de la scène Premier Echange Autres Echange Mise en place et propagation 500 115 Premier Echange Autres Echange Mise en place et propagation 600 500 Temps (minutes) Temps (minutes) 400 300 200 100 400 300 200 100 0 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 0 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 6.7 – Distribution du temps des différentes opérations utilisant une topologie cartésienne et des communications non bloquantes pour la scène de la cabine 6.4 Fig. 6.8 – Distribution du temps des différentes opérations utilisant une topologie cartésienne et des communications non bloquantes pour la scène de l’église Approche par communications collectives La division de la scène et l’application d’une topologie cartésienne ont pour but les échanges juste entre les noeuds voisins directs. Or l’échange restreint entre les voisins directs nécessite parfois le passage par plusieurs noeuds afin de transmettre l’illumination entre deux voxels appartenant à une même liste mais situés sur deux noeuds écartés. Cela amène à penser à transmettre la valeur d’illumination d’un voxel donné, au voxel impliqué, sur le noeud impliqué, sans devoir passer par plusieurs noeud afin d’effectuer le transfert. Une communication directe entre les noeuds peut être établie si chacun des noeuds sait en avance avant les échanges, pour chacune des ses listes non vide, le noeud avec qui l’information d’illumination doit être communiquée. Si ce processeur est connu, l’information d’illumination désignée à un certains noeud est stockée et envoyée au processeur en question. Chacun des noeuds doit alors obtenir l’information des listes concernant tous les autres noeuds. Des communications collectives sont alors nécessaires afin d’échanger ces informations locales sur chacun des noeuds et inaccessibles aux autres à cause de l’utilisation des clusters à mémoire distribuée. Les différentes étapes de cette parallélisation, ainsi que les résultats obtenus sont discutés ci-dessous. 6.4.1 Matrices de communication Les listes de voxels construites pour le calcul de l’illumination globale sont caractérisées par deux entiers (i, j) représentant la partition de l’espace en droites discrètes 3D. La communication directe entre les noeuds implique que chacun des noeuds a des informations concernant les listes vides et non vides présentes sur tous les autres noeuds. Des communications collectives sont alors requises pour rassembler les informations sur Chapitre 6. Distribution des données par division de la scène 116 les listes de tous les noeuds. Une matrice booléenne peut être construite en représentant les listes vides par “0” et non vides par “1” (Figure 6.9 (a) et (b)). Or pour des grandes scènes, l’intervalle (i1 ...in ) et (j1 ...jn ) peut subir des énormes variations et la valeur maximale des i et j peut devenir large, ce qui rend coûteux le rassemblement des matrices booléennes entre les noeuds. La construction d’une matrice contenant seulement la localisation des listes non vides est encore coûteuse en temps et en mémoire car le nombre des listes non vides peut augmenter selon les scènes. Une solution possible diminuant la complexité de cette procédure en temps et en mémoire est de construire une matrice compressée des listes non vides. Les scènes ont généralement plusieurs listes vides. Concernant les listes non vides, il y a une grande possibilité qu’elles soient localisées côte à côte car la localisation de ces listes dépend de la géométrie de la scène. Ceci facilite la compression ; au lieu de spécifier un booléen par chacune des listes, décrivant si la liste est vide ou non, ou de noter la localisation des listes non vides, il est possible de construire une matrice compressée en notant pour une série de listes non vides localisées côte à côte, la localisation de la première et la dernière de ces listes (Figure 6.9 (c)). Cela permet de savoir le début et la fin d’une série de listes non vides sans maintenir la série toute entière en mémoire. La Figure 6.10 montre l’effet de la compression sur le nombre d’éléments de la matrice pour la scène de la cabine. Un facteur de compression de ≈ 150 est remarqué. Il est clair alors que le nombre d’éléments de la matrice diminue largement après la compression. Une fois cette matrice compressée construite sur les noeuds, un rassemblement de matrices est effectué. Le rassemblement consiste à faire une communication collective entre les noeuds rassemblant les matrices de communication de sorte à obtenir toutes les matrices sur tous les noeuds. Notons que ces matrices compressées ne sont pas décompressées, une fois rassemblées, le travail sur ces matrices peut se poursuivre sans avoir recours à une décompression. Après le rassemblement chacun des noeuds possède les informations nécessaires concernant les listes vides et non vides de tous les autres noeuds, il est alors capable de calculer à partir des matrices compressées, pour chacune des listes non vide le noeud suivant et le noeud précédent avec lesquels les informations d’illumination du premier et dernier voxel doivent être communiquées. Pour cela deux matrices de communication sont calculées : une matrice précédente et une matrice suivante, représentant le noeud précédent et suivant avec lesquelles le premier et le dernier voxels de chacune des listes non vides, présentes sur un noeud donné doivent communiquer. La Figure 6.9 (d) montre une exemple des 2 matrices de communication trouvées sur le Noeud 2, les noeuds suivant et précédent sont juste trouvés pour les listes non vides car pour les listes vides aucune communication n’est demandée. Chapitre 6. Distribution des données par division de la scène 117 Fig. 6.9 – Différentes étapes établies pour le calcul des matrices de communication. (a) La scène initiale et la répartition des voxels dans les listes pour une direction donnée. (b) Le calcul de la matrice des booléennes sur chacun des noeuds. (c) La compression des matrices booléennes sur chacun des noeuds en mémorisant juste le numéro de la première et dernière liste non vide pour une série contiguë des listes non vides. (d) Le calcul des 2 matrices de communication sur le Noeud 2 Chapitre 6. Distribution des données par division de la scène 118 200 180 Facteur de compression 160 140 120 100 80 60 40 20 2 3 4 5 6 Nombre de noeuds 7 8 9 Fig. 6.10 – L’effet de la compression sur les matrices de communications 6.4.2 Remplissage de voxels Une fois les deux matrices de communication calculées par chacun des noeuds pour une direction donnée, le remplissage des informations d’illumination des voxels impliqués doit s’achever. Chaque noeud prend le voxel début et celui de fin de chacune de ces listes non vides et vérifie vers quel noeud la valeur d’illumination doit être transférée. Si les informations du voxels sont à transférer vers un autre noeud, celles-ci sont stockées dans une structure de données libellée relativement au noeud de destination. Au contraire de la distribution des données par répartition des listes (Chapitre 5), où le voxel devant quitter le noeud est transféré tout entier, avec toutes les informations qu’il englobe (coefficient de réflexion, illumination, coordonnée ...) vers le noeud destinataire, l’approche de division de la scène ne nécessite que la transition de l’information du numéro de liste (i, j) et la valeur d’illumination. Le numéro de liste va être utile pour préciser la liste impliquée dans l’étape de mise à jour de l’illumination des voxels. 6.4.3 Envoi et Réception Après avoir rempli les informations à envoyer, l’envoi et la réception des informations d’illumination sont effectués. Ces envois et réceptions sont collectifs de tous les noeuds vers tous les noeuds, transférant les données nécessaires à chacun des noeuds. Chapitre 6. Distribution des données par division de la scène 6.4.4 119 Mise à jour d’illumination Les données reçues doivent être décodées afin de mettre à jour la valeur d’illumination des voxels. Les informations reçues comprennent la valeur d’illumination du voxel impliqué et son numéro de liste (i, j). Ce numéro de liste permet de déterminer, sur un noeud donné, avec quel voxel (du début ou de fin de la liste), les informations doivent être échangées. L’étape finale est la mise à jour d’illumination des voxels impliqués. 6.5 Résultats et discussion Les résultats de la distribution des données par répartition des listes ont été testés sur le cluster Laic. Trois scènes sont utilisées pour les tests, la scène de la cabine, de l’église et de la salle de travail. Les premiers tests consistent à utiliser 6 itérations et différents nombres de directions pour les trois scènes. Un nombre de directions égal à 4597 est testé pour toutes les scènes, 6271 directions pour la scène de l’église et 8209 pour la scène de la salle de travail. Les temps de calcul pour chacune des trois scènes respectivement sont montrés dans les Figures 6.11, 6.12 et 6.13. Il est possible de remarquer que le temps de calcul diminue avec le nombre de noeuds. Scène d’une église Scène d’une cabine 500 1000 4597 directions 6271 directions 800 Temps (minutes) Temps (minutes) 400 300 200 600 400 200 100 0 0 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 6.11 – Temps en fonction du nombre de noeuds scène de la cabine 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 6.12 – Temps en fonction du nombre de noeuds scène de l’église Du point de vue accélération, la Figure 6.14 montre l’accélération en fonction du nombre de noeuds des trois scènes en prenant un même nombre de directions (4597) pour les trois scènes et 6 itérations. Il est possible de remarquer qu’une accélération de ≈ 6 est obtenue avec 10 noeuds. Une description détaillée du temps de chaque opération de la parallélisation est montrée en Figure 6.15 et 6.16. Ces deux figures représentent respectivement la scène de la cabine avec 4597 directions et la scène de la salle de travail avec 8209 directions. En effet, l’algorithme séquentiel comprend deux temps de calcul qui sont importants, la mise en place de voxels et la propagation de lumière dans les listes. Lors de la distribution des données par division de la scène, les mêmes opérations présentes en séquentiel Chapitre 6. Distribution des données par division de la scène 6 Scène d’une salle de travail 4597 directions 8209 directions Scène d’une cabine Scène d’une église Scène d’une salle de travail 5 800 Accélération Temps (minutes) 1000 120 600 4 3 400 2 200 0 1 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 6.13 – Temps en fonction du nombre de noeuds scène de la salle de travail 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 6.14 – Accélération en fonction du nombre de noeuds pour trois différentes scènes se répètent et le temps de ces opérations est divisé par le nombre de noeuds. En plus d’autres opérations se rajoutent. Ces opérations sont le temps du calcul des matrices de communication, de remplissage de voxels à envoyer, des envois et réceptions et de la mise à jour de l’illumination des voxels. Matrices de communication Remplissage Envoi et réception Mise à jour Mise en place et propagation 500 900 800 Temps (minutes) Temps (minutes) 400 Matrices de communication Remplissage Envoi et réception Mise à jour Mise en place et propagation 1000 300 200 700 600 500 400 300 100 200 100 0 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 6.15 – Distribution temporelle en fonction du nombre de noeuds utilisant des communications collectives pour la scène de l’église 0 1 2 3 4 5 6 7 Nombre de noeuds 8 9 10 Fig. 6.16 – Distribution temporelle en fonction du nombre de noeuds utilisant des communications collectives pour la scène de la salle de travail Il est clair que le temps de la mise en place et de la propagation de la lumière dans les listes, le même calcul fait en séquentiel, est largement dépendant du nombre de noeuds et diminue avec celui-ci. Concernant le temps des autres opérations, il ne varie pas beaucoup et reste stable en augmentant le nombre de noeuds : cela vient du fait que ce temps dépend du nombre de listes non vides qui détermine la quantité de données à remplir, envoyer, recevoir et mettre à jour. Le nombre de listes non vides ne varie pas Chapitre 6. Distribution des données par division de la scène Cabine Nombre de noeuds 1 2 3 4 5 6 7 8 9 10 Temps 528 282 215 170 152 132 121 108 103 95 Eglise Efficacité Temps 0,94 0,82 0,78 0,69 0,67 0,62 0,61 0,57 0,56 688 384 300 250 224 207 190 181 172 165 121 Salle de travail Efficacité Temps Efficacité 0,9 0,77 0,69 0,61 0,55 0,52 0,48 0,44 0,42 572 314 242 200 180 162 152 142 134 128 0,91 0,79 0,715 0,64 0,59 0,54 0,5 0,47 0,45 TAB 6.1 – Etude de l’efficacité de la distribution des données par division de la scène beaucoup quand le nombre de noeuds augmente ; ce qui engendre la stabilité en temps des communications. Un bon gain par rapport au nombre de noeuds est obtenu avec un nombre de noeuds petit. Quand le nombre de noeuds augmente, ce gain diminue. Le tableau 6.1 montrant les temps de calcul et les efficacités justifie cela. Une efficacité de 90% est remarquée avec 2 noeuds, cette efficacité diminue quand le nombre de noeuds augmente pour atteindre une valeur de ≈ 45% avec 10 noeuds. En effet quand le nombre de noeuds augmente, on continue à gagner sur les opérations de la mise en place des voxels et la propagation de la lumière dans les listes, or pour les autres opérations rajoutées par la parallélisation, le gain est négligeable car le temps de ces opérations est presque stable en augmentant le nombre de noeuds. 6.5.1 Comparaison des deux approches de division de la scène La Figure 6.17 montre une comparaison en temps de calcul des deux approches, l’approche utilisant une topologie cartésienne et des communications non bloquantes et l’approche utilisant des communications collectives. Les résultats sont testés sur deux scènes différentes, la scène de la cabine et la scène de l’église utilisant 4597 directions et 6 itérations. Avec deux noeuds les deux approches fournissent plus ou moins les même résultats car les échanges sont limités et il n’y a pas besoin de plusieurs re-transmissions. Quand le nombre de noeuds augmentent, l’approche des communications collectives montre des meilleurs résultats en temps de calcul car elle permet une communication directe entre les noeuds sans devoir passer par plusieurs noeuds pour transmettre l’information d’illumination d’un voxel donné au noeud en question. Chapitre 6. Distribution des données par division de la scène 122 Scène d’une cabine (collectives) Scène d’une église (collectives) Scène d’une cabine (topology) Scène d’une église (topology) 600 Temps (minutes) 500 400 300 200 100 0 1 2 3 4 5 6 Nombre de noeuds 7 8 9 10 Fig. 6.17 – Comparaison des temps des deux approches de division de la scène, l’approche utilisant une topologie cartésienne (topology) et l’approche utilisant des communications collectives (collectives) 6.5.2 Parallélisation locale et distribution des données Comme il a été noté en section 4.2, les deux étapes essentielles de calcul d’illumination globale, la mise en place des voxels dans leurs listes de visibilité et la propagation de la lumière dans ces listes peuvent être parallélisées localement en distribuant les voxels sur différents threads. La distribution des données par division de la scène divise la scène en plusieurs parties chacune contenant un nombre plus ou moins équitable de voxels. Ces parties sont distribuées sur les noeuds du cluster pour être traitées en parallèle. Chacun des noeuds effectue alors, pour ses propres voxels, les deux étapes de calcul d’illumination, la mise en place de ces voxels dans leurs listes et la propagation de la lumière dans les listes. Ce n’est qu’après l’achèvement de ces deux étapes que les échanges des informations d’illumination des voxels entre les noeuds peuvent commencer. Rien n’empêche alors d’effectuer une parallélisation locale sur chacun des noeuds en distribuant les voxels locale au noeud sur les threads. Cette parallélisation locale permet de profiter de toutes les capacités des noeuds du cluster sur lequel la distribution des données est effectuée et aide à maximiser la distribution des données par division de la scène. Cette parallélisation a montré un gain de 20 à 25% par rapport à la distribution des données par division de la scène. Chapitre 6. Distribution des données par division de la scène 123 Scène d’une cabine (division) Scène d’une église (division) Scène d’une salle de travail (division) Scène d’une cabine (listes) Scène d’une église (listes) Scène d’une salle de travail (listes) 600 Temps (minutes) 500 400 300 200 100 0 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 6.18 – Temps en fonction du nombre de noeuds. Comparaison des deux approches de distribution des données, par distribution des listes (listes) et par division de la scène (division) 6.5.3 Comparaisons de distribution des données par répartition des listes et par division de la scène Les deux approches de parallélisation : la distribution des données par répartition de listes et la distribution des données par division de la scène (communications collectives) ont toutes les deux distribuées les données. Il est important finalement de comparer les résultats de ces deux approches pour voir laquelle est la plus efficace du point de vue du temps de calcul. Les Figures 6.18 et 6.19 permettent de comparer les deux approches. Les tests sont effectués sur le cluster Laic. Trois scènes sont utilisées pour les tests, la scène de la cabine, de l’église et de la salle de travail. Six itérations et 4597 directions sont utilisés. Il est clair que l’approche de répartition des données par division de la scène (division) donne des temps qui sont beaucoup plus rapide, presque deux fois plus rapide que celle de distribution des données par répartition des listes (listes). En effet dans l’approche de la division de la scène les voxels sont fixes sur les noeuds et ne transitent pas entre les noeuds ce qui fait qu’il n’y a pas besoin d’un équilibrage de charge ni de fusion de voxels reçus. Dans l’approche de répartition des listes, un déséquilibre entre les noeuds nécessite un équilibrage ainsi qu’un remplissage d’un nombre important de données entre les noeuds pour équilibrer la charge de nouveau. Cela n’est pas le cas pour la division de la scène qui maintient en permanence un équilibre entre les noeuds. Chapitre 6. Distribution des données par division de la scène 124 6 Scène d’une cabine (division) Scène d’une église (division) Scène d’une salle de travail (division) Scène d’une cabine (listes) Scène d’une église (listes) Scène d’une salle de travail (listes) Accélération 5 4 3 2 1 2 3 4 5 6 Nombre de noeuds 7 8 9 10 Fig. 6.19 – Accélération en fonction du nombre de noeuds. Comparaison des deux approches de distribution des données, par distribution des listes (listes) et par division de la scène (division) Préparer les 4 ordres lexicographiques Calculer l’ensemble de directions Pour(chaque itération) Pour(chaque direction) Choisir l’ordre lexicographique Pour (chaque voxel) mettre le voxel dans la liste à laquelle il appartient Fin Pour Pour (chaque liste) Propager la lumière dans la liste Construire la matrice compressée (numéro de listes vides et nonvides) Fin Pour Echanger la matrice compressée entre les noeuds Trouver la matrice de communication Remplir les données des voxels à envoyer Faire les envois et réceptions entre les noeuds Mettre à jour l’illumination des voxels Vider les listes Fin Pour Fin Pour Algorithme 6.2 – Calcul de l’illumination par division de la scène et utilisant des communications collectives Chapitre 6. Distribution des données par division de la scène 6.6 125 Cumul les données et communications collectives Faire des communications entre les noeuds à chaque direction pour rassembler les matrices de booléennes compressées ainsi que pour les échanges de voxels nécessite une synchronisation entre les noeuds pour les envois et réceptions collectives. Ce temps de synchronisation diminue parfois la performance de la parallélisation à cause de l’absence d’une synchronisation. Cette désynchronisation entre les noeuds vient du fait que certains noeuds peuvent avoir plus de données à envoyer que d’autres, ayant un nombre plus élevées de listes non vides. Ce temps de synchronisation, même faible, pour une seule direction, se cumule sur les directions et est multiplié par le nombre d’itérations engendrant un temps important au final. Une solution pour augmenter la performance de l’approche de division de la scène consiste à augmenter la performance de la parallélisation en cumulant les données de plusieurs directions en mémoire pour les traiter plus tard. Cela revient à mémoriser la matrice compressée de listes vides et non vides ainsi que les informations d’illumination pour un certains nombre de directions. Cela pose des limites mémoire, et doit tenir compte de la taille de la mémoire de chacun des noeuds. En effet cumuler les données sur plusieurs directions oblige à stocker des données en mémoire et faire ensuite une phase de traitement des données pour achever la mise à jour de l’illumination des voxels. L’Algorithme 6.2 montre l’algorithme de division de la scène par communication collectives sans cumul des directions et l’Algorithme 6.3 montre le même algorithme avec cumul des directions. Dans l’Algorithme 6.3, “maxcumul” indique le nombre de directions pour lesquels on souhaite cumuler les données en mémoire. Une variable “nombre de directions cumulées” valant zéro au début est incrémentée pour cumuler les données puis elle est remise à zéro quand le “nombre de directions cumulées” vaut “maxcumul”. L’avantage direct de cette approche consiste à diminuer le temps de synchronisation en n’imposant une synchronisation que de temps en temps selon le nombre de directions à cumuler. Cette approche a été testée mais malheureusement n’a pas réussi a diminuer la synchronisation entre les noeuds. Ses résultats sont les mêmes qu’en prenant une direction à la fois. Cela vient du fait qu’on cumule un nombre de directions limités, les améliorations peuvent être obtenues avec un nombre de directions plus denses. Or quand le nombre de directions est denses, la quantité d’informations cumulées en mémoire devient très large et risque de ne plus tenir en mémoire RAM d’un ordinateur alors que le but premier de la distribution des données est de diminuer la consommation mémoire et non de l’augmenter. Chapitre 6. Distribution des données par division de la scène 126 Préparer les 4 ordres lexicographiques Calculer l’ensemble de directions nombre de directions cumulées=0 Pour(chaque itération) Pour(chaque direction) Choisir l’ordre lexicographique Pour (chaque voxel) Mettre le voxel dans la liste à laquelle il appartient Fin Pour Pour (chaque liste) Propager la lumière dans la liste Mémoriser un pointeur du voxel début et fin de chaque liste non-vide Vider les listes Construire la matrice compressée (numéro de listes vides et nonvides) Fin Pour Incrémenter de 1 le nombre de directions cumulées Si (nombre de directions cumulées==maxcumul) Echanger la matrice compressée entre les noeuds Trouver la matrice de communication Remplir les données des voxels à envoyer Faire les envois et réceptions entre les noeuds Mettre à jour l’illumination des voxels nombre de directions cumulées=0 Fin Si Fin Pour Fin Pour Algorithme 6.3 – Calcul de l’illumination par division de la scène et utilisant des communications collectives. Les données sont cumulées en mémoire et les échanges sont effectués chaque un ensemble de directions 6.7 Conclusion Ce chapitre a traité de la distribution des données par division de la scène en utilisant deux approches différentes. La première approche de topologie cartésienne et des communications non bloquantes effectue une communication entre les voisins directes et nécessite parfois plusieurs transmissions pour mettre à jour la valeur d’illumination des voxels voisins en terme de visibilité mais localisés sur des noeuds écartés. Cette approche a montré une performance inférieure à celle de la deuxième approche qui utilise Chapitre 6. Distribution des données par division de la scène 127 des communications collectives et établit des communications directes entre les noeuds. Une comparaison entre les deux approches de distribution des données, par répartition des listes (Chapitre 5) et par division de la scène a été effectuée en comparant les résultats obtenus pour différentes scènes. La parallélisation par division de la scène a une meilleure performance que la méthode du chapitre précédent, à cause de la stabilité des voxels sur les noeuds éliminant ainsi le recours à une équilibrage de charges. Aussi cette approche offre l’avantage de maintenir l’ordre lexicographique des voxels qui ne transitent pas mais sont stables entre les noeuds. Elle ne requiert aucune fusion de données reçues, car ces données ne sont pas des voxels mais des informations d’illumination à mettre à jour. Les résultats obtenus utilisant la distribution des données par division de la scène sont encourageant : une accélération jusqu’à 6 est obtenue avec 10 processeurs. Dans le chapitre suivant, on propose une amélioration du calcul séquentiel et une parallélisation de ces améliorations utilisant l’approche de division de la scène par communications collectives. Chapitre 6. Distribution des données par division de la scène 128 Chapitre 7 Améliorations de l’algorithme séquentiel et sa parallélisation L’algorithme séquentiel d’illumination globale [CM06] étudié au Chapitre 3 comprend deux étapes essentielles : la mise en place des voxels dans leurs listes et la propagation de la lumière dans les listes. Ces deux étapes ont une complexité linéaire. Différentes parallélisations appliquées à cet algorithme (distribution locale, distribution du calcul (Chapitre 4) et distribution des données (Chapitre 5 et 6)), permettent d’améliorer le temps de calcul. Pour certaines scènes contenant des sources lumineuses intenses, une étude précise des parallélisations nous a conduit à une analyse à postériori du code séquentiel. Nous présentons dans ce chapitre les optimisations apportées à la version séquentielle ainsi que leur conséquence en terme de parallélisation. Nous avons remarqué que les deux étapes de calcul d’illumination peuvent être combinées en une seule, diminuant ainsi la complexité de l’algorithme. Ce chapitre explique cette combinaison qui permet d’améliorer les performances de l’algorithme séquentiel. Cette amélioration est testée sur plusieurs scènes, mesurant l’accélération offerte par cet algorithme optimisé par rapport à l’ancien algorithme séquentiel. Ce chapitre présente aussi une parallélisation de l’algorithme séquentiel amélioré. Cette parallélisation est une distribution des données par division de la scène utilisant l’approche des communications collectives, approche détaillée au Chapitre 6. 7.1 Amélioration de l’algorithme séquentiel L’algorithme séquentiel d’illumination nécessite le calcul de l’ensemble de directions ainsi que le tri des voxels en 4 ordres lexicographique. Ces calculs ne sont pas coûteux car ils sont fait une seule fois indépendamment du nombre de directions et d’itérations. Cet algorithme comprend cependant deux étapes essentielles et coûteuses en temps de calcul se répétant à chaque direction, et pour toutes les itérations. Ces deux étapes sont la mise en place des voxels dans les listes auxquelles ils appartiennent et la propagation de la lumière dans ces listes. Elles nécessitent un parcours des voxels, le calcul des (i, j) 129 Chapitre 7. Améliorations de l’algorithme séquentiel et sa parallélisation 130 (partition de l’espace en droites), la mise en place des voxels un par un dans les listes correspondantes et ensuite une propagation de la lumière entre les voxels voisins dans une même liste. Ces étapes ne sont pas complexes en temps de calcul pour des petites scènes mais quand les scènes augmentent en taille et par la suite en nombre de voxels, elles demandent un temps de calcul important. Dans [Cha06], Chatelier et Malgouyres considère que les voxels sont opaques, c’est-àdire n’ayant aucune transparence. Cela implique que la visibilité est 0 ou 1. Deux voxels voisins en terme de visibilité, échange leur illumination. Si deux voxels ne sont pas voisins en terme de visibilité, aucun échange ne se produit entre eux. Aussi, pour une direction donnée, au lieu d’avoir recours à une construction des listes de voxels pour ensuite propager la lumière entre les voxels voisins en terme de visibilité d’une même liste, il est possible d’éviter la construction des listes et de faire un échange ou propagation de lumière surplace au moment du parcours des voxels. En effet cet échange ne nécessite que de connaître un voxel par liste grâce à la propriété d’opacité. En supposant que les voxels sont triés dans le bon ordre lexicographique, la propagation se fait de la manière suivante : pendant le parcours des voxels, le (i, j) du voxel courant est calculé. La valeur d’illumination de ce voxel est échangée avec le dernier voxel de la droite (i, j), en supposant que ce dernier a été sauvegardé en mémoire. Si c’est pas le cas, cela implique que le voxel courant est le dernier voxel de la droite (i, j), il n’a aucun antécédent et donc aucun échange de lumière n’est à faire. Après l’échange de la lumière entre le voxel courant et son antécédent pour la droite (i, j), le voxel courant est maintenu en mémoire comme étant le dernier visité de la droite (i, j). Le parcours des voxels continue et la même procédure se répète pour tous les voxels. La Figure. 7.1 montre un exemple de ce calcul. Les voxels sont parcourus dans l’ordre lexicographique. En débutant le parcours, le voxel “a” est maintenu en mémoire comme le dernier pour la droite (0, 0). Ensuite le voxel “b” est maintenu en mémoire comme le dernier pour la droite (2, 2). En arrivant au voxel “c”, un échange de lumière entre les deux voxels “c” et “a” appartenant à la même droite (0, 0) est effectué. Après cela le voxel “a” est supprimé de la mémoire et le voxel “c” est maintenu en mémoire comme le dernier voxel de la droite (0, 0). Le parcours continue : le voxel “d” est maintenu en mémoire comme le dernier voxel pour la droite (0, 2) ; en arrivant au voxel “e”, un échange de lumière est achevé entre celui-ci et le dernier pour la droite (2, 2), le voxel “b”. 7.1.1 Résultats Des tests sont effectués sur le cluster Isima afin de comparer l’algorithme séquentiel amélioré expliqué en Section 7.1 et l’ancien algorithme séquentiel de Chatelier et Malgouyres [Cha06] expliqué au Chapitre 3. Ces tests sont effectués sur trois scènes différentes : la scène d’une cabine, d’une église et d’une chambre composées respectivement de 3.1 million et 3.5 million et 6 million de voxels. La Figure 7.2 montre les résultats obtenus pour les 3 scènes utilisant 6 itérations et en variant le nombre de directions. Chapitre 7. Améliorations de l’algorithme séquentiel et sa parallélisation 131 Fig. 7.1 – Propagation de la lumière surplace : le (i, j) de chacun des voxels est calculé, la lumière est propagée entre le voxel courant et le dernier voxel de la droite (i, j). Ensuite le voxel courant est maintenu en mémoire comme étant le dernier pour la droite (i, j) Il est clair que l’algorithme séquentiel amélioré “(nouveau)” offre une accélération d’un facteur de 1.55 à 1.7 par rapport à l’ancien algorithme séquentiel “(ancien)”. Cela montre l’efficacité d’éliminer la construction des listes et faire la propagation surplace entre les voxels d’une même droite (i, j), voisins en terme de visibilité. 7.1.2 Parallélisation locale Une parallélisation locale peut être appliquée sur les améliorations effectuées à l’algorithme séquentiel d’illumination. L’algorithme séquentiel d’illumination [CM06] expliqué au Chapitre 3 contient deux étapes de calcul coûteux pour des grandes scènes et qui peuvent être parallélisées localement utilisant des threads. Ces deux calculs sont la mise en place des voxels dans leur listes correspondantes et la propagation de la lumière dans les listes et qui peuvent être distribués parmi les threads, donnant à chacun des threads une partie des voxels à traiter. Comme l’algorithme séquentiel (ancien algorithme), l’algorithme séquentiel amélioré (nouvel algorithme) peut être parallélisé localement utilisant les threads. Or la parallélisation de l’algorithme séquentiel amélioré est un peu différente de l’ancien algorithme, car il ne procède pas à la construction des listes, l’échange de lumière entre les voxels est accompli surplace au moment du parcours des voxels. 7.1.2.1 Étapes de la parallélisation locale La parallélisation locale de l’algorithme séquentiel amélioré consiste à donner à chacun des threads une partie équitable des voxels, triés en ordre lexicographique (le tri est choisi parmi les quatre tris pré-calculés). Chacun des threads calcule alors le (i, j) du voxel et propage la lumière surplace. La propagation de lumière surplace comme vue en Chapitre 7. Améliorations de l’algorithme séquentiel et sa parallélisation 132 4500 Scène d’une cabine (ancien) Scène d’une église (ancien) Scène d’une salle de travail (ancien) Scène d’une cabine (nouveau) Scène d’une église (nouveau) Scène d’une salle de travail (nouveau) 4000 3500 Temps (minutes) 3000 2500 2000 1500 1000 500 0 2000 4000 6000 8000 10000 12000 14000 Nombre de directions Fig. 7.2 – Temps en fonction du nombre de directions des deux algorithmes, l’algorithme séquentiel (ancien) et l’algorithme séquentiel amélioré (nouveau) testés sur trois différentes scènes Section 7.1 consiste, pour une droite (i, j), à maintenir en mémoire le dernier voxel de la droite (i, j) et ensuite, mettre à jour la valeur d’illumination du voxel courant avec le dernier voxel de la droite pendant le parcours les voxels. Or en distribuant les voxels sur les threads, maintenir pour une droite (i, j) le dernier voxel seulement n’est pas suffisant. Chacun des threads traite une partie des voxels, ce qui fait qu’à la fin de la propagation, un échange de lumière des voxels appartenant à une même droite (i, j), mais traités par différents threads, (et donc présents sur des structures de données distinctes) doit être effectué. Cette mise à jour ne sera possible que si le tout premier et le dernier voxels de chacune des droites sont maintenus en mémoire. Pour cela, au moment du parcours des voxels, sur chacun des threads, le premier voxel de chacune des droites non vides est gardé en mémoire en plus du dernier voxel de la droite et qui sera lui mise à jour pendant le parcours. A la fin du parcours le premier et dernier voxels de chacune des droites non vides sont maintenus en mémoire. Une étape complémentaire consiste, pour toute droite (i, j) non vide, à échanger la lumière entre le dernier voxel de la droite, présent sur une structure de donnée désignée à un thread donné, avec le premier voxel de la même droite (i, j) Chapitre 7. Améliorations de l’algorithme séquentiel et sa parallélisation 133 présent sur la structure de donnée désignée au thread suivant (voir Figure 7.3). Fig. 7.3 – Chacun des threads maintient en mémoire le premier et le dernier voxel de chacune des droites non vides. Un échange de lumière est accompli entre le dernier voxel d’une droite (i, j) donnée désignée pour un thread donné, avec le premier voxel de la même droite localisée sur le thread suivant 7.1.2.2 Résultats Les résultats de la parallélisation locale de l’algorithme séquentiel amélioré sont montrés en Figure 7.4. Les tests sont effectués sur deux différentes scènes, la scène d’une cabine et la scène d’une église avec, 6 itérations, deux threads et en variant le nombre de directions. Deux threads sont utilisés car il a été remarqué que quand le nombre de threads augmentent le temps augmente. Il est clair que cette parallélisation locale a amélioré le temps de 5 à 15%. Il faut noter que l’application des threads sur l’algorithme séquentiel ancien a montré une amélioration du temps de 30% (Chapitre 4 Section 4.2.2.3), et donc les threads était plus performant sur cet algorithme que sur l’algorithme amélioré. Cela est dû au fait que la parallélisation locale sur l’ancien algorithme séquentiel utilise les threads pour paralléliser les deux étapes la mise en place des voxels dans leurs listes et la propagation de la lumière dans les listes. Or dans le nouveau algorithme amélioré, ces deux étapes sont combinées en une seule et les listes ne sont pas construites. Les threads sont alors appliqués sur une seule étape moins coûteuse, ce qui a diminué leur performance. 7.1.3 Parallélisation des données par division de la scène Comme a été expliqué au Chapitre 6 en Section 6.4, il est possible de diviser la scène en plusieurs parties ou sous-environnement séparées par des barrières invisibles. Les barrières sont placées de manière à respecter une densité équitable des voxels entre les noeuds. Cette division de la scène permet alors la distribution des données entre les noeuds des grappes de stations de travail. Or cette parallélisation a été appliquée sur Chapitre 7. Améliorations de l’algorithme séquentiel et sa parallélisation 134 2000 Scène d’une cabine (sans thread) Scène d’une église (sans thread) Scène d’une cabine (2 threads) Scène d’une église (2 threads) Temps (minutes) 1500 1000 500 0 0 2000 4000 6000 8000 10000 12000 14000 16000 Nombre de directions Fig. 7.4 – Temps en fonction du nombre de directions de l’algorithme séquentiel amélioré, sans threads et avec deux threads (parallélisation locale). Les tests sont effectués sur deux différentes scènes l’algorithme séquentiel ancien proposé dans [CM06]. La même procédure peut être utilisée pour paralléliser l’algorithme séquentiel amélioré. L’algorithme séquentiel amélioré se distingue par le fait que les listes ne sont pas construites pour effectuer la propagation de lumière. Comme la parallélisation locale, la parallélisation par division de la scène, nécessite une mémorisation des informations du premier et du dernier voxel de chacune des droites non vides qui seront utiles pour la mise à jour de la lumière à chaque nouvelle direction. Les informations nécessaires des deux voxels, le premier et le dernier de chaque droite non vide, sont alors maintenus en mémoire. Ces informations sont ensuite remplies et envoyées. Les informations reçues par chacun des noeuds sont utilisées afin de mettre à jour la valeur d’illumination des voxels. Notons que la parallélisation appliquée est celle de la division de la scène en utilisant des communications collectives (voir Section 6.4) car elle a montré des meilleurs résultats en communiquant directement l’information du voxel impliqué avec son voisin en terme de visibilité sur le noeud impliqué sans passage par des noeuds intermédiaires. Chapitre 7. Améliorations de l’algorithme séquentiel et sa parallélisation 7.1.3.1 135 Résultats Les résultats de la distribution des données par division de la scène appliquée sur l’algorithme séquentiel amélioré et utilisant les communications collectives sont testés pour trois scènes différentes, la scène d’une cabine, d’une église et d’une chambre composées de 3.1 million et 3.5 million et 6 million de voxels respectivement. Les tests sont effectués sur le cluster Isima avec 5000 directions pour la scène de la cabine, 8200 directions pour la scène de l’église et 6300 pour la scène de la chambre et utilisant 6 itérations. Le temps en fonction du nombre de noeuds est montré en Figure 7.5. L’accélération en fonction du nombre de noeuds est montré en Figure 7.6 un gain de 4.5 est obtenu avec 10 noeuds. 2200 Scène d’une cabine (ancien) Scène d’une cabine (nouveau) Scène d’une église (ancien) Scène d’une église (nouveau) Scène d’une chambre (ancien) Scène d’une chambre (nouveau) 2000 1800 1600 Temps (minutes) 1400 1200 1000 800 600 400 200 0 0 1 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 7.5 – Temps en fonction du nombre de noeuds de la distribution des données par division de la scène appliquée sur l’algorithme séquentiel amélioré 7.2 Conclusion Les améliorations apportées à l’algorithme séquentiel ont permis d’améliorer le temps séquentiel par un facteur de 1.5. Cela est avantageux et permet de traiter de grandes scènes plus rapidement. La parallélisation de l’algorithme séquentiel amélioré a apporté Chapitre 7. Améliorations de l’algorithme séquentiel et sa parallélisation 136 6 Scène d’une cabine Scène d’une église Scène d’une chambre 5 Accélération 4 3 2 1 0 2 3 4 5 6 7 8 9 10 Nombre de noeuds Fig. 7.6 – Accélération en fonction du nombre de noeuds de la distribution des données par division de la scène appliquée à l’algorithme séquentiel amélioré une minimisation du temps importante, tout en distribuant la mémoire permettant ainsi de traiter de grandes scènes qui n’entrent pas en mémoire centrale d’un noeud. Conclusion Les méthodes de calcul d’illumination globale, spécifiquement les méthodes dérivées de radiosité ou qui ont des points communs avec celle-ci, comme ce travail, simulent la lumière d’une manière très précise permettant la génération d’images aussi réalistes que possible. Ces méthodes demandent en général une puissance de calcul et une consommation mémoire importantes, ce qui nous a amené à nous intéresser à la parallélisation de ces méthodes dans le but de réduire le coût de traitement. Le présent document regroupe différentes parallélisations appliquées sur l’algorithme d’illumination proposé par P. Chatelier et R. Malgouyres [CM06] “A low complexity discrete radiosity method”. Les différentes parallélisations réalisées sont effectuées sur des machines à mémoire distribuée, un cluster. Le choix d’une telle architecture nous a permis non seulement de minimiser le temps de calcul, mais aussi la consommation mémoire quand les données sont distribuées. L’algorithme séquentiel d’illumination [CM06] est basé sur la discrétisation des surfaces en voxels pour le calcul d’illumination. La propagation de l’énergie s’effectue sur les rayons. Des notions de géométrie discrète, notamment des droites discrètes sont utilisées pour partitionner l’espace et propager la lumière entre les voxels. Le système d’équations linéaires de calcul de l’illumination est résolu par la méthode de Gauss-Seidel. Cette méthode nécessite plusieurs itérations pour la convergence vers la bonne solution d’illumination. L’algorithme séquentiel est dépendant d’un facteur de direction généré à partir d’une sphère discrète. Dans ce travail, une étude de convergence effectuée sur cet algorithme permet de tester la rapidité de convergence de l’algorithme en fonction des deux facteurs qui sont le nombre d’itérations et de directions. Dans un premier temps, nous avons minimisé le temps de calcul en appliquant une parallélisation locale distribuant les voxels sur différents threads. Cette parallélisation est locale à un noeud, elle a permis de diminuer le temps de calcul et d’augmenter le degré ou le niveau du parallélisme, en se servant des deux bi-processeurs d’un noeud donné. Une deuxième parallélisation qui distribue le calcul a été implémentée, distribuant les directions de l’espace sur les différents noeuds du cluster. Bien que les résultats obtenus soient très satisfaisants, cette distribution du calcul n’est pas envisageable lorsque les scènes sont très grandes car elle ne distribue pas la mémoire mais nécessite une duplication des voxels sur les noeuds. Bref, ces deux parallélisations ont réussi à diminuer le temps mais n’ont pas distribué la mémoire car elles nécessitent une duplication des voxels sur les noeuds. 137 Conclusion 138 Le second objectif de minimisation du temps de calcul et la consommation mémoire a été atteint. Le but essentiel était de distribuer les données et donc les voxels entre les noeuds du cluster. Deux parallélisations ont été appliquées pour effectuer la distribution des données. La première parallélisation a réparti les listes et donc les voxels parmi les noeuds du cluster. Des échanges de voxels entre les noeuds ont été faits afin de construire des listes complètes de voxels contenant tous les voxels appartenant à une liste donnée. La deuxième parallélisation a divisé la scène en sous-environnements ayant chacun un nombre équitable de voxels, les voxels sont stables entre les noeuds et seuls les informations d’illumination des voxels voisins en terme de visibilité mais localisés sur des noeuds distincts sont échangées. Cette deuxième parallélisation a montré de meilleurs résultats par rapport à la première car elle ne demande pas un équilibrage de charge, nécessite moins d’échanges entre les noeuds et requiert des opérations en parallèle moins coûteuses que la répartition des listes. La dernière partie de notre travail est une amélioration de l’algorithme séquentiel d’illumination qui combine deux étapes du calcul d’illumination en une seule, minimisant le temps de calcul séquentiel de 40% sur un seul processeur. Toutes les parallélisations étudiées dans ce document sont appliquées sur l’algorithme diffus d’illumination. Or cet algorithme a été étendu du cas diffus où la lumière émise est la même dans toutes les directions au cas BRDF où l’énergie est émise dans une direction donnée selon la direction incidente. Les parallélisations présentées dans cette thèse sont adaptables au cas des BRDFs [CM07] ; la distribution des données par division de la scène est mieux adaptée que la distribution des données par répartition des listes car elle ne nécessite pas la communication du profil d’émission des voxels. L’algorithme utilisant les BRDF [CM07] sera parallélisé dans une étape future en étendant les méthodes de notre travail. Il est important de noter finalement que cette approche d’illumination [CM06] que l’on a parallélisé est une partie d’un algorithme de lancer de rayons en cours d’étude par le doctorant Lukasz Piwowar. Cette méthode qui permet de réduire le coût en produisant également un affichage non aliasé nécessitera aussi une parallélisation. Annexe A Scènes en 3D Les images ci-dessous montrent une vue partielle des scènes en 3 dimensions. Ces scènes sont utilisées pour tester les différentes parallélisations effectuées dans le présent travail. Elles représentent les scènes initiales avant le calcul d’illumination. Fig. A.1 – Scène d’une église 139 Annexe A. Scènes en 3D 140 Fig. A.2 – Scène d’une salle de travail Fig. A.3 – Scène d’une chambre Annexe A. Scènes en 3D 141 Fig. A.4 – Scène d’une cabine Fig. A.5 – Scène d’un salon Annexe A. Scènes en 3D 142 Bibliographie [AAS97] E. Andres, R. Acharya, and C. Sibata. Discrete analytical hyperplanes. Computer Graphics Forum, 59(5) :302–309, 1997. [Aaz96] C. Aykanat, T.K. Çapin, and B. Özgüç. A parallel progressive radiosity algorithm based on patch data circulation. Computers and Graphics, 20(2) :307–324, 1996. [ACS00] K. Atkinson, D.K. Chien, and J. Seol. Numerical analysis of the radiosity equation using the collocation method. Electronic Transactions on Numerical Analysis, 11 :94–120, 2000. [AFF97] F.A. Agelet, F.P. Fontan, and A. Formella. Fast ray tracing for microcellular and indoor environments. IEEE Transactions on Magnetics, 33(2) :1484–1487, 1997. [AJ97] E. Andres and M.A. Jacob. The discrete analytical hyperspheres. IEEE Transactions on Visualization and Computer Graphics, 3(1) :75–86, 1997. [AK90] J. Avro and D. Kirk. Particle transport and image synthesis. ACM SIGGRAPH, Computer Graphics, 24(4) :53–66, 1990. [Akl88] S.G. Akl. The design and analysis of parallel algorithm. Prentice Hall, 1988. [AMP00a] D. Arquès, S. Michelin, and B. Piranda. A new geometrical support for the radiosity function. High Performance Computer Graphics, Multimedia and Visualization (HPGC’2000), 1(1) :1–20, 2000. [AMP00b] D. Arquès, S. Michelin, and B. Piranda. Overlapping radiosity : using a new function base with local disk support. In 8th International Conference in Central Europe on Computer Graphics and Visualization (WSCG’2000), pages 236–243, Plzen, Czech Republic, February 2000. 143 BIBLIOGRAPHIE [And00] 144 E. Andres. Modélisation analytique discrète d’objets géométriques. In Habilitation à diriger des recherches, UFR Sciences Fondamentale et Appliquées, Université de Poitiers (France), December 2000. [And03] E. Andres. Discrete linear objects in dimension n : the standard model. Graphical Models, 65(1-3) :92–111, 2003. [AS00] M. Ashikhmin and P. Shirley. An anisotropic phong BRDF model. Journal of Graphics Tools, 5(2) :25–32, 2000. [aSOaDWD98] M. Snir and S. Otto, S. Huss-Lederman and D. Walker, and J. Dongarra. MPI : The Complete Reference (Vol. 1). MIT Press, 1998. [BBK+ 68] G.H. Barnes, R.M. Brown, M. Kato, D.J. Kuck, D.L. Slotnick, and R.A. Stokes. The ILLIAC IV. IEEE transactions on computers, C-17(8) :746– 757, 1968. [Bes01] G. Besuievsky. A Monte Carlo approach for animated radiosity environments. PhD thesis, Universitat Polytècnica de Catalunya, 2001. [Bla00] C. Blaess. Programmation système en C sous Linux. Paris, 2000. [BMP] K. Bouatouch, D. Menard, and T. Priol. Parallel radiosity using a shared virtual memory. In Proc. of Advanced Techniques in Animation, Rendering and Visualization. [BW90] D. Baum and J. Winget. Real time radiosity through parallel processing and hardware acceleration. In Proceedings of the 1990 symposium on Interactive 3D graphics, pages 67–75, Utah, United States, 1990. [CAH00] F. Cuny, L. Alonso, and N. Holzschuch. A novel approach makes higher order wavelets really efficient for radiosity. Computer Graphics Forum (Eurographics 2000 Proceedings), 19(3) :C99–108, 2000. [CAP98] X. Cavin, L. Alonso, and J.C. Paul. Parallel wavelet radiosity. In Proceedings of the Second Eurographics Workshop on Parallel Graphics and Visualisation, pages 61–75, Rennes, France, 1998. [Cav00] X. Cavin. Simulation numérique parallèle et graphisme haute- performance pour la synthèse d’images réalistes. PhD thesis, Doctorat de l’Institut National Polytechnique de Lorraine, 2000. BIBLIOGRAPHIE [CCWG88] 145 M.F. Cohen, S. Chen, J. Wallace, and D. Greenberg. A progressive refinement approach to fast radiosity image generation. Proceedings of the 15th annual conference on Computer graphics and interactive techniques, 22(4) :75–84, 1988. [CG85] M.F. Cohen and D.P. Greenberg. The hemi-cube : a radiosity solution for complex environments. Computer Graphics, 19(3) :31–40, 1985. [Cha06] P. Chatelier. Une approche de la radiosité par voxels, application à la synthèse d’images. PhD thesis, Doctorat de l’Université d’Auvergne, 2006. [CM06] P . Chatelier and R. Malgouyres. A low complexity discrete radiosity method. Computer and Graphics, 30(1) :37–45, 2006. [CM07] P. Chatelier and R. Malgouyres. A fast interpolation method to represent the BRDF in global illumination. In Grapp 2007, 2nd International Conference on Computer Graphics Theory and Applications, pages 5– 12, Barcelona, Spain, March 2007. [CMS98] F. Castro, R. Martinez, and M. Sbert. Quasi monte-carlo and extended first shot improvements to the multi-path method. In Proceedings of the Spring Conference on Computer Graphics ’99, pages 91–102, Budimerce, Slovakia, 1998. [CNR92] M. Cosnard, M. Nivat, and Y. Robert. Algorithmique parallèle. Masson, Paris, 1992. [CS99] F. Capello and J.P. Sansonnet. Architectures parallèles, solutions. Technical Report ARCH7, H1100_11_1999, Laboratoire de recherche en informatique LRI et Université Paris Sud, Orsay, 1999. [CT82] L.R. Cook and E.K. Torrance. A reflectance model for computer graphics. ACM Transactions on Graphics, 1(1) :7–24, 1982. [CT86] L.R. Cook and E.K. Torrance. Stochastic sampling in computer graphics. ACM Transactions on Graphics, 5(1) :51–72, 1986. [CT93] M. Cosnard and D. Trystram. Algorithmes et architectures parallèles. InterEditions, Paris, 1993. BIBLIOGRAPHIE [CT97] 146 S. Coorg and S. Teller. Real-time occlusion culling for models with large occluders. In Proceedings of the 1997 symposium on Interactive 3D graphics, pages 83–ff, Rhode Island, United States, 1997. [Dam01] C. Damez. Simulation globale de l’éclairage pour des séquences animées prenant en en compte la cohérence temporelle. PhD thesis, Doctorat de l’Université Joseph Fourier, Grenoble, 2001. [DBB03] P. Dutré, P. Bekaert, and K. Bala. Advanced global Illumination. A K Peters, 2003. [DDP97] F. Durand, G. Drettakis, and C. Puech. The visibility skeleton : A powerful and efficient multi-purpose global visibility tool. In SIGGRAPH 97 Conference Proceedings, Annual conference series, pages 89–100, New York, NY, USA, 1997. [DDP99] F. Durand, G. Drettakis, and C. Puech. Fast and accurate hierarchical radiosity using global visibility. ACM Transactions on Graphics, 18(2) :128–170, 1999. [Deg92] G. Deghilage. Architectures et programmation parallèles. Addison- Wesley, France, 1992. [DHS04] C. Damez, N. Holzschuch, and F. Sillion. Space-time hierarchical radiosity with clustering and higher-order wavelets. Computer Graphics Forum, 23(2) :129–141, 2004. [dR94] J. de Rumeur. Communications dans les réseaux de processeurs. Masson, 1994. [DR95] I. Debled-Rennesson. Reconnaissance des droites et plans discrets. PhD thesis, Doctorat de l’Université Louis Pasteur, 1995. [Fes98] F. Feschet. Techniques d’imagerie pour l’aide au positionnement en dosimétrie conformationnelle. PhD thesis, Doctorat de l’Université de Lyon 2, Lyon, 1998. [FF97] V.D. Foley and H. Feiner. Computer graphics - principles and practice, 2nd edition in C. Addison Wesley, 1997. [Fle84] C.A.J. Fletcher. Computational galerkin methods. Springer Verlag, 1984. BIBLIOGRAPHIE [Fly66] 147 M.J. Flynn. Very high speed computing systems. Proceedings IEEE, 54(12) :1901–1909, 1966. [FMP98] F. Feschet, S. Miguet, and L. Perroton. Parlist : a parallel data structure for dynamic load balancing. Journal of Parallel and Distributed Computing, 51(2) :114–135, 1998. [FP93] M. Feda and W. Purgathofer. Progressive ray refinement for monte carlo radiosity. In Proceedings of the 4th Eurographics Workshop on Rendering, pages 15–26, Paris, France, Juin 1993. [FSGS04] S. Frenz, M. Schoettner, R. Goeckelmann, and P. Schulthess. Parallel ray-tracing with a transactional DSM. In IEEE International Symposium on Cluster Computing and the Grid, pages 475–481. IEEE Computer Society, 2004. [Fun96] T.A. Funkhouser. Coarse-grained parallelism for hierarchical radiosity using group iterative methods. In ACM SIGGRAPH ’96 proceedings, pages 343–352, New Orleans, August 1996. [FY97] C. Feng and S. Yang. A parallel hierarchical radiosity algorithm for complex scenes. In Proceedings of the IEEE symposium on Parallel rendering, pages 71–77, Arizona, United States, 1997. [Gar99] R. Garmann. On the partitionability of hierarchical radiosity. In Proceedings of the 1999 IEEE symposium on Parallel Visualization Graphics, pages 69–78, California, United States, 1999. [Gas66] N. Gastinel. Analyse numérique linéaire. Hermann, 1966. [GBD+ 94] A. Geist, A. Beguelin, J. Dongarra, B. Manchek W. Jiang, and V. Sunderam. Pvm : Parallel virtual machine - a user’s guide and tutorial for network parallel computing. Technical report, MIT Press, Cambridge, Mass, 1994. [GH96] S. Gibson and R.J. Hubbold. Efficient hierarchical refinement and clustering for radiosity in complex environments. Computer graphics forum, 15(5) :297–310, 1996. [GHLL+ 98] W. Gropp, S. Huss-Lederman, A. Lumsdaine, E. Lusk, B. Nitzberg, W. Saphir, and M. Snir. MPI : The Complete Reference (Vol. 2). MIT Press, 1998. BIBLIOGRAPHIE [GL97] 148 W. Gropp and E. Lusk. Why are PVM and MPI so different ? In Proceedings of the 4th European PVM/MPI Users’ Group Meeting on Recent Advances in Parallel Virtual Machine and Message Passing Interface, pages 3–10, London, UK, 1997. [GL02] W. Gropp and E. Lusk. Goals guiding design : PVM and MPI. In Cluster Computing, 2002. Proceedings. 2002 IEEE International Conference, pages 257–265, 2002. [Gla89] A. Glassner. An introduction to ray tracing. Morgan Kauffmann, 1989. [GLDS96] W. Gropp, E. Lusk, N. Doss, and A. Skjellum. A high-performance, portable implementation of the MPI message passing interface standard. Parallel Computing, 22(6) :789–828, 1996. [GLS99] W. Gropp, E. Lusk, and A. Skjellum. Using MPI : Portable Parallel Programming with the Message-Passing Interface. MIT Press, 1999. [Gou71] H. Gouraud. Continuous shading of curved surfaces. IEEE transactions on computer, c20(6) :623–629, 1971. [Gou05] M. Gouiffès. Apports de la couleur et des modèles de réflexion pour l’extraction et le suivi de primitives. PhD thesis, Doctorat de l’Université de poitiers, 2005. [GRS92] C. Germain-Renaud and J.P. Sansonnet. Les ordinateurs massivement parallèles. Armand Colin, Paris, 1992. [GRS95] P. Guitton, J. Roman, and G. Subrenat. Implementation results and analysis of a parallel progressive radiosity. In Proceedings of the IEEE symposium on Parallel rendering, pages 31–38, Atlanta, Georgia, United States, April 1995. ACM Press. [GSCH93] S.J. Gortler, P. Schröder, M.F. Cohen, and P. Hanrahan. Wavelet radiosity. In Proceedings of the 20th annual conference on Computer graphics and interactive techniques, pages 221–230, 1993. [GTGB84] C. Goral, E. Torrance, D. Greenberg, and B. Bataille. Modeling the interaction of light between diffuse surfaces. Computer Graphics (ACM SIGGRAPH’84 Proceedings), 18(3) :213–222, 1984. [GUD96] M. Gengler, S. Ubéda, and F. Desprez. Initiation au parallélisme. Masson, Paris, France, 1996. BIBLIOGRAPHIE [GWS04] 149 J. Guenther, I. Wald, and P. Slusallek. Realtime caustics using distributed photon mapping. In Rendering Techniques 2004, Eurographics Symposium on Rendering, pages 21–23, Norrkoping, Sweden, 2004. [Han02] O. Hansen. On the stability of the collocation method for the radiosity equation on polyhedral domains. IMA Journal of Numerical Analysis, 22 :463–479, 2002. [Han03] O. Hansen. On the properties of the radiosity equation near corners. PAMM, 2(1) :414–415, 2003. [HCA00] N. Holzschuch, F. Cuny, and L. Alonso. Wavelet radiosity on arbitrary planar surfaces. In 11th Eurographics Workshop on Rendering, pages 161–172, Brno, Czech Republic, June 2000. [HDSD99] J.M. Hasenfratz, C. Damez, F. Sillion, and G. Drettakis. A practical analysis of clustering strategies for hierarchical radiosity. Computer Graphics Forum (Proc. of Eurographics ’99), 18(3) :221–232, 1999. [HS92] P. Hanrahan and D. Saltzman. A rapid hierarchical radiosity algorithm for unoccluded environments. In Photorealism in Computer Graphics, Eurographics seminar series, 1992. [HSA91] P. Hanrahan, D. Saltzman, and L. Aupperle. A rapid hierarchical radiosity algorithm for unoccluded environments. Computer Graphics, 25(4) :197–206, 1991. [HW91a] E.A. Haines and J.R. Wallace. Shaft culling for efficient ray-cast radiosity. In Proceedings of 2nd Workshop on Rendering, pages 122–138, 1991. [HW91b] P. Heckbert and J. Winget. Finite element methods for global illumination. Technical Report UCB/CSD 91/643, Computer Science Division, University of California Berkeley, 1991. [JC95a] H.W. Jensen and N.J. Christensen. Efficiently rendering shadows using the photon map. In Compugraphics ’95, pages 285–291, 1995. [JC95b] H.W. Jensen and N.J. Christensen. Photon maps in bidirectional monte carlo ray tracing of complex objects. Computer and Graphics, 19(2) :215– 224, 1995. BIBLIOGRAPHIE [Jen95] 150 H.W. Jensen. Importance driven path tracing using the photon map. In P.M. Hanrahan and W. Purgathofer, editors, Rendering Techniques ’95, pages 326–335. Springer-Verlag, 1995. [Jen96] H.W. Jensen. Rendering caustics on non-lambertian surfaces. In Graphics Interface ’96, pages 116–121, Toronto, Canada, 1996. [Kel96] A. Keller. Quasi-monte carlo radiosity. In Eurographics workshop on Rendering techniques, pages 101–110, Porto, Portugal, 1996. SpringerVerlag. [Kel97] A. Keller. Instant radiosity. In 24th annual conference on Computer graphics and interactive techniques, pages 49–56, 1997. [KH95] M.J. Keates and R.J. Hubbold. Interactive ray tracing on a vir- tual shared-memory parallel computer. Computer Graphics Forum, 14(4) :189–202, 1995. [KM99] J. Kautz and M.D. McCool. Interactive rendering with arbitrary BRDFs using separable approximations. In International Conference on Computer Graphics and Interactive Techniques ACM SIGGRAPH 99, page 253, New York, NY, USA, 1999. [Kok93] A.J. Kok. Grouping of patches in progressive radiosity. In Proceedings of the Fourth Eurographics Workshop on Rendering, pages 221–231, Paris, France, 1993. [Kre89] R. Kress. Linear integral equations. Springer Verlag, 1989. [Lar04] B.D. Larsen. Real-time global illumination by simulating photon mapping. PhD thesis, Technical University of Denmark, 2004. [Lei91] F.T. Leighton. Introduction to Parallel Algorithms and Architectures : Arrays, Trees, Hypercubes. Morgan Kaufmann publishers, USA, 1991. [LP00] L. Leblanc and P. Poulin. Guaranteed occlusion and visibility in cluster hierarchical radiosity. In Eurographics Workshop on Rendering 2000, pages 89–100, June 2000. [LW94] E.P. Lafortune and Y.D. Willems. A theoretical framework for physically based rendering. Computer Graphics Forum, Special Issue on Rendering, 13(2) :97–107, 1994. BIBLIOGRAPHIE [Mal02a] 151 R. Malgouyres. Algorithmes pour la synthèse d’images et l’animation 3D. Dunod, Paris, 2002. [Mal02b] R. Malgouyres. A discrete radiosity method. In Discrete Geometry for Computer Imagery, pages 428–438, Bordeaux, France, April 2002. Springer, Berlin, Germany. [MB98] D. Meneveaux and K. Bouatouch. Parallel hierarchical radiosity for complex building interiors. Technical Report 3425, Rapport de recherche INRIA, mai 1998. [MB99] D. Meneveaux and K. Bouatouch. Synchronisation and load balancing for parallel hierarchical radiosity of complex scenes on a heterogeneous computer network. Computer Graphics Forum, 18(4) :201–212, 1999. [MBM97] D. Meneveaux, K. Bouatouch, and E. Maisel. Memory management schemes for radiosity computation in complex environments. Technical Report RR-3149, Inria, 1997. [MBSB03] D. Meneveaux, K. Bouatouch, G. Subrenat, and P. Blasi. Efficient clustering and visibility calculation for global illumination. In AFRIGRAPH’2003 Proceedings, pages 87–94, Le Cap, Afirque du sud, February 2003. [Men98] D. Meneveaux. Simulation d’éclairage dans des environnements architecturaux complexes : approches séquentielle et parallèle. PhD thesis, Doctorat de l’Université de Rennes I, 1998. [Mig92] S. Miguet. Redistribution élastique pour équilibrage de charge en imagerie. Masson, Paris, 1992. [MMM+ ] N. MacDonald, E. Minty, J. Malard, T. Harding, S. Brown, and M. Antonioletti. Writing message-passing parallel programs with MPI. Technical Report Course notes, Version 1.8.2, Edinburgh Parallel Computing Centre, University of Edinburgh. [MP97] S. Miguet and J.M. Pierson. Heuristics for 1D rectilinear partitioning as a low cost and high quality answer to dynamic load balancing. In Proceedings of the International Conference and Exhibition on HighPerformance Computing and Networking, pages 550–564, Berlin/New York, 1997. Springer Verlag. BIBLIOGRAPHIE [MR92] 152 S. Miguet and Y. Robert. Elastic load balancing for image processing algorithms. In H.P. Zima, editor, Parallel Computation, LNCS 591, pages 438–451. Springer Verlag, 1992. [MRR+ 53] N. Metropolis, A.W. Rosenbluth, M.N. Rosenbluth, A.H. Teller, and E. Teller. Equations of state calculations by fast computing machines. Chemical Physics, 21(6) :1087–1091, 1953. [Muu] M.J. Muuss. Towards real-time ray-tracing of combinatorial solid geometric models. In BRL-CAD Symposium 95. [Neu95] L. Neumann. Monte carlo radiosity. Computing, 55(1) :23–42, 1995. [NN85] T. Nishita and E. Nakamae. Continuous tone representation of threedimensional objects taking account of shadows and interreflection. Computer Graphics (ACM SIGGRAPH’85 Proceedings), 19(3) :23–30, 1985. [NPG03] M. Nijasure, S. Pattanaik, and V. Goel. Interactive global illumination in dynamic environments using commodity graphics hardware. In Proceedings of the 11th Pacific Conference on Computer Graphics and Applications, page 450. IEEE Computer Society, 2003. [Nus28] W. Nusselt. Graphische bestimmung des winkelverhaltnisses bei der warmestrahlung. In VDI Z, page 72 :673, 1928. [Pac95] P.S. Pacheco. A user’s guide to MPI. Technical report, University of San Francisco, 1995. [Pac96] P. Pacheco. Parallel programming with MPI. Morgan Kaufmann publishers, 1996. [PB94] S.N. Pattanaik and K. Bouatouch. Fast wavelet radiosity method. Computer Graphics Forum, 13(3) :407–420, 1994. [PBMH02] T.J. Purcell, I. Buck, W.R. Mark, and P. Hanrahan. Ray tracing on programmable graphics hardware. Computer Graphics Forum, Special Issue on Rendering, 21(3) :703–712, 2002. [Pho75] B.T. Phong. Illumination for computer generated pictures. Communication of the ACM, 18(6) :311–317, 1975. [PMS+ 99] S. Parker, W. Martin, P.J. Sloan, P. Shirley, B. Smits, and C. Hansen. Interactive ray tracing. In Interactive 3D Graphics (I3D), pages 119–126, April 1999. BIBLIOGRAPHIE 153 [Pér91] B. Péroche. Les images de synthèse. Hermès, Paris, 1991. [RAH07] D. Roger, U. Assarson, and N. Holzschuch. Whitted ray-tracing for dynamic scenes using a ray-space hierarchy on the GPU. In Rendering Techniques 2007 (Proceedings of the Eurographics Symposium on Rendering), pages 99–110, Grenoble, France, June 2007. the Eurographics Association. [RAPP97] L. Renambot, B. Arnaldi, T. Priol, and X. Pueyo. Towards efficient parallel radiosity for DSM-based parallel computers using virtual interfaces. In Proceedings of the IEEE symposium on Parallel rende- ring, pages 79–86, Phoenix, Arizona, United States, October 1997. ACM Press. [Rev91] J.P. Reveillès. Géométrie discrète, calcul en nombres entiers et algorithmique. PhD thesis, Doctorat de l’Université Louis Pasteur, 1991. [RF98] L. Renambot and D. Figuls. Convergence analysis for a parallel radiosity algorithm using virtual interfaces. In Proceedings of the Second Eurographics Workshop on Parallel Graphics and Visualisation, 1998. [RGG90] R. Recker, D. George, and D. Greenberg. Acceleration techniques for progressive refinement radiosity. In Proceedings of the 1990 symposium on Interactive 3D graphics, pages 59–66, Utah, United States, 1990. [RP98] J. Rappaz and M. Picasso. Introduction à l’analyse numérique. Presses internationales polythechniques, 1998. [RR97] C. Renaud and F. Rousselle. Fast massively parallel progressive radiosity on the mp-1. Parallel Computing, 23(7) :899–913, 1997. [RS97] J. Richard and J.P. Singh. Parallel hierarchical computation of specular radiosity. In Proceedings of the IEEE symposium on Parallel Rendering, pages 59–69, Arizona, United States, 1997. [SAG94] B. Smiths, J. Arvo, and D. Greenberg. A clustering algorithm for radiosity in complex environments. In Proceedings of the 21st annual conference on Computer graphics and interactive techniques, pages 435–442, New York, NY, USA, 1994. BIBLIOGRAPHIE [Sbe93] 154 M. Sbert. An integral geometry based method for fast form-factor computation. Computer Graphics Forum (Eurographics’93), 12(3) :409–420, 1993. [Sed01] R. Sedgewick. Algorithmes en langage C. Dunod, Paris, 2001. [SGL94] J. Pal Singh, A. Gupta, and M. Levoy. Parallel visualization algorithms : performance and architectural implications. IEEE Computer, 27(7) :45– 55, 1994. [SH92] R. Siegel and J.R. Howell. Thermal radiation heat transfer, 3rd Edition. Hemisphere Publishing Corporation, New York, NY, 1992. [SH00] F. Sillion and J.M. Hasenfratz. Efficient parallel refinement for hierarchical radiosity on a DSM computer. In Third Eurographics Workshop on Parallel Graphics and Visualisation, pages 61–74, Girona, Spain, 2000. [Shi02] P. Shirley. Fundamentals of computer graphics. A K Peters Ltd, 2002. [SK01] N. Stolte and A. Kaufman. Novel techniques for robust voxelization and visualization of implicit surfaces. Graphical Models, 63(6) :387–412, 2001. [SM03] P. Shirley and R.K. Morley. Realistic ray tracing. A K Peters Ltd, 2003. [SNSS97] M. Stamminger, W. Nitsch, P. Slusallek, and H.P. Seidel. Isotropic clustering for hierarchical radiosity - implementation and experiences. In Proceedings of the Fifth International Conference in Central Europe on Computer Graphics and Visualization (WSCG ’97), pages 534–542, Plzen, Tcheque Republique, 1997. [SP94] F.X. Sillion and C. Puech. Radiosity and global illumination. Morgan Kaufmann publishers, California, 1994. [SPNP96] M. Sbert, X. Pueyo, L. Neumann, and W. Pergathofer. Global multipath monte carlo algorithms for radiosity. The Visual Computer, 12(2) :47–61, 1996. [SWS02] J. Schmittler, I. Wald, and P. Slusallek. Saarcor - a hardware architecture for ray tracing. In Proceedings of the conference on Graphics Hardware, pages 27–36, Saarbruecken, Germany, 2002. Eurographics Association. [Tan91] M. Tanenbaum. Structured computer organization. Prentice Hall, 1991. BIBLIOGRAPHIE 155 [Tan05] A. Tanenbaum. Architecture de l’ordinateur. Pearson Education, 2005. [Tel93] P. Tellier. Synthèse d’image réaliste : simulation d’éclairage intérieur et extérieur mixte (naturel et artificiel). PhD thesis, Doctorat de l’Université de Rennes 1, 1993. [TH93] S. Teller and P. Hanrahan. Global visibility algorithms for illumination computations. In Proceedings of the 20th annual conference on Computer graphics and interactive techniques, pages 239–246, 1993. [TNSP98] R.F. Tobler, L. Neumann, M. Sbert, and W. Purgathofer. A new form factor analogy and its application to stochastic global illumination algorithms. In In Rendering Techniques ’98 (Proceedings of Eurogra- phics Rendering Workshop), pages 35–44, New York, NY, USA, 1998. Springer-Verlag. [Vea94] E. Veach. Bidirectional estimators for light transport. In Fifth Eurographics Workshop on Rendering, pages 147–162, Darmstadt, Germany, 1994. [VG97] E. Veach and L.J. Guibas. Metropolis light transport. In Turner Whitted, editor, SIGGRAPH 97, pages 65–76. Addison Wesley, August 1997. [VP92] A. Varshney and J.F. Prins. An environment-projection approach to radiosity for mesh-connected computers. In Proceedings of the Third Eurographics Workshop on Rendering, pages 271–281, Bristol, England, 1992. [Wal04] I. Wald. Realtime Ray Tracing and Interactive Global Illumination. PhD thesis, Saarland University, 2004. [War92] G. Ward. Measuring and modeling anisotropic reflection. In Proceedings of the 19th annual conference on Computer graphics and interactive techniques, pages 265–272, New York, NY, USA, 1992. [WD96] D.W. Walker and J.J. Dongarra. Message passing interface forum. MPI : A message-passing interface standard. Supercomputer, 12(1) :56–68, 1996. [Whi80] T. Whitted. An improved illumination model for shaded display. Source Communications of the ACM, 23(6) :343–349, 1980. BIBLIOGRAPHIE [WRC88] 156 G.J. Ward, F.M. Rubinstein, and R.D. Clear. A ray tracing solution for diffuse interreflection. In 15th annual conference on Computer graphics and interactive techniques SIGGRAPH ’88, volume 22, pages 85– 92. ACM press, 1988. [WSB01] I. Wald, P. Slusallek, and C. Benthin. Interactive distributed ray tracing of highly complex models. In 12th Eurographics Workshop on Rendering Techniques, pages 277–285. Springer Verlag, 2001. [YIY97] Y. Yu, O.H. Ibarra, and T. Yang. Parallel progressive radiosity with adaptive meshing. Journal of Parallel and Distributed Computing, 42(1) :30–41, 1997. [Zat93] H.R. Zatz. Galerkin radiosity : a higher order solution method for global illumination. In International Conference on Computer Graphics and Interactive Techniques, pages 213–220, New York, NY, USA, 1993. [ZCFM06] R. Zrour, P. Chatelier, F. Feschet, and R. Malgouyres. Parallelization of a discrete radiosity method. In Euro-Par, volume 4128, pages 740–750, 2006. [ZFM06] R. Zrour, F. Feschet, and R. Malgouyres. Parallelization of a dis- crete radiosity method using scene division. In Grid computing, highperformAnce and Distributed Applications, volume 4276, pages 1213– 1222, 2006.