
L'algorithme d'évaluation du prix de stock-options qui a été analysé à l'aide de nos outils a été fourni par Intel comme un exemple de leur savoir faire sur l'usage d'OpenCL pour ce
type d'application (sources disponibles
ici). Le programme analysé implémente
trois méthodes en un seul outil réalisé en C++ et en OpenCL :
- Un générateur de nombre aléatoires uniformément distribués à l'aide d'une méthode de Mersenne ;
- Une transformé de Box-Muller, pour une génération nombre aléatoire selon un distribution normale ;
- Et une estimation du prix des actions en utilisant le modèle de Black-Scholes.
La fonction qui a été étudiée est écrite en OpenCL et est exécutée par chacun des threads (fonction décrite dans
"montecarlo.cl"). Cette fonction réalise une accumulation sur une seule variable lors d'une itération d'environ 140 000 cycles.

Cette variable augmente quasi-linéairement durant les itérations (figure ci-contre), elle est ensuite moyennée à la toute fin du programme. Elle peut donc, au fil des itération, causer
des problèmes d'absorption si les valeurs qui lui sont accumulées ne
sont plus du même ordre de grandeur qu'elle.

Sur la figure ci-contre nous avons représenté en abscisse les itérations du programme, et en ordonnée l'écart (en valeur absolue) sur la variable entre sa valeur calculée par l'ordinateur et celle attendue en mathématiques.
On constate que l'écart entre les deux valeurs n'est ni constant, ni évident à comprendre. En effet si au début les variations sur cette variable semblent faibles, les écarts sont par la suite de plus en plus grands. Ce phénomène témoigne donc d'une volatilité progressive de la précision qui dans certains moment est très bonne (l'écart se réduit à presque zéro), et d'autre où brusquement la précision se dégrade rapidement.
Heureusement, dans cet exemple les écarts, bien que significatifs, n'impactent pas gravement le comportement du programme.
Ce phénomène peut s'expliquer en partie par les variation entre les exposants de la variable que l'on mesure et de la valeur qu'on lui ajoute lors d'une itération. Lors de ces changements le nombre de décimales tronquées varient lui aussi entrainant la variation des écarts entre le résultats attendu et le résultat calculé.
Il apparaît assez facilement que le comportement de la précision des calculs est indépendant de la forme du résultat attendu du calcul. Autrement dit, ce n'est pas parce que le résultat est quasi-linéaire que l'erreur sur ce résultat le sera. Dans cette exemple il est très compliqué de trouver une fonction modélisant fidèlement le comportement de l'erreur. Qui plus est cette fonction n'aura de validité que pour ce calcul et ne pourra pas être généralisée.
Le calcul de la précision n'est trivial, ni intuitif pour un être humain. Chaque programme va être sujet à un comportement spécifique, et chaque optimisation devra l'être aussi.Remerciements : Intel, Vadim Kartoshkin (Intel), Jérôme Piat (Perfcraft).