• Aucun résultat trouvé

Diff´erentiation automatique

3.2 M´ethodes pour l’´etude de la pr´ecision num´erique

3.2.3 Diff´erentiation automatique

L’id´ee de la diff´erentiation automatique [Ral81, Gri00, BHN02] est de consid´erer un programme comme une fonction math´ematique d´efinie par composition d’op´erations ´el´ementaires. En nous restreignant aux expressions arithm´etiques, les op´erations ´el´ementaires sont +,−, × et ÷, et les fonctions ´etudi´ees sont toutes les compositions possibles de ces op´erations. Cette m´ethode s’appuie sur la r`egle de d´erivation en chaˆıne : si f et g sont deux fonctions diff´erentiables alors f ◦ g est diff´erentiable telle que :

(f◦ g)′= f′(f◦ g′)

Cette r`egle donne la fa¸con d’´evaluer la d´eriv´ee de fonctions compos´ees, par application des r`egles math´ematiques usuelles de d´erivation. La diff´erentiation est r´ealis´ee suivant les variables du programme et nous distinguons deux types de variables : les variables ind´ependantes et les variables d´ependantes. Les variables ind´ependantes sont, la plupart du temps, les variables d’entr´ee du programme et elles sont utilis´ees pour la diff´erentiation. Les variables d´ependantes sont celles pour lesquelles nous voulons calculer les d´eriv´ees et elles sont, en g´en´eral, les sorties du programme. De plus, les variables sont dites actives si elles sont accompagn´ees d’une information de d´eriv´ee.

Nous notons ρ l’environnement qui associe `a chaque variable un flottant avec sa d´eriv´ee. Nous d´efinissons la s´emantique J.KD associ´ee `a cette m´ethode suivant la structure d’une expression arithm´etique a telle que :

JaKD(ρ) =     

(c, 0) si a est une constante c

ρ(x) si a est une variable x

(F∼(a1⋄ a2),D(a1⋄ a2)) sinon avec⋄ ∈ {+, −, ×, ÷}

F∼est la fonction d´efinie `a la figure 3.1 appliquant la norme IEEE 754 utilisant le mode d’arrondi au plus pr`es etD, d´efinie `a la figure 3.7, correspond au calcul des d´eriv´ees en un point. Une valeur r´eelle est d´ecompos´ee en un couple (f, d) avec f la valeur flottante et d la valeur de la d´eriv´ee au

a = (fa, da) et b = (fb, db) D(a + b) = da+ db D(a − b) = da− db D(a × b) = dafb+ dbfa D 1a  = −dfa2 a si fa6= 0

Fig. 3.7 – D´efinition de la fonctionD.

point f . Comme nous l’avons mentionn´e pr´ec´edemment, la fonctionD est d´efinie par les r`egles de d´erivation math´ematique.

Cette m´ethode permet, par le biais des valeurs de la diff´erentielle, une analyse de d´ependances entre les variables pr´esentes dans le programme. En effet, la diff´erentielle est compos´ee de d´eriv´ees partielles calcul´ees par rapport aux variables ind´ependantes du programme. Si une d´eriv´ee partielle p associ´ee `a la variable x est nulle pour une variable ind´ependante v alors nous pouvons conclure que v ne d´epend pas de x. A l’inverse, si p a la plus grande valeur non nulle parmi les d´eriv´ees partielles composant la diff´erentielle de v alors la variable x est la plus influente dans le calcul de la variable v.

De plus, dans le cadre de la pr´ecision num´erique, la connaissance de la d´eriv´ee de la fonction en un point permet de d´efinir une approximation lin´eaire du r´esultat r´eel `a partir de la valeur flottante. En effet, en consid´erant la valeur de l’ulp u d’une valeur flottant x, nous obtenons :

f (x + u)≈ f(x) + uf′(x)

C’est en partie la base de la m´ethode CENA[Lan99] (Correction des erreurs num´eriques d’arrondi) qui essaie de compenser les erreurs d’arrondi au fil des calculs dans le but de calculer le r´esultat r´eel d’un programme num´erique. Nous pouvons remarquer qu’il est possible d’appliquer plusieurs fois la m´ethode de diff´erentiation automatique afin d’obtenir les d´eriv´ees d’ordre sup´erieur. Nous sommes alors capable, grˆace aux d´eriv´ees d’ordre sup´erieur, de d´efinir des approximations polynomiales.

Exemple 3.2 Prenons l’exemple de l’expression p = x− ax, tir´ee de [GP06], et calculons la

d´eriv´ee de p par rapport `a x. a = (0.65, 0) avec 0.65 la valeur flottante et 0 la valeur de la d´eriv´ee de a par rapport `a x. x = (1, 1) o`u la premi`ere composante est la valeur flottante et la seconde repr´esente la valeur de la d´eriv´ee de x par rapport `a x.

D(p) = D(x) − D(ax)

= 1− (0.65 × 1 + 0 × 1)

= 0.35

x a une influence dans le calcul de p et nous en d´eduisons qu’une erreur initiale e sur x induit une approximation du r´esultat de a dans les flottants de 0.35e.

Il existe deux r´ealisations possibles de la m´ethode de la diff´erentiation automatique [BHN02, Gri00] : par surcharge d’op´erateurs et par transformation de code source. La m´ethode par surcharge s’appuie sur le concept objet de certains langages de programmation et elle est appliqu´ee par exemple au langage C++ `a travers la librairie ADOL-C1. C’est la plus simple des deux m´ethodes puisqu’elle n´ecessite uniquement la d´efinition d’un nouveau type de donn´ees (c’est-`a-dire une classe en programmation objets). L’inconv´enient de cette m´ethode est une d´egradation des performances tandis que son avantage est le peu de changements `a effectuer dans le programme original.

La m´ethode de transformation de code source est utilis´ee dans les programmes ADIC2

[BRMO97], ADIFOR3[BCKM94] ou TAPENADE4[HAP05] pour les langages C/C++ et Fortran

respectivement. L’objectif est de modifier le programme original pour ajouter les instructions per- mettant le calcul des d´eriv´ees. Elle fait appel `a des concepts issus de la compilation, par exemple la g´en´eration d’arbres de syntaxe abstraite. L’ajout de nouvelles instructions modifie la s´emantique du programme et n´ecessite donc une grande expertise pour sa mise en œuvre. L’utilisation des techniques de compilation permet de mettre en place des analyses statiques et des optimisations afin d’obtenir de meilleures performances pour le code g´en´er´e.