• Aucun résultat trouvé

Nous avons présenté, dans ce chapitre, quatre opérations possibles pour pouvoir changer le sens de stockage des arrays qui sont notre structure des données de base pour les images. Nous avons présenté également trois approches possibles à leurs implémentations.

Il s’agit de l’algorithme 6.1 qui définit, à travers de la fonction trRot2D, un algorithme travaillant élément par élément et implémentant la définition de ces opérations. Le deuxième algorithme que nous avons présenté était l’algorithme 6.2 qui définit, à travers la fonction trRot2DMB, un algorithme tra- vaillant avec le découpage de l’array d’entrée en macro blocs et qui exécute les opérations localement à l’intérieur de chacun de ceux-ci élément par élément mais qui exécute la même opération également à l’échelle des macro blocs. Le troisième algorithme, l’algorithme 6.6, qui définit, à travers la fonction trRot2DMBSIMD, un algorithme qui travaille en utilisant les macro blocs mais qui emploie à l’intérieur de ceux-ci les instructions spécialisées des architectures multimédia – les fonctions shuffle.

Le dernier algorithme sera le plus utile dans les applications morphologiques que nous allons décrire par la suite car il réduit le temps nécessaire pour le changement de stockage des images. Les résultats expérimentaux présentés dans la tab. 6.1 démontrent bien son utilité par rapport aux implémentations naïves qui travaillent par la définition et implémentent, en effet, l’algorithme trivial 6.1.

Dans nos explications pour 2D, nous nous sommes spécifiquement concentrés sur les macro blocs de taille 8 × 8. Cela pour la bonne raison que les architectures des ordinateurs qui s’installent sur le marché grand public sont, en effet, les architectures de 64 bits (Intel IA-64, AMD64, SuperH SHmedia) et nous pouvons voir directement les aspects applicatifs de nos algorithmes pour ces architectures. Pour démon- trer que ce sujet est d’un intérêt majeur pour les application, nous pouvons citer les articlesLee00, LFB01

qui traitent d’un sujet connexe (ils sont focalisés sur l’architecture Intel IA-64) mais qui ne sont pas directement orientés vers un changement du sens de stockage des image pour un traitement SIMD.

L’approche macro bloc élément par élément peut également trouver son emploi lors d’un travail avec des images plus grandes que les mémoires caches de l’architecture cible. Dans ce cas précis, il serait avantageux pour un meilleur emploi de la mémoire cache de travailler par macro blocs et de combiner, sur les architectures multimédia, l’approche de découpage en macro blocs plus grands que la taille des registres avec l’approche SIMD à l’intérieur des registres.

Algorithmes de voisinage

dépendant du sens prédéfini de parcours de l’image

Les algorithmes travaillant sur le voisinage et dont le traitement dépend du sens de parcours de l’image forment un autre groupe d’algorithmes de la morphologie mathématique. En effet, nous pouvons y classer tous les algorithmes qui utilisent la propagation d’une valeur dans un sens défini. De ce point de vue, les algorithmes les plus naturels de ce travail sont ceux qui calculent la fonction distance1.

Dans les applications destinées au traitement en temps réel, nous nous intéressons aux fonctions distance qui peuvent nous rendre une approximation de la distance le plus rapidement possible. De ce point de vue, nos cibles prioritaires seront les algorithmes des fonctions distances non-euclidiennes. Ces algorithmes, comme on le verra par la suite, utilisent des techniques particulières pour le traitement et elles sont transposables également au traitement SIMD des images sur les architectures multimédia.

L’approche que l’on va décrire ne se restreindra pas seulement aux fonctions distances. D’autres types d’algorithmes peuvent être implémentés suivant la même approche. Les opérations morphologiques qui peuvent en bénéficier sont représentées par la reconstruction morphologique (cf. livreSoi03de référence)

et par tous les algorithmes dérivées de cette dernière. Nous nous consacrerons dans ce chapitre plus particulièrement aux nivellements qui sont des filtres morphologiques d’une importance cruciale pour les applications de filtrage et de segmentation d’images.

7.1 Particularité du sens du parcours pour le traitement SIMD du voisinage

Dans les traitements qui n’utilisent pas l’approche vectorielle et, par conséquent, n’exploitent pas le parallélisme des données à l’échelle d’un registre, les sens du parcours plus que classiques sont ceux qui parcourent l’image en sens vidéo et anti-vidéo, bien connus des algorithmes d’évaluation de la fonction distance chamfer. La figure 7.1 illustre cette situation.

Le calcul standard des fonctions distance approximatives est assuré par les méthodes qui décom- posent le kernel en deux parties et le calcul en deux parcours (vidéo et anti-vidéo) et sont appelées les distances chamfer. Formellement, nous pouvons décrire les parcours complets par la composition de deux fonctions p1et p2:

parcours ar = p1 ◦ p2 $ ar

Ces types de parcours nous offrent la propagation des valeurs, à l’échelle des pixels, en deux axes en même temps. Donc, l’avantage de cette approche pour le calcul de la fonction distance est, sans aucun doute, dans l’utilisation de seulement deux parcours de l’image entière.

fs t snd fs t snd Parcours pV Parcours pAV

FIG. 7.1 : Décomposition du kernel en deux parties et en deux parcours de l’image lors de l’évaluation des fonctions distance chamfer. L’exemple d’élément structurant pour le 4-voisinage et la grille carrée.

De plus, certaines architectures matérielles dédiées à la morphologie mathématique implémentent ces algorithmes en utilisant le stockage local de plusieurs lignes vidéo, on parle des lignes à retard. Les éléments du voisinage local d’une partie du kernel décomposé est extrait à partir de ces lignes par des mécanismes standards de l’extraction du voisinage.

Ayant à disposition des architectures avec les capacités SIMD, nous nous demandons comment pro- fiter du parallélisme de données pour ces traitements. Et nous nous apercevons que le fait d’utiliser les parcours vidéo et anti-vidéo, qui étaient présentés comme avantageux pour le traitement à l’échelle des pixels, devient gênant pour les traitements à l’échelles des vecteurs paquetés. Il est, en effet, extrêmement coûteux d’effectuer la propagation d’une valeur élément par élément à l’intérieur d’un vecteur paqueté, surtout à cause du non-support d’un tel traitement par les jeux d’instructions multimédia1.

Pourtant, le traitement à l’échelle des vecteurs paquetés peut utiliser la force du calcul SIMD. C’est pourquoi nous n’allons pas utiliser le parcours vidéo ou anti-vidéo directement mais nous les diviserons en quatre phases en total. Dans chacune des phases, nous allons utiliser une direction de propagation différente et nous allons travailler à l’échelle des vecteurs paquetés. La figure 7.2 illustre cette situation. Nous pouvons y percevoir la différence entre le traitement à l’échelle des éléments de base, q.v. fig. 7.2(a), et le traitement à l’échelle des vecteurs paquetés, q.v. fig. 7.2(b). La dernière figure montre également de quelle manière on regroupe les éléments de l’image dans les vecteurs paquetés. Notons que l’axe de vectorisation est, dans les quatre phases, perpendiculaire au sens du parcours. Le kernel du calcul est également décomposé en quatre parties, chacune d’elles à utiliser dans une phase différente. La formule suivante

parcours ar = pD ◦ pC ◦ pB ◦ pA $ ar

décrit formellement ce procédé. Notons que l’ordre d’application de ces phases, comme présenté par la formule précédente, n’est qu’une possibilité parmi d’autres. Il existe, en effet, quatre manières d’ordon- ner les phases et nous pouvons les utiliser dans les algorithmes ayant la même structure de fonctionne- ment que la fonction distance :

parcours ar = (pD ◦ pC) ◦ (pB ◦ pA) $ ar

= (pD ◦ pC) ◦ (pA ◦ pB) $ ar

= (pC ◦ pD) ◦ (pB ◦ pA) $ ar

= (pD ◦ pC) ◦ (pA ◦ pB) $ ar

La problématique de la vectorisation a déjà été discutée dans la section dédiée au paquetage et dépa- quetage des données (cf. 4.4.3, page 68). En pratique, l’axe de vectorisation est choisi comme identique à celui de stockage des données dans la mémoire. Ce qui veut dire que deux (pAet pD) des quatre phases

de la propagation SIMD sont applicables directement comme présenté ci-dessus. Pour pouvoir appliquer l’approche SIMD dans les deux phases restantes (pB et pC), nous devons faire appel aux techniques de 1 Nous nous basons sur les jeux d’instructions que nous avons pu consulter – Intel IA-32 (MMX, SSE, SSE2, SSE3) et

fst snd fst snd fst snd fst snd

Parcours pA Parcours pB Parcours pC Parcours pD

(a)Travail avec les éléments de base

fst snd fst snd fst snd fst snd

Parcours pA Parcours pB Parcours pC Parcours pD

Vecteur paqueté

Vecteur paqueté

Vecteur

paqueté Vecteurpaqueté

(b)Travail SIMD avec les vecteurs paquetés

FIG. 7.2 : Décomposition du kernel en quatre parties et en quatre parcours de l’image. L’exemple d’élément

structurant pour le 4-voisinage et la grille carrée.

changement de l’axe de stockage des données. Il s’agit des techniques présentées dans le chapitre 6, page 127, et nous allons utiliser la transposition par diagonale en particulier.

Ceci dit, les deux phases de propagation (pBet pC) dont l’orientation est parallèle à l’axe de stockage

des données dans la mémoire (l’axe snd dans ce cas) vont faire appel à la transposition de l’image dans la mémoire. Après cette transposition, les données avec lesquelles nous voulons travailler seront prêtes pour le traitement par les instructions SIMD. En même temps, le sens du parcours que nous devons utili- ser lors de travail avec ces données transposées ne sera pas celui appliqué aux données originaires, il doit également être transposé. Après l’application d’un kernel, nous devons faire appel à une deuxième trans- position pour obtenir les données orientées dans le bon sens. La fig. 7.3 illustre cette idée sur l’exemple de la phase pBpour laquelle les données, après être transposées, utilisent le même sens de parcours que

celui de la phase pA. Formellement, nous pouvons décrire ce procédé par la formule suivante :

pB $ ar = tD ◦ pA ◦ tD $ ar

Suivant la même idée, nous pouvons dériver également la formule pour le calcul de la phase pC qui

utilisera pour les données transposées, le même sens de parcours que la phase pD

pC $ ar = tD ◦ pD ◦ tD $ ar

Si nous assemblons toutes ces idées, nous pourrons construire un schéma global de fonctionnement qui sera utilisé lors du travail avec les données paquetées. Formellement, nous pouvons écrire :

parcours ar = pD ◦ pC ◦ pB ◦ pA $ ar

= pD ◦ (tD ◦ pD ◦ tD) ◦ (tD ◦ pA ◦ tD) ◦ pA $ ar

= pD ◦ tD ◦ pD ◦ (tD ◦ tD) ◦ pA ◦ tD ◦ pA $ ar

fst snd Parcours pB Vecteur paqueté fst snd Application de la transposition par diagonale Vecteur paqueté

+

=

fst snd Parcours pA Vecteur paqueté fst snd

+

Vecteur paqueté Application de la transposition par diagonale

FIG. 7.3 : Remplacement de la propagation SIMD en direction parallèle au sens du stockage par les trans- positions par diagonale de l’array et par l’application de la propagation en sens perpendiculaire à l’axe de vectorisation. L’exemple d’élément structurant pour la grille carrée et le 4-voisinage.

où la dernière ligne présente le schéma après l’élimination de la double transposition qui est redondante. Dans le cas où les données sont paquetées d’une façon différente de celle présentée sur la fig. 7.3, les formules analogiques peuvent être construites en reflétant ce sens de paquetage particulier.