LMAX-Architecture
Mechanical sympathie
Pourquoi?
La plus belle introduction à la mechanical sympathy restera toujours cette merveilleuse citation de Henry Peteroski:
"La réalisation la plus étonnante de l'industrie du logiciel est son annulation continue des gains réguliers et stupéfiante faite par l'industrie du matériel informatique."
Cette observation a été une grande source d'emploi pour LMAX au cours des dernières années. LMAX essaye donc de mettre en application certaines des techniques pour tirer le meilleur parti du matériel sous-jacent. Le nom de "Mechanical Sympathy» vient de la grande course du pilote Jackie Stewart, qui était un 3 fois champion du monde de Formule 1. Il croyait que les meilleurs pilotes avaient assez de comprendre comment une machine travaillé afin qu'ils puissent travailler en harmonie avec elle.
Pourquoi le logiciel que nous utilisons aujourd'hui n'est pas plus rapide que les applications DOS, que nous utilisions il ya 20 ans??? En tant que développeur de logiciels il faut essayer de produire un logiciel qui rend justice aux réalisations merveilleuses de nos amis de matériel. Pour arriver à mettre se formidable projet en oeuvre, on peut par exemple s'aider des barrières mémoires.
Barrières mémoires
Les processeurs ont utilisé de nombreuses techniques pour essayer de tenir compte du fait que les performances du processeur au sens d'unité d'exécution a considérablement surpassé les performances de la mémoire principale. La technique la plus commune utilisée par les processeurs pour masquer la latence mémoire est l'envoi en pipeline qui avec des efforts importants et des ressources, peut essayer de re-commander des canalisations afin de minimiser les défauts de cache.
Quand un programme est exécuté, il n'a pas d'importance si ses instructions sont re-commandé à condition que le même résultat final soit atteint. Par exemple, dans une boucle, il n'y a pas d'importance de mettre le compteur de boucle à jour si aucune instruction de la boucle ne l'utilise. Le compilateur et le processeur sont libres de commander à nouveau les instructions pour utiliser au mieux le processeur à condition qu'il soit mis à jour au moment où la prochaine itération est sur le point de commencer. Aussi au cours de l'exécution d'une boucle cette variable peut être stockée dans un registre et jamais poussé hors de cache ou de la mémoire principale, donc il n'est jamais visible par un autre processeur.
Les cœurs de processeurs contiennent des unités d'exécution multiples. Par exemple, un processeur Intel modernes contient 6 unités d'exécution qui peut faire des combinaisons arithmétiques, de la logique conditionnelle, ou de la manipulation mémoire. Chaque unité d'exécution peut faire une combinaison de ces tâches. Ces unités d'exécution fonctionnent en parallèle permettant aux instructions d'être exécutées en parallèle. Cela introduit un autre niveau de non-déterminisme à l'ordre du programme si elle a été observée d'un autre processeur.
Enfin, quand un défaut de cache se produit, un processeur moderne peut faire une hypothèse sur les résultats d'une charge mémoire et poursuivre l'exécution fondée sur cette hypothèse que la charge revienne aux données réelles.