• Aucun résultat trouvé

VI. Prédiction neuronale pour la reconfiguration dynamique de systèmes sur puce

VI.4. Système reconfigurable au niveau des applications

VI.4.2. Architecture SystemC du codeur entropique

Les travaux effectués dans le cadre de la modélisation SystemC du codeur entropique focalisent sur les aspects architecturaux de conception au niveau système. L’évaluation de la performance de cette architecture est effectuée en mesurant le nombre de cycles d’exécution.

Le codeur entropique du standard JPEG 2000 est l'étape la plus complexe en termes de traitement. En effet, cette phase utilise une grande quantité d'information durant l’exécution de plusieurs opérations présentant un caractère séquentiel. L’aspect séquentiel des traitements complique la tâche qui vise la modélisation d’une architecture parallèle du codeur. Notre but se résume à concevoir une architecture présentant un maximum de parallélisme tout en respectant les contraintes de dépendance qui existent entre les différentes opérations effectuées par le codeur. La validation de cette architecture passe par trois phases qui sont la conception, l’implémentation et le test.

VI.4.2.1. Conception

La phase de conception démarre par une description fonctionnelle détaillée de l’application. Nous commençons l’étape de spécification par la définition d’une entité regroupant un ensemble de bits appartenant à un seul bit-plan. Cette entité appelée ‘stripe’ regroupe tous les bits utilisés par une passe à un instant fixé. Un ‘stripe’ est composé à la fois par quatre lignes de coefficients appartenant à un seul bit-plan. Nous définissons une nouvelle entité appelée ‘stripe étendu’ (Fig. VI.9) composée d’un ‘stripe’ entouré par son voisinage de bits. Le voisinage gauche et droit du stripe est constitué en appliquant le principe du miroir. En revanche, le voisinage bas ainsi que haut est constitué à partir des ‘stripes’ voisins. L’étape d’insertion des voisinages est essentielle pour coder les bits appartenant aux bords gauche, droit, haut et bas du ‘stripe’. Le ‘stripe étendu’ constitue le paquet de communication de base entre les différentes passes.

Fig. VI. 9 : Composition d’un ‘stripe étendu’

Le principe de codage entropique associe à chaque bit appartenant au ‘stripe’ traité trois indicateurs appelés (Pi, Sigma et Sigma bar). En plus des différents ‘stripes’ de données, les modules effectuant les trois passes chargent dans leurs mémoires internes les coefficients associés à chaque bit du ‘stripe’ qui sont le Pi, Sigma, Sigma bar et le signe. Les coefficients Pi, Sigma et Sigma bar sont initialisés à zéro. Les valeurs de ces indicateurs changent après l’exécution de chaque passe.

Nous notons que le traitement des passes sur un ‘stripe’ ne peut être effectué qu’après le chargement des cinq entités (Sigma, Pi, Sigma bar, bit et signe) dans la mémoire interne du module effectuant la passe. L’étape de mise à jour des différents indicateurs est effectuée après l’exécution des trois passes. La figure VI.10 expose le diagramme d’état des traitements effectués par le bloc ‘Coefficients Bit Modeling’.

Largeur bit-plan+2 coefficients Voisinage haut

Voisinage bas

Fig. VI. 10 : Traitement de ‘Coefficient Bit Modeling’

L’étape déterminante dans la phase de conception est l’étude de dépendance entre les différentes tâches qui composent l’architecture du codeur. Cette étude a permis l’extraction des traitements parallèles de l’application. Nous proposons alors de développer une architecture fonctionnant selon le principe du pipeline. Le codage commence par la première passe (passe de signification). Le module traitant cette passe commence par le chargement du premier stripe avec son voisinage (stripe étendu). Après l’achèvement du chargement, le module commence alors les traitements sur les coefficients du premier stripe. Ces traitements génèrent des sorties qui sont interceptées par le module traitant la passe d’affinage. Une fois que le module effectuant la passe de signification ait terminé ses traitements, alors il passe directement au chargement du deuxième stripe. En même temps le module passe d’affinage, qui a terminé le chargement des sorties du premier passe, passe au traitement. Chaque module effectuant soit la passe de signification (passe0), la passe d’affinage (passe1) ou la passe de nettoyage (passe2) effectue deux opérations successives qui sont le chargement (notée chstri) et le traitement (notée trstri) des coefficients du iéme stripe étendu à traiter. Le traitement en pipeline qui caractérise l’architecture développée est représenté par la figure VI.11:

Passe0 chstr1 trstr1 chstr2 trstr2 chstr3 trstr3 chstr4 trstr4 chstr1 trstr1 chstr2 trstr2 chstr3 trstr3 ... Passe1 chstr1 trstr1 chstr2 trstr2 chstr3 trstr3 chstr4 trstr4 chstr1 trstr1 chstr2 trstr2 chstr3 trstr3 Passe2 chstr1 trstr1 chstr2 trstr2 chstr3 trstr3 chstr4 trstr4 chstr1 trstr1 chstr2 trstr2 chstr3

Fig. VI. 11 : Pipeline préliminaire

En considérant ce pipeline, on remarque la présence de deux dépendances non respectées: La première dépendance se résume à l’exécution de l’opération trstr1 de la passe

d’affinage qui s’exécute, dans ce cas, avant l’opération de trstr2 de la passe de nettoyage. En effet le traitement d’un stripe par la passe d’affinage (respectivement par la passe de nettoyage) nécessite le chargement de deux stripes déjà traités par la passe de signification (respectivement par la passe d’affinage). Le deuxième stripe traité sert à mettre à jour le voisinage bas du stripe à traiter.

Coefficient pi Coefficient sigma Coefficient sigma bar Coefficient bit-plan Coefficient signe

Chargement d’un stripe (sigma, sigma bar, signe, pi, bit)

Traitement passe de signification Traitement passe d’affinage Traitement passe de nettoyage Mise à jour (sigma, pi, sigma bar) Stripe

La deuxième dépendance commence avec le traitement du deuxième bit plan. En effet, il faut synchroniser le fonctionnement de ce pipeline de façon à ce que l’on ne commence le traitement du deuxième bit-plan qu’après le traitement de deux stripes du premier bit plan par le passe2. Les informations de sortie du module passe2 servent à mettre à jour les données des coefficients Sigma, Pi et Sigma bar.

Pour rectifier le comportement du pipeline, il faut ajouter une certaine synchronisation entre les tâches indiquées dans la figure VI.11 afin de satisfaire les dépendances de données entre les différentes passes. Cette synchronisation est effectuée en ajoutant des phases d'attente. Le pipeline final déployé est présenté par la figure VI.12:

Passe0 chstr1 trstr1 chstr2 trstr2 chstr3 trstr3 chstr4 trstr4 chstr1 trstr1 chstr2 trstr2 .... Passe1 chstr1 chstr2 trstr1 chstr3 trstr2 chstr4 trstr3 chstr1 trstr4 chstr2 trstr1 Passe2 chstr1 chstr2 trstr1 chstr3 trstr2 chstr4 trstr3 chstr1

Fig. VI. 12 : Pipeline respectant la dépendance des données

Ce pipeline montre l'aspect parallèle qui caractérise le fonctionnement du module de codage ‘Coefficient Bit Modeling’. En effet, dans cette version, toutes les passes fonctionnent simultanément soit en chargement ou en traitement. Le deuxième avantage de cette version c'est que l'on n’est pas obligé d'attendre la fin de traitement du premier bit plan pour commencer le traitement du deuxième. En revanche, le fonctionnement simultané des modules effectuant la passe de signification, la passe d’affinage et la passe de nettoyage entraîne un désordre au niveau des sorties du ‘Coefficient Bit Modeling’. Ce qui implique la nécessité d'ajouter un module supplémentaire qui sert à stocker et réorganiser ces sorties.

Finalement, nous exposons le fonctionnement global des différentes passes (Fig.VI.13) pour charger, traiter et mettre à jour les coefficients des bit-plans d’une image.

Fig. VI. 13 : Diagramme d’état des différentes passes

Le fonctionnement global des différentes passes commence par le chargement d’un ‘stripe étendu’ à partir des différentes mémoires. Le fonctionnement de la passe est fixé selon l’ordre du stripe chargé. Pendant l’étape de mise à jour du voisinage bas, nous remplaçons les coefficients du voisinage du premier ‘stripe étendu’ par la première ligne du deuxième stripe. Pendant l’étape de mise à jour du voisinage haut, nous remplaçons les coefficients du voisinage du deuxième ‘stripe étendu’ par la dernière ligne du premier stripe. Finalement, le

Chargement stripe

Numéro stripe

Premier stripe Dernier Stripe

Traitement dernier stripe Mise à jour voisinage bas

Traitement stripe Mise à jour voisinage haut

module effectuant la passe remplace le premier stripe par le deuxième. La sortie de l’opération de codage est un ensemble de couples (CX, D). Le symbole CX représente le contexte relatif à chaque donnée codée D. Les couples (CX, D) représentent les entrées de l’étape du codage arithmétique.

VI.4.2.2. Implémentation en SystemC

L’architecture du ‘Coefficient Bit Modeling’, effectuant le codage du bit-plan pour servir le codeur arithmétique, est implémentée en utilisant la bibliothèque SystemC [9]. La description est effectuée au niveau comportemental. Ce choix est dû à la richesse de la bibliothèque SystemC au niveau des structures dédiées à la description haut niveau d’architectures embarquées. L’architecture du ‘Coefficient Bit Modeling’ est exposée dans la figure VI.14.

Fig. VI. 14 : Architecture du module ‘Coefficient Bit Modeling ’

L'architecture qui implémente cette version du ‘Coefficient Bit Modeling’ du codeur entropique présente deux grands modules:

Un module représentant les différentes passes du ‘Coefficient Bit Modeling’. Ce sous module comporte huit modules (5 mémoires et 3 modules de traitement). Les mémoires ‘Bit-plan’ et ‘Signe’ stockent respectivement les bit-plans des données et les signes du flux à coder. Les mémoires ‘Sigma’, ‘Sigma bar’ et ‘Pi’ stockent des résultats intermédiaires de codage.

Un module d'organisation des sorties du ‘Coefficient Bit Modeling’ qui se compose de 4 modules (3 mémoires et un module d'arbitrage et de contrôle qui organise le fonctionnement des 3 mémoires). En effet, l’aspect pipeline de l’architecture proposée engendre une perturbation au niveau du flux de sortie binaire de l’étape de codage. Ce module stocke et organise les sorties des différentes passes.