• Aucun résultat trouvé

3.2.1 Implantation

Dans la précédente partie, nous avons analysé l’impact des optimisations logicielles et ma-térielles pour l’implantation d’un filtre FIR3. Nous allons maintenant étudier l’implantation de deux filtres FIR en cascade, qui pose comme problème l’interfaçage du cicuit avec la mémoire. Si l’on reprend le modèle producteur-consommateur (3.1) pour le filtre FIR3, la version de base (Reg) est un opérateur qui consomme 3 entrées pour produire 1 sortie. En dotant cet opérateur d’un état interne (ici un registre à décalage implanté en C sous la forme d’un tableau statique, nous obtenons la version Rot qui consomme 1 entrée pour produire 1 sortie.

Rot3 Reg3

FIGURE3.1 – modèle producteur-consommateurpour le FIR3 : versions Reg et Rot

Le fragment de code 3.1 présente la version Rot du FIR3. Le point important est que la boucle de la ligne 12 qui réalise la rotation des valeurs du registre à décalage est synthétisée de manière optimale, comme le ferait un concepteur VHDL : la sémantique de la boucle est comprise par Catapult-C qui la fait disparaitre pour laisser place en RTL à une copie registre à registre.

Autre point important : dans tous les codes, les boucles sont systématiquement totalement déroulées (loop unwinding), ce qui évite de devoir faire des benchmarks supplémentaires pour savoir si Catapult-C déroule bien les boucles courtes. L’autre raison est que dans la liste des options d’optimisation de Catapult-C, il faut choisir entre faire du déroulage de boucle (partiel ou total) et du pipeline logiciel. Comme il a été montré dans le chapitre 1, le pipeline logiciel est un facteur essentiel de la performance. Nous avons donc choisi de dérouler manuellement toutes les boucles (sur les coefficients) et de laisser au compilateur le soin de réaliser le pipeline logiciel (l’inverse aurait été très difficile à réaliser).

1 uint8 fir3(uint8 x, int input, sint8 b0, sint8 b1, sint8 b2) {

2 static uint8 RD[3]; // registre a decalage

3 uint8 y8;

4 sint16 y16;

5 sint16 round = 1<<7; // 0.5 en virgule fixe Q8

6 int i; int k=3; // taille du FIR

3.2. OPTIMISATION DE L’IMPLANTATION DE DEUX FILTRES FIR EN CASCADE 31 8 if(input<k) { 9 // prologue 10 RD[input] = x; 11 return x; 12 } else {

13 // rotation du registre à decalage

14 for(i=k-1 i>0; i--) { RD[i] = RD[i-1]; } 15 RD[k] = x;

16 } 17

18 // calcul du filtre (version totalement deroulee)

19 y16 = b0 * RD[0] + b1 * RD[1] + b2 * RD[2] + round;

20 y8 = (uint8) (y16>>8);

21 return y8; 22 }

Prog 3.1– filtre fir3_rot.c

Dans la suite, nous faisons l’hypothèse que les tableaux X (pour la source), Y (pour la des-tination) et T (pour le stockage temporaire) ont tous une taille de N = 1024 éléments 8 bits (Fig. 3.2). Il y a trois principales façons de cascader deux opérateurs (indépendamment du fait d’utiliser des opérateurs optimisés ou non) :

– cascade d’opérateurs : le premier opérateur consomme toutes les données du tableau X en entrée et produit toutes les données du tableau T en sortie, puis le second opérateur consomme tout le tableau T en entrée pour finalement produire tout le tableau Y (algo. 5). – pipeline d’opérateurs : le premier opérateur consomme un point du tableau X en entrée et produit 1 point en sortie dans une FIFO, ce point est alors consommé par le second opérateur qui produit un point dans le tableau Y en sortie, puis le premier opérateur consomme un second point et ainsi de suite (algo. 6).

– fusion d’opérateurs : le pipeline d’opérateur est remplacé par un opérateur unique qui est équivalent aux deux précédents (algo. 7).

Algorithme 5:deux FIR3 filters en cascade avec un tableau temporaire T for i = 0 to n − 1 do 1 x ← X[i], y1← F1(x), T [i] ← y1 2 for i = 0 to n − 1 do 3 x ← T [i], y2← F2(x), Y [i] ← y2 4

Algorithme 6:deux filtres FIR3 pipelinés for i = 0 to n − 1 do

1

x ← X[i], y1← F1(x), y2← F2(y1), Y [i] ← y2 2

D’un point de vue compilation le pipeline d’opérateurs correspond à une fusion de boucles (réalisable par un compilateur), tandis que la fusion de filtres correspond véritablement à une

32 CHAPITRE 3. FILTRAGE NON RÉCURSIF

Algorithme 7:deux filtres FIR3 fusionnés soit un FIR5 for i = 0 to n − 1 do

1

x ← X[i], y ← F2(F1(x)), Y [i] ← y

2

fusion d’opérateurs (impossible pour un compilateur) telle que nous l’avons décrite précédem-ment : comme le point clé est d’éviter les accès à des cases de tableaux, il est important de réaliser une scalarisation complète et de supprimer l’accès intermédiaire. De plus le tableau in-terne du nouvel opérateur (implanté sous forme de registre à décalage) doit avoir la bonne taille (ici 5, car ce sont deux filtres identiques de taille 3 qui sont fusionnés). Le pipeline de deux filtres en version Reg aurait été très proche : au lieu d’avoir une FIFO d’une case, il y en aurait eu 3 (la taille du filtre) et il aurait fallu en plus réaliser une rotation des valeurs. Cela aurait été fait avec un buffer circulaire.

X Rot3 T Rot3 Y

X Rot3 Rot3 Y

X Rot5 Y

fifo

FIGURE3.2 – trois versions de deux filtres FIR cascadés : deux filtres indépendants avec une mémoire temporaire T (haut), deux filtres avec une FIFO de 1 point (milieu) et deux filtres fusionnés (bas)

3.2.2 Résultats et analyse

La table 3.6 résume l’ensemble des résultats de manière synthétique en faisant la moyenne des surfaces et des énergies pour des fréquences de synthèse allant de 200 à 800 MHz par pas de 200 MHz.

Les chiffres présentés pour la cascade de deux filtres ne prennent pas en compte la surface et la consommation du tableau temporaire T afin d’être cohérents avec les résultats précédents où surfaces et consommations des tableaux en entrée et en sortie n’étaient pas non plus pris en compte. Or une mémoire en 65 nm de 1024 cases 8 bits a une consommation moyenne de 14 pJ/point et une surface d’environ 15000 µm2, c’est à dire une surface deux fois supérieure à celle du plus grand circuit et une consommation égale au pire cas (mode auto). Cela justifie de supprimer les stockages temporaires et de pipeliner les opérateurs via une FIFO, lorsque cela est possible.

Si l’on regarde l’évolution des performances des différentes versions pipelines (configu-ration best E, les optimisations matérielles (mémoire SP, mémoire DP et 3 mémoires SP) per-mettent d’obtenir des énergies de 9.89 puis 8.11 et enfin 5.55 pJ/point soit un gain d’un facteur

3.2. OPTIMISATION DE L’IMPLANTATION DE DEUX FILTRES FIR EN CASCADE 33

mémoire SP SR RW DP 3×SP SP SP SP RW DP optimisation Reg Reg Reg Reg Rot LU LU LU

un filtre FIR3 surface(bestS) 4237 4266 4562 4949 4458 6120 6240 7027 surface(bestE) 4671 4751 5957 7537 5047 10692 11038 12294 energie(bestS) 11.68 12.08 12.54 13.80 11.92 28.24 28.49 26.18 energie(bestE) 6.52 6.62 5.47 3.41 1.99 14.07 14.47 10.61 ii(bestE) 3 3 2 1 1 3 3 2

cascade de deux filtres FIR3

surface(bestS) 6393 6482 6542 7498 6574 9913 10155 11155 surface(bestE) 8711 9206 10797 10360 7370 15828 16895 16237 energie(bestS) 12.88 13.11 13.95 12.86 8.79 24.18 25.05 19.93 energie(bestE) 7.56 5.87 4.34 6.69 2.82 15.79 16.45 10.89

ii(best E) 3 3 2 3 1 3 3 2

pipeline de deux filtres FIR3

surface(bestS) 5888 5943 6207 6543 5715 9625 10039 10400 surface(bestE) 7619 7547 8639 12385 9317 18329 19086 20726 energie(bestS) 20.05 21.78 21.33 23.28 23.11 64.54 65.56 66.98 energie(bestE) 9.98 10.03 8.11 5.55 3.65 21.31 22.08 17.42 ii(best E) 3 3 2 1 1 3 3 2 mémoire SP SR RW DP 5×SP SP SP SP RW DP optimisation Reg Reg Reg Reg Rot LU LU LU

fusion de deux filtres FIR3 = un filtre FIR5

surface(bestS) 5563 5619 5683 7121 5990 17968 17563 17330 surface(bestE) 6056 6198 7670 12513 8189 26913 28100 30441 energie(bestS) 22.11 22.72 19.89 27.23 22.01 107.03 107.13 118.48 energie(bestE) 13.74 14.05 10.52 5.59 3.19 48.21 50.98 34.14

ii(bestE) 5 5 3 1 1 5 5 3

TABLE3.6 – FIR moyenne des surfaces et des énergies

×1.8 : le recours à de la mémoire entrelacée est efficace. La rotation de registres fait mieux d’un facteur ×1.5 supplémentaire pour atteindre 3.65 pJ/point. Au final, SP+Rot apporte un gain d’un facteur total de ×5.5 pour une augmentation de surface de seulement 58 % par rapport à la version de base.

Si l’on compare la version fusion à la version pipeline, la version SP+Rot gagne sur les deux aspects : une surface plus petite (8189 µm2soit seulement ×1.47 fois plus que la plus petite sur-face possible) et une énergie plus petite (3.19 pJ/point soit ×6.9 fois moins).

On pourra aussi remarquer les performances des Catapult-C quant à la maîtrise de la sur-face en mode auto : 5563 µm2 pour le FIR5 SP+Reg contre 4237 µm2 pour le FIR3 SP+Reg. Si l’on analyse maintenant les résultats d’un point de vue de la vitesse (de la valeur de ii), les optimisations matérielles et logicielles permettent toutes les deux d’atteindre la cadence de 1 cycle par point (comme pour le FIR3).

Au final, la configuration SP+Rot est meilleure que 3 × SP +Reg. Ainsi les optimisations lo-gicielles l’emportent (encore) sur les optimisations matérielles. Par contre le mieux est l’ennemi du bien : le Loop Unrolling n’est jamais efficace : cpp, énergie et surface sont très élevés !

34 CHAPITRE 3. FILTRAGE NON RÉCURSIF

3.3 Evaluation de l’impact des transformations pour les processeurs