Talk abstract
From LRDE
Line 1: | Line 1: | ||
− | This is a property of type [[Has type:: |
+ | This is a property of type [[Has type::Text]]. |
Latest revision as of 17:08, 6 January 2014
This is a property of type Text.
S
Dans cet exposé je présenterai la bibliothèque d'algorithmes
géometriques CGAL. Cette bibliothèque C++ fournit des algorithmes
comme le calcul d'enveloppes convexes, de triangulations, en 2D,
3D... J'illustrerai surtout les problèmes de robustesse numériques que
l'on y rencontre, puis je détaillerai les solutions que l'on utilise
pour les résoudre de manière efficace. Elles sont basées sur plusieurs
types d'arithmétique: arithmétique d'intervalles et
multiprécision. Ces différentes techniques sont combinées dans
l'implementation grâce à la généricité du code (template C++), ce qui
produit à la fois un code efficace, compact, et proche des concepts
mathématiques, donc plus facilement prouvable. +, Dans cet exposé, nous présenterons la bibliothèque d'algorithmes de
morphologie mathématique Morph-M. Cette bibliothèque C++ fournit un
grand nombre de fonctions en traitement d'image (arithmétiques,
colorimétrique...) et en morphologie mathématique (filtrage,
segmentation, graphes etc.). Nous discuterons principalement des
concepts proposés par la bibliothèque, et leurs utilisations dans la
mise en oeuvre de nouveaux algorithmes. Nous illustrerons les
potentialités par quelques algorithmes actuellement implémentés dans
cette bibliothèque. Enfin nous discuterons des inconvénients de
l'approche générique. +
Dans cet exposé nous verrons l'ensemble des outils de la plate-forme
Qgar, avec une attention particulière pour la généricité et les
performances du code de la bibliothèque QgarLib. Nous verrons
également les autres composants du logiciel, quelques standards de
développement Qgar, ainsi que les défis pour l'évolution de la
plate-forme. +
Separation of concerns is the idea of breaking down a program into
encapsulated pieces that overlap in functionality as little as
possible. Encapsulated entities, such as classes, methods or modules,
are more manageable, easier to test and maintain, and may be reused
more easily than a large, entangled program. A cross-cutting concern
is something that cannot be encapsulated using normal abstraction
mechanisms, thus defeating separation of concerns. A classical example
of this is logging (e.g., logging calls and returns to a file while
the program is running) - the logging code needs to be added to every
applicable method in the program. The logging code for each method may
be almost identical, creating an undesirable overlap in
functionality. Aspects let a programmer implement a cross-cutting
concern as a separate entity, through advice (how a concern should be
implemented) and join points (where it should be implemented). I will
give an introduction to aspect-orientation and aspect languages, and
also talk a bit about domain-specific aspect languages. +, Context-oriented Programming allows one to modularize a software
system using partial class and method definitions organized into
layers. Layers are composed into or out of the system depending on the
context apparent during program execution. The basic concept of layers
as partial program definitions has been suggested before, but with our
approach we extend this idea by the notion of dynamically scoped layer
activation, resulting in a viable approach for expressing
context-dependent behavior. We will discuss the basic language
constructs for Context-oriented Programming, the development of
non-trivial examples, implementation issues, especially with regard to
retaining efficient method dispatch, integration with the CLOS
Metaobject Protocol, and if time permits, advanced topics like
ContextL's reflective facilities for controlling layer activation and
deactivation. +
Mouldable programming is about looking at programs as mouldable
fragments of code, not as the static, brittle syntax software often
turns out to be. Some simple examples follow. The notation for calling
a method "push" which adds an element "E" to a stack "S" can be OO or
static method style, it can modify "S" or return the new stack
etc. Can we simplify usage to just one form, and mould it to the
actual call? A function which breaks down for some input can signal
this using return flags, special return values, or exceptions, to name
some common ways. Can we abstract over this, and mould to the relevant
error handling technique? Often we need to do run-time checking of
arguments, e.g., array indexing bounds, forcing us to introduce lots
of code to deal with the unwanted cases. Can we use mouldable ideas to
simplify the code? In the presentation, we will elaborate on such
examples, discussing how we can free us from awkward syntactic
constraints. +, Writing code in an abstract, high-level style can cut development time
and make code more maintainable and easier to reason about - but at
the cost of lower run-time performance. For performance-critical
applications, such as in numerical programming, this can render modern
abstraction techniques infeasible. Fortunately, code that is easy for
humans to reason about is also easier to reason about
automatically. We're studying different abstraction mechanisms and
generative programming techniques, as well as optimization techniques
to produce efficient code for them. As an example, basic element-wise
operations on arrays may be expressed in terms of high-level
operations, which may be automatically combined in order to increase
performance. I will present some of the things we've been working on
so far, and some of the ideas we have for the future. +
L'algorithmique constructive permet, partant d'une spécification écrite
sous forme d'une combinaison non-efficace de fonctions, de dériver, sous
certaines conditions, des algorithmes parallèles efficaces. Cette dérivation
s'appuie sur des théorèmes d'équivalence de programmes et est formellement
correcte. Elle aide le programmeur à concevoir des programmes parallèles.
Toutefois les bibliothèques de squelettes proposées ne sont pas certifiées.
Dans le cadre d'une collaboration avec l'université de Tokyo, nous proposons
de cibler des squelettes algorithmiques développés en BSML et certifiés à
l'aide de l'assistant de preuve Coq. +, Nous présenterons BSML (Bulk Synchronous Parallel ML), un langage de
programmation de haut-niveau pour machines parallèles, ainsi que des
exemples classiques de parallélisme implémentés dans ce langage. Nous
complèterons cette présentation par une étude comparative des coûts
théoriques de ces algorithmes réalisée sur la grappe de PC du LACL. +
Les besoins croissants en puissance de calcul exprimés par de nombreux
domaines scientifiques exercent une pression très forte sur les
architectures émergentes, les rendant toujours plus performantes mais
toujours plus complexes à maîtriser. Dans ce cadre, le développement
d'outils tirant parti des spécificités de ces architectures (quadri-
et bientôt octo-coeurs, processeurs Cell ou GPU par exemple) devient
une gageure car allier expressivité et efficacité est une tâche
ardue. Les travaux exposés ici montrent comment l'utilisation de la
programmation générative, et en particulier de la méta-programmation
template, permet de répondre au problème de performances et
d'abstractions.
Nous montrerons comment ces techniques ont permis de développer Quaff,
un outil de placement automatique d'applications data-flow sur des
cibles variées comme les clusters, les multi-coeurs ou le processeur
Cell. +, Dans cet exposé je présenterai le modèle bulk-synchronous parallelism (BSP)
des algorithmes et architectures parallèles, ainsi qu'un tour d'horizon des
domaines d'application du parallélisme. BSP propose une vue unifiée des
principaux paramètres de la performance des algorithmes parallèles et de
leur adéquation sur les architectures multi-processeur, multi-coeur et leurs
réseaux de communication interne. Il permet une analyse portable et
extensible des performances ce qui permet d'éviter les principaux pièges de
l'informatique parallèle: mauvaise granularité, réseau mal adapté,
déséquilibres. +
Dans un intergiciel schizophrène, une représentation intermédiaire
des interactions entre composants applicatifs est construite et
manipulée. Cette représentation est neutre vis-à-vis du choix d'une
personnalité application (interface entre les composants et
l'intergiciel) et d'une personnalité protocolaire (interface entre
intergiciels distants). Elle rend possible le découplage entre ces
deux aspects.
Cette représentation doit préserver la structure des données associées
aux interactions. Cependant, sa construction in extenso s'avère coûteuse
dans le cas de données composites complexes. Cette conversion peut être
économisée en remplaçant la réplication complète de la structure par la
définition d'un emballage « fantôme » autour de celle-ci (et de chacun
de ses composants) : il suffit que cet emballage fournisse les accesseurs
permettant de parcourir la structure et de construire un message la
représentant.
Après avoir présenté un exemple concret de représentation neutre
des données structurées, nous montrons comment cette optimisation
peut être mise en oeuvre pour réaliser de manière efficace la
fonction de représentation dans un intergiciel schirophrène. Nous
concluons cette discussion par une évaluation du gain de performance
ainsi obtenu. +, Le langage Ada est connu pour sa sûreté intrinsèque : son typage fort,
ses mécanismes de contrôle de valeurs et son système d'exceptions notamment
permettent d'avoir une grande confiance en les programmes. Comme dit
le vieux proverbe, « En Ada, quand ça compile, ça marche ».
Cependant, une des puissances d'Ada provient également de ses systèmes
de vérification lors de l'exécution du programme. Par exemple, si une
valeur se trouve en dehors de l'intervalle qui lui était autorisé, une
exception, rattrapable par le langage, sera automatiquement levée. Ce
système de vérification dynamique a bien évidemment un coût. Nous verrons
comment le système de compilation GNAT mélange analyse statique et
vérification lors de l'exécution pour fournir la totalité des
garanties définies par le langage tout en minimisant les surcoûts et
la perte de performance. +
L'outil BTL++ (Benchmark Template Library in C++) développé à EDF R&D se
fonde sur la programmation générique et permet de mesurer les performances
de noyaux de calcul intensif. Il s'agit d'une bibliothèque générique dont
la conception vise à faciliter l'extensibilité par l'utilisateur.
Récemment, le lien entre les mesures de performance et la génération
automatique de bibliothèques optimales à été étudié pour le domaine de
l'algèbre linéaire dense. Quelques mesures de performance de noyaux de
calcul à base d'"Expression Template" permettront d'illustrer l'usage de
l'outil BTL++. +, La multiplication des architectures HPC (CPU multi-coeurs, GPU, Cell,..)
implique autant de spécialisations des codes de calcul intensif. Dans un
contexte industriel, les codes de calcul multi-cibles posent alors des
problèmes de maintenance et d'évolutivité importants. La génération
automatique des spécialisations est une réponse à ces problématiques. Pour
le domaine de l'algèbre linéaire, nous étudions les possibilités offertes
par la programmation générique. La mise au point d'une bibliothèque
générique multi-cible et performante constitue le sujet de départ d'une
thèse dédiée aux méthodes de développement HPC qui minimisent l'adhérence
aux machines cibles. +
JoCaml est une extension d'Objective Caml pour la programmation
concurrente et distribuée, inspirée par le join-calcul. Nous avons
récemment publié une nouvelle version de JoCaml, dont la compatibilité
avec OCaml est meilleure que celle de la version initiale de F. Le
Fessant. La nouvelle version pourra facilement être mise à jour au
rythme d'OCaml et est binaire-compatible avec OCaml.
L'exposé s'attachera plus au langage JoCaml qu'au système JoCaml. Il
montrera comment, à partir d'un programme potentiellement
parallélisable écrit en OCaml (le ray tracer du concours ICFP 2001),
on peut facilement produire un programme distribué, dans le cas
abordé, très efficace. Ce sera l'occasion d'aborder la programmation
en JoCaml de la coordination de multiples agents coopérants, d'une
manière simple et concise dans l'esprit de la programmation
fonctionnelle.
JoCaml est disponible en http://jocaml.inria.fr/. +, ReactiveML est une extension d'OCaml basée sur le modèle réactif
synchrone introduit par F. Boussinot au début des années 90. Il permet
la programmation de systèmes tels que les jeux vidéo ou les
simulateurs.
Dans cet exposé, je présenterai ReactiveML à travers l'utilisation et
la programmation de rmltop, le pendant ReactiveML du toplevel
d'OCaml. Ce toplevel permet au programmeur d'écrire interactivement
des programmes ReactiveML qui sont typés, compilés et exécutés à la
volée. Toute expression ReactiveML valide peut être chargée dans le
toplevel et a la même sémantique et la même efficacité que sa version
compilée. +
Je présenterai sur la base d'une démo une application des extensions
de langages, à savoir une extension Java pour l'optimisation. Cet
exemple montre la mise en oeuvre concrète dans Eclipse, les gains de
productivité et de qualité obtenus par rapport aux approches
classiques Java+DSL, la différence entre cette approche et un
générateur de code ou un préprocesseur. Il montre également une
utilisation originale d'un compilateur: la génération automatique
d'interface graphique.
Je parlerai aussi des futurs projets d'Ateji dans le domaine des
extensions de langage. +, Dans cet exposé je présenterai un outil, appelé Tom, qui permet de
simplifier la programmation d'outils de manipulation et de
transformation de structures arborescentes, telles que les AST
(Abstract Syntax Trees) ou les documents XML par exemple.
Tom est un langage de programmation qui ajoute à Java des
constructions inspirées du calcul de réécriture et des langages à
base de règles. On peut, de manière approximative, voir Tom comme une
intégration d'un sous-ensemble de Caml dans Java.
Le langage repose sur trois notions fondamentales :
(i) les termes, qui sont un modèle universel permettant de
décrire des structures arborescentes, et en particulier les notions de
programmes et de preuves.
(ii) les règles, qui permettent de décrire de manière expressive des
transformations.
(iii) les stratégies, qui permettent de contrôler l'application des
règles.
La séparation transformation-contrôle est un point essentiel
permettant de rendre les règles indépendantes de leur contexte
d'utilisation, facilitant ainsi leur écriture, leur réutilisation et
l'établissement de propriétés.
Le Langage Tom est parfaitement adapté à la réalisation d'outils de
transformation et de prouveurs. Son intégration dans Java rend son
utilisation facile, aussi bien dans le milieu académique que dans le
milieu industriel. +
Si une fonction φ promet de manipuler une valeur de type α sans
l'observer, on peut utiliser son code sans risque pour toutes les
affectations possibles de α : que la valeur soit entière (α = int) ou
qu'elle soit un arbre (α = tree), la fonction se comportera
toujours de façon identique. Cette propriété s'appelle le polymorphisme
paramétrique, l'essence de la généricité.
Promettre de ne pas observer de trop près son argument est un fardeau
parfois insupportable pour une fonction, pour des raisons
algorithmiques (comment prendre une décision sans savoir ce que vaut
mon argument ?), ou encore pour des raisons de performances de
bas-niveau (si je sais que α = int, je peux utiliser une primitive
dédiée de mon processeur). Même si le type d'une valeur est caché
derrière un type plus abstrait α, on peut fournir des mécanismes pour
« le redécouvrir » grâce à des tests dynamiques ou à des raisonnements
purement statiques. La propriété qui permet de diriger son calcul par
la forme des types est appelée le polymorphisme intentionnel.
Dans cet exposé, nous présenterons plusieurs versions du
polymorphisme intentionnel offertes par différents systèmes de types
et de preuves sûrs (c'est-à-dire garantissant que les programmes
ne peuvent pas planter et sont corrects vis-à-vis de leur spécification). +
SmartEiffel, également connu sous le nom de GNU Eiffel, est à la fois
un langage et un ensemble d'outils de compilations, de documentation et
de validation.
Le langage SmartEiffel vise à favoriser la mise en pratique des
principales exigences liées au développement d'un gros logiciel par
une grande équipe. En plus d'exigences en terme de qualité, de
sécurité et de documentation, la définition de SmartEiffel est
également soucieuse de l'efficacité du programme à l'exécution. Ainsi,
le modèle des objets qui est à la base du langage intègre également
les types les plus élémentaires sans surcoût potentiel à l'exécution.
Pour sa part, le mécanisme de programmation par contrats qui est
essentiel en matière de documentation est également un bon moyen de
rechercher les meilleures performances à l'exécution.
Durant cet exposé, la visite guidée du langage présentera le modèle
d'objets, la programmation par contrats, la double forme d'héritage
multiple ainsi que le mécanisme des agents. +, Lisaac est un petit langage basé sur la technologie objet à base de
prototype. Plus flexible que l'objet à base de classe, elle permet un
dynamisme et un degré d'expressivité encore inégalés. Lisaac est
inspiré du langage Self pour les concepts d'objets à prototypes et du
langage Eiffel, pour les aspects d'ingénierie logicielle et notamment
pour la programmation par contrat. Enfin, l'objectif étant de
réaliser de la programmation de bas niveau à l'aide d'un langage de
haut niveau, un ensemble de concepts utiles à la programmation système
a été ajouté.
Le langage Lisaac utilise un nombre particulièrement restreint
d'idiomes orthogonaux rendant difficile l'élaboration d'un compilateur
efficace. Son compilateur en fait aujourd'hui l'unique langage à
prototype compilé. Les performances atteintes sont proche des
compilateurs C, voire même au-delà...
Pour étayer, approfondir et illustrer nos propos, nous ferons un
rapide tour d'horizon du développement du système d'exploitation
IsaacOS entièrement écrit en Lisaac.
Durant cet exposé, nous aborderons les thèmes suivants: concept à
prototype versus concept à classe; héritage multiple et dynamique et
autres particuliarité du Lisaac; technique de compilation et résultat
de performance; validation des concepts avec une brève présentation du
système d'exploitation IsaacOS. +
La Low-Level Virtual Machine (LLVM) est un ensemble de bibliothèques
et d'outils qui facilitent le développement et l'optimisation de
compilateurs, de générateurs de code et de machines virtuelles. Clang
et VMKit utilisent LLVM pour leur générateur de code à différents
niveaux: l'un pour la compilation statique de langages de la famille C
(C/C++/ObjectiveC), et l'autre pour la compilation dynamique
d'applications Java ou .Net.
Dans cet exposé, je présenterai ces trois projets, et rentrerai dans
les détails de VMKit, que j'ai développée dans le cadre de ma
thèse. Je finirai par montrer les exemples de recherche auxquels
nous nous adressons avec l'aide de VMKit, au sein de l'équipe de
recherche INRIA/Regal. +, Avec l'avènement du Web et des applications réparties, les machines
virtuelles applicatives sont devenues le support d'exécution de choix
pour la plupart des applications. Développer et optimiser une machine
virtuelle est un travail long et difficile qui requiert plusieurs
années. Il s'avère que la plupart des machines virtuelles possèdent
des composants communs: compilateur à la volée, ramasse-miettes,
vérifieur de type, gestionnaire de threads, gestionnaire
d'entrées/sorties, éditeur de liens paresseux, chargeur dynamique de
code.
AutoVM est une machine virtuelle générique qui factorise ces
composants communs et facilite le développement de nouvelles machines
virtuelles, ou l'amélioration de machines virtuelles existantes.
Dans cet exposé, je présenterai l'architecture logicielle de notre
prototype AutoVM et montrerai sa généricité et son extensibilité. +
Nous décrirons brièvement l'état de l'art de l'utilisation des processeurs graphiques grand public (GPU) pour accélérer le traitement d'image, et nous en discuterons les limites. Puis, nous décrirons GpuCV, une bibliothèque logicielle libre et multi-plateforme pour accélérer par GPU les opérateurs de traitement d'image et de vision artificielle. GpuCV a été conçue pour être compatible avec la bibliothèque OpenCV et permettre d'intégrer facilement des opérateurs accélérés sur GPU dans des applications développées sur CPU. L'environnement GpuCV gère de façon transparente les caractéristiques du matériel, la synchronisation des données, l'activation à bas niveau des procédures GLSL ou CUDA, l'étalonnage et l'aiguillage vers la mise en oeuvre la plus performante et finalement offre un ensemble d'opérateurs de traiement accélérés par GPU. +
Malgré la grande variété des types de données que l'on rencontre dans
le domaine du traitement d'images (1D,2D,3D, scalaires, couleurs,
multi-spectrales, séquences, etc...), nous sommes souvent amenés à
appliquer des algorithmes très classiques, ou des variations de ces
algorithmes, pour le pré-traitement, l'analyse ou la visualisation de
ces données images. Par conséquent, les logiciels et les bibliothèques
que nous utilisons dans notre recherche quotidienne, devraient
également être génériques, afin de s'adapter le mieux possible aux
données à traiter. Dans ce séminaire, je présenterai quelques outils
développés dans cette optique (au laboratoire GREYC, équipe IMAGE),
qui possèdent différents niveaux d'utilisations. Je commencerai tout
d'abord par présenter CImg, une bibliothèque C++ "template" (donc
générique par nature), qui a pour but de faciliter l'implémentation
d'algorithmes de traitements d'images personnalisés. Puis,
j'introduirais G'MIC, un langage de script reprenant la plupart des
éléments de CImg, qui est dédié au traitement et à l'analyse d'images
"de tous les jours". J'essaierai de montrer comment ces différents
outils indépendants sont organisés et comment ils cherchent à aider le
chercheur ou le programmeur en traitement d'images, autant d'un point
de vue programmation pure que d'un point de vue plus haut niveau. +
Le processeur CELL BE développé par le consortium IBM, Sony et Toshiba
a eu un impact important dans le monde du calcul scientifique mais
aussi dans le monde du jeu. Il est le processeur de base de la
première machine à avoir atteint 1 Pflops et aussi celui de la Play
Station 3 de Sony. Pour arriver à ce niveau de performance, il intègre
9 coeurs hétérogènes interconnectés par un bus. Le coeur principal
(PPE) appartient à la famille des PowerPC. Les 8 autres coeurs (SPE)
sont spécialisés pour le calcul. Après une présentation détaillée de
l'architecture du processeur, nous développerons son mode de la
programmation : lancement de threads de calcul sur les SPE, échange de
données, programmation SIMD. +, La méthode multipôle rapide (Fast Multipole Method, FMM) permet de
résoudre en temps linéaire le problème à N-corps, en astrophysique ou
en dynamique moléculaire par exemple. Nous présentons ici
l'implémentation sur le processeur Cell du calcul du champ proche de
la FMM, ce qui constitue un premier pas vers une implémentation
complète de la FMM sur ce processeur. Nous détaillerons les problèmes
rencontrés, au niveau de l'architecture comme au niveau de
l'algorithmique, ainsi que les diverses optimisations mises en
place. Notre implémentation permet de calculer jusqu'à 8,5 milliards
d'interactions par seconde (115,8 Gflop/s) sur un processeur Cell, et
jusqu'à 17 milliards d'interactions par seconde sur un IBM QS20 (230,4
Gflop/s), pour des distributions uniformes ou non uniformes de
particules. +
Dans cet exposé, nous présenterons Yayi, une bibliothèque générique de
traitement morphologique d'image. Cette base logicielle, écrite en C++
et interfacée avec Python, fournit un nombre croissant de fonctions en
traitement d'image et en morphologie mathématique (distance,
segmentation, etc.). Nous discuterons de la mise en oeuvre générale,
des concepts génériques utilisés dans la bibliothèque, et de leurs
utilisations dans l'élaboration de nouveaux algorithmes. Enfin, nous
présenterons quelques pistes actuellement en développement dans Yayi
pour adresser certains des problèmes levés par la programmation
générique. +
Ce séminaire porte sur certains de mes travaux en matière de
généricité et réutilisation en traitement d'images. Ces travaux sont
présentés à une échelle algorithmique, bas-niveau, et à une échelle
logicielle, plutôt haut-niveau. À l'échelle de l'algorithme, nous
présentons une technique permettant d'étendre la généricité des
algorithmes de traitement d'images par rapport à la région d'intérêt
traitée, en complément de la généricité par rapport aux données
(1D, 2D, 3D, scalaires, couleurs, multi-spectrales, séquences,
etc.) Cette méthode repose sur une adaptation du patron de
conception « Iterator » et sur le polymorphisme de compilation en
C++. Au niveau logiciel, l'objectif de la généricité et de
réutilisation est de faciliter le couplage des algorithmes « purs »
avec des fonctionnalités supplémentaires telles que la visualisation,
l'interface homme-machine, les entrées-sorties... Dans ce cas, je
présente les principes d'une architecture flexible et évolutive
implémentée en C++, combinant la notion de (programmation par) rôle et
la notion de (programmation par) composants réutilisables. Ces travaux
sont illustrés par des applications dans le domaine médical. +, L'une des caractéristiques de la programmation objet est l'intégration
(introduite par Eiffel dans un article de la première conférence OOPSLA en
1986) entre les mécanismes d'héritage, permettant de structurer clairement
la description des systèmes, et de généricité, permettant le paramétrage de
ces descriptions. La combinaison de ces deux techniques d'architecture est
la clé de l'extensibilité et de la réutilisabilité permises par la
technologie objets. L'exposé montrera l'interaction entre la généricité et
l'héritage en Eiffel et l'application de ces concepts aux tâches d'analyse,
de conception et d'implémentation en génie logiciel. De nombreux exemples
illustreront l'application de ces idées, et compareront avec les solutions
adoptées dans des langages tels que Java et C\#. +
La plupart des frameworks de traitement d'images ne sont pas assez
génériques pour garantir une réutilisabilité effective des structures
de données et des algorithmes, tout en préservant performances et
facilité d'utilisation, et en restant proche de la théorie. Dans
cette présentation, nous proposons un cadre logiciel pour le
traitement d'images centré sur le paradigme de programmation
générique, cherchant à répondre tant aux besoins pratiques que
théoriques des scientifiques et des développeurs : la mise au point de
méthodes rapides et réutilisables, un niveau de généricité progressif,
la possibilité de traiter des ensembles de données volumineux, une
gestion de la mémoire automatique et efficace, la vérification
statique des types, l'orthogonalité des structures de données et des
algorithmes, etc. Cette approche permet aux utilisateurs de concevoir
et d'implémenter de nouvelles méthodes délivrées des contraintes
habituellement imposées pas les outils logiciels, de pratiquer des
expériences inter-domaines, de généraliser certains résultats et de
transformer facilement des prototypes en de vraies applications. +, Les Diagrammes de Décision (DDs) forment une vaste famille de
structures de données, qui permettent de représenter et manipuler très
efficacement de grandes quantités d'informations. Cependant, parmi les
nombreux types de DDs, l'utilisateur est souvent désemparé pour
choisir le bon. Souvent, aucun type ne répondant exactement à ce qu'il
cherche, l'utilisateur doit faire adapter ses données au type de DDs
choisi.
Le problème est que chaque type de DDs possède sa propre
définition. Il n'existe aucun socle commun qui permette de définir
n'importe quel type de DD. Ce problème se reflète au niveau des
opérations manipulant les DDs. Celles-ci sont aussi spécifiques à
chaque type.
Cet exposé présente les Polymorphic Decision Diagrams, un cadre assez
général permettant de spécifier de nombreux types de DDs
existants. L'utilisateur peut ainsi décrire simplement les DDs
correspondant le mieux aux données qu'il souhaite représenter. Ce
cadre permet de plus d'ajouter dans la spécification les informations
qui permettront de retrouver les performances des types définis
jusqu'à présent. Un exemple concret impliquant des loutres permettra
de montrer les possibilités offertes par ce cadre. +
Le traitement d'images est par nature un procédé discret, au cours
duquel un signal continu est décomposé en un ensemble de pixels, ou de
voxels pour des images tri-dimensionnelles. Au niveau géométrique, cette
nature discrète pose peu de problèmes, car la plupart des opérations
géométriques sont indépendantes de la grille sous-jacente ; au niveau
topologique, le problème est tout autre. Deux des notions fondamentales
de la topologie, le voisinage et la connexité, sont radicalement
différentes entre un espace continu et un espace discret : il est entre
autres impossible de subdiviser un voisinage discret de façon infinie
comme c'est le cas dans un espace euclidien.
Bien que certaines bibliothèques de traitement d'images contiennent des
algorithmes topologiques, notamment de squelettisation, le type de
voisinage utilisé par ces algorithmes est généralement fixé par le code,
ce qui empêche une adaptation facile à un autre type de connexité ou à
un espace de dimension différente.
Ce séminaire présente une méthode générique pour intégrer les notions
discrètes de voisinage et de connexité à une bibliothèque de traitement
d'images programmée en C++. Je montrerai également comment obtenir de
façon simple un algorithme de squelettisation homotopique en utilisant
ces notions. +, Le projet BrainVISA (http://brainvisa.info) est en train de
développer, avec le soutien du projet européen HiPiP
(http://hipip.eu), une architecture générique pour la parallélisation
des applications. Cette architecture fournira un accès à divers moyens
de calculs (fermes de stations de travail, clusters, centres de
calculs, etc.) en s'appuyant sur des solutions existantes pour la
gestion des ressources (Sun Grid Engine, Condor, LSF, etc.) Cette
architecture est développée pour répondre aux besoins croissants de
moyens de calcul dans le monde de la recherche en neuroimagerie.
Au cours de ce séminaire, j'aborderai rapidement le contexte de la
recherche en neuroimagerie en me focalisant sur les besoins en
parallélisation d'applications. Ensuite, je détaillerai la solution
que nous avons choisie pour répondre à ces besoins. +