• Aucun résultat trouvé

5.4 Implantations et résultats expérimentaux

6.1.3 Intégration des formules

La SM est une succession d’opérations de courbe qui sont elles-mêmes des successions d’opérations de corps. Les formules, permettant de réaliser les opérations de courbe, doivent donc être intégrées au simulateur. Pour cela, la forme ou représentation statique à affectation unique (ou static single assignment form) (SSA) est utilisée. La représentation SSA impose que chaque variable n’est affectée qu’une seule fois, permettant, entre autres, de détecter plus

facilement les variables non utilisées lors du calcul. Deux structures, nommées line_SSA et SSA, sont créées afin d’adapter les formules, présentes dans [9] pour le simulateur.

La classe line_SSA représente une ligne d’une table SSA pour une variable donnée. Pour cette variable, les arguments d’entrée nécessaires, afin de créer une line_SSA, sont :

— name : le nom de la variable, par exemple c ;

— pred : les deux variables nécessaires pour calculer c, nommées prédécesseurs ; — tag : le type d’opération nécessaire pour calculer c (fadd, fmul, var) ;

— rk : le moment où le calcul s’effectue, nommé rang3([0, 0] par défaut) ; — value : la valeur de c (0 par défaut) ;

— out : si la valeur est une variable de sortie de la formule ou non (faux par défaut). Les prédécesseurs de la ligne sont stockés dans pred sous forme de liste (p. ex. [a,b]). Si la ligne correspond à un opérande du calcul, alors elle n’a pas de prédécesseur. Par conséquent pred s’écrira [ , ] et la valeur de tag sera var. Enfin, la valeur des variables (la variable cor- respondante à la ligne et ses prédécesseurs) n’a pas besoin d’être connue lors de la création d’une line_SSA.

Une ligne SSA est générée avec la commande line_SSA(name, pred, tag, rk, value, out). Comme certains paramètres sont définis avec des valeurs par défaut, la génération d’une ligne SSA peut se faire plus simplement avec la commande line_SSA(name, pred, tag). La figure 6.5 illustre des exemples d’utilisation de la classe line_SSA. Dans ces exemples, les variables t0 et t1 sont créées (aux lignes 1 et 4). Comme t0 et t1 ne possèdent pas de prédécesseur, la valeur de pred et de tag sont respectivement pred = [,] et tag = var. La ligne SSA, correspondante à la variable X = t0 + t1, est ensuite créée à la cinquième ligne. Comme les prédécesseurs de x sont t0 et t1, pred = [t0,t1] et tag = fadd.

Lorsqu’une ligne SSA est créée, elle peut s’intégrer dans une structure nommée SSA qui regroupe plusieurs line_SSA. La classe SSA, qui hérite de la classe line_SSA, représente un

3. Le notion de rang est décrite à la section 6.1.4.

1. sage : t0 = line_SSA(’t0’, [ , ], var)

/* Création d’une ligne SSA

pour la variable t0 */

2. sage : t0.pred

[, ]

3. sage : t0.out

False

4. sage : t1 = line_SSA(’t1’, [ , ], var)

5. sage : X = line_SSA(’X’,[t0,t1], ’fadd’, [0,0], 0, True)

/* Création d’une ligne SSA

pour la variable X = t0+ t1 */

6. sage : X.out

True

Préd. Opé. X1 , var Y1 , var T0 X1, Y1 fadd T1 T0, T0 fadd M T1, T0 fadd A M, M fmul xx X1, X1 fmul T2 xx, T1 fadd B T2, T0 fadd X B, B fadd .. . ... ...

TABLE6.1 – Exemple de table SSA

tableau contenant les opérations de corps nécessaires pour réaliser une opération de courbe (ADD ou DBL). Ce tableau sera nommé table SSA dans le reste de ce document. Le tableau 6.1 est un exemple simplifié de table SSA. Chaque variable n’est affectée qu’une seule fois et n’a que deux prédécesseurs (au plus) dans le modèle de processeur utilisé. La structure SSA possède trois arguments : tab qui contient la table SSA ; alg qui correspond au nom de la table et size qui est le nombre de lignes de la table. Lors de l’initialisation de cette structure, ces paramètres sont optionnels. Ils sont alors par défaut égaux à tab = [ ], alg = ’ ’ et size = 0.

tab = SSA([],"dbl") /* Création de la table SSA tab pour le DBL */

X1 = line_SSA(’X1’,[ , ],var,[0,0])

/* Création des lignes SSA pour les variables X1, Y1 et Z1 */

Y1 = line_SSA(’Y1’,[ , ],var,[0,0]) Z1 = line_SSA(’Z1’,[ , ],var,[0,0]) tab.add_lineSSA(X1)

/* Ajout des lignes correspondant à X1, Y1 et Z1 à tab */

tab.add_lineSSA(Y1) tab.add_lineSSA(Z1)

XX = tab.SSA_mul(X1,X1,"XX")

/* Ajout des lignes correspondant la variable créée avec l’opération adéquate (mul, add, sub) et les prédécesseurs indiqués */

ZZ = tab.SSA_mul(Z1,Z1,"ZZ") t2 = tab.SSA_add(XX,ZZ,"t2") t3 = tab.SSA_add(XX,XX,"t3") M = tab.SSA_sub(t3,t2,"M") t5 = tab.SSA_add(t1,M,"t5")

X3 = tab.SSA_sub(M,t5,"X3",True) /* La variable X3 est la variable de sortie de ce calcul */

Retourner tab

Nom de la fonction Utilisation

tab.get_index(var1) Renvoie la ligne correspondant à la variable var1 tab.get_var(i) Renvoie la variable correspondant à la ligne i

tab.get_pred(i) Renvoie les prédécesseurs correspondant à la ligne i tab.in_pred(i,var) Retourne vrai si var est un des prédécesseurs de la ligne i

tab.clearSSA() Vide la table SSA tab

tab.get_rank_full(rk) Renvoie la liste des lignes correspondant à des éléments de rang rk

tab.archi_para(na,nm) Ordonnance les opérations de tab en fonction des dépen- dances de calcul et du nombre d’additionneurs na et de multiplieurs nm

TABLE 6.2 – Exemples de fonctions permettant la récupération de données présentes dans la classe SSA

Nom de la fonction Utilisation

tab.add_lineSSA(line_ssa) Ajoute la linge line_ssa à tab

tab.SSA_mul(a,b,name) Renvoie une ligne nommée name, correspondant à a × b, après l’avoir ajoutée à tab

tab.SSA_square(a,name) Renvoie une ligne nommée name, correspondant à a2, après l’avoir ajoutée à tab

tab.SSA_add(a,b,name) Renvoie une ligne nommée name, correspondant à a + b, après l’avoir ajoutée à tab

tab.SSA_sub(a,b,name) Renvoie une ligne nommée name, correspondant à a − b, après l’avoir ajoutée à tab

TABLE6.3 – Exemples de fonctions permettant l’ajout de lignes dans une table SSA

Diverses fonctions sont incluses dans la classe SSA. Certaines d’entre elles sont axées sur la récupération d’éléments de la table comme par exemple les fonctions décrites au ta- bleau 6.2. Dans ces exemples, la variable tab est une table SSA quelconque. Ces fonctions sont principalement utilisées dans des méthodes plus complexes qui sont décrites par la suite. D’autres fonctions permettent l’ajout de lignes manuellement ou en fonction de l’opé- ration caractérisant la ligne en question. Le tableau 6.3 décrit des exemples d’ajout de lignes à une table SSA nommée tab. Toutes ces fonctions, mises à part la première (tab.add_lineSSA(line_SSA)), renvoie une ligne SSA après l’avoir ajoutée à tab. Ces fonc- tions sont principalement utilisées lors de la phase d’intégration des formules de ADD et de DBL. Elles permettent de compléter simplement une table SSA et d’intégrer facilement les formules de ADD et de DBL au simulateur. La figure 6.6 décrit un exemple simplifié de création et de rem- plissage d’une table SSA. La table SSA, nommée tab, est créée avec l’étiquette dbl. Ensuite, les lignes qui correspondent aux opérandes de dbl (c.-à-d. X1,Y1 et Z1) sont initialisées puis ajoutées à tab. Une fois les variables principales instanciées, la table est complétée grâce aux

méthodes d’ajout décrites au tableau 6.3. La table obtenue possédera 10 lignes et coïncide avec le calcul d’une variable nommée X3, qui sera la sortie de la formule dbl. Les valeurs des variables n’ont pas besoin d’être connues lors de la génération de la table. En effet, aucun calcul n’est encore réalisé puisqu’il s’agit d’une table générique pour une opération de courbe donnée.