Antémémoire (la Cache)
Prudence : document en construction, et structure en émergence...
En bref :
- L'antémémoire est une zone de mémoire à proximité du processeur, et dans
laquelle les accès sont beaucoup plus rapides que ceux réalisés dans la
mémoire vive
- Les données dans une antémémoire sont insérées par bloc, de la taille d'une Cache
Line. Cette taille varie selon les architectures matérielles
- Quand une donnée doit être manipulée par le processeur, elle est amenée
dans l'antémémoire (avec ses voisines), puis circule de l'antémémoire au
processeur et inversement
- Conséquemment, l'idée est de placer à proximité les unes des autres les
données qui seront accédées successivement dans un même thread, et éloigner
les unes des autres des données qui seront accédées par des threads
distincts, du moins si au moins l'une d'elles est sujette à être accédée en
écriture
- En effet, les données dans l'antémémoire doivent être à jour. Si un
thread modifie une donnée dans l'antémémoire d'un coeur, tous les autres
coeurs qui ont dans leur antémémoire une copie de cette donnée doivent alors
rafraîchir le contenu de leur propre antémémoire, ce qui entraîne une
dégradation de performance (du Cache Trashing)
Un algorithme est Cache-aware s'il est écrit pour tenir compte de la
Cache
dans le détail. Ceci peut signifier que l'algorithme requiert une part de
calibration en fonction des paramètres de la Cache (taille d'une
Cache Line, par exemple). Typiquement, l'algorithme
Cache-Oblivious sera plus performant
que la version naïve du même algorithme, alors que la version Cache-aware
sera encore plus rapide que la version
Cache-Oblivious, mais perdra en
portabilité en s'associant de près à des détails architecturaux moins
transférables.
Certaines pessimisations peuvent résulter d'un mauvais usage de
l'antémémoire, en particulier le
faux
partage.
Lectures complémentaires
Quelques liens supplémentaires pour enrichir le propos.
Généralités
Quelques sites Wiki :
Divers articles sur le sujet :
- Texte complémentaire par Mike Ash en 2013 :
pourquoi les registres et les antémémoires sont-ils si rapides d'accès alors que
l'accès à la mémoire vive est si lent?
http://www.mikeash.com/pyblog/friday-qa-2013-10-11-why-registers-are-fast-and-ram-is-slow.html
- http://ralyx.inria.fr/2005/Raweb/compsys/uid0.html
- http://digbib.ubka.uni-karlsruhe.de/eva/ira/1998/16&search=/ira/1998/16
- http://www.computer.org/portal/web/csdl/doi/10.1109/40.946678
- http://portal.acm.org/citation.cfm?doid=362422.362438
- Réduire la latence des accès mémoire : http://www.tinker.ncsu.edu/symposia/mpi01.pdf
- http://lbrandy.com/blog/2009/07/computational-performance-a-beginners-case-study/
- Un texte de 2012 qui prétend que la Cache
Line est l'équivalent contemporain des registres à une
époque pas si lointaine : http://simonask.tumblr.com/post/30645840195/cache-lines-are-the-new-registers
- À propos de la difficulté de gérer l'invalidation d'une Cache,
par Vincent Sanders en 2014 :
http://vincentsanders.blogspot.co.uk/2014/02/there-are-only-two-hard-things-in.html
- Ce qu'il faut savoir sur l'antémémoire du processeur, selon Evgeny
Budilovksy en 2014 :
http://meta-x86.blogspot.co.il/2014/06/cpu-cache-essentials.html
- Comprendre le fonctionnement de la Cache Coherence, texte de Fabian Giesenen en
2014 :
http://fgiesen.wordpress.com/2014/07/07/cache-coherency/
- L'impact de divers algorithmes pour déterminer ce qui sortira de la
Cache quand on aura besoin d'y faire un peu de place, par Dan Luu en
2014 :
http://danluu.com/2choices-eviction/
- Comment l'accès à la mémoire influence la vitesse d'exécution, une étude
de Matt Kline en 2015 :
http://bitbashing.io/memory-performance.html
- Le Cache Partitioning sur processeur Haswell, expliqué par Dan
Luu en 2015 :
http://danluu.com/intel-cat/
- Ce que toute programmeuse et tout programmeur devrait savoir :
- Le Caching et le Web :
- Comprendre la cohérence de la Cache, texte de
2014 par Fabian Giesen :
https://fgiesen.wordpress.com/2014/07/07/cache-coherency/
- Selon Carlos Bueno en 2014, la Cache
joue aujourd'hui le rôle que jouait la RAM hier :
http://blog.memsql.com/cache-is-the-new-ram/
- Pourquoi se préoccuper de la Cache? Un texte d'Ivo Sklenar en
2015 : https://ivosklenar.net/Blog/Post/19
- Série de textes par Emil Ernerfeldt en 2014, soutenant la « thèse » que l'accès à une
donnée en mémoire vive soit de complexité :
- En 2015, James Hague met un bémol sur la quête de
l'optimisation absolue des accès à la Cache :
http://prog21.dadgum.com/204.html
- Antémémoire et réorganisation des données de programmes
Lisp, article de
Richard Fateman en 2003 :
http://www.cs.berkeley.edu/~fateman/papers/cachelisp.pdf
- Selon Carlos Bueno en 2014, la Cache est
aujourd'hui ce que la RAM était à une autre époque :
http://carlos.bueno.org/2014/11/cache.html
- Comparatif d'approches à l'utilisation de la mémoire contiguë selon les
plateformes, par Karl Rupp en 2016 :
https://www.karlrupp.net/2016/02/strided-memory-access-on-cpus-gpus-and-mic/
- Tour d'horizon des Caches d'un processeur, par Lukas Waymann en
2017 :
https://meribold.github.io/2017/10/20/survey-of-cpu-caches/
Niveaux d'antémémoire
Outils
Profiter de l'antémémoire
- Taille d'un programme, taille de l'antémémoire et performance :
http://discuss.joelonsoftware.com/default.asp?joel.3.58627.5
- Optimiser du code pour lequel l'essentiel du travail se passe en mémoire :
http://docs.cray.com/books/S-2315-50/html-S-2315-50/z1051208423brbethke.html
- Impact de la taille des tableaux sur la « performance » :
http://www.idiom.com/~zilla/Computer/cachekiller.html
- http://www.linuxshowcase.org/2000/2000papers/papers/sears/sears_html/
- http://www.tophatstuff.co.uk/?p=119
- L'impact des modalités de parcours de la mémoire, avec illustrations
en Java, par
Martin Thompson en 2012 : http://mechanical-sympathy.blogspot.co.uk/2012/08/memory-access-patterns-are-important.html
- Comprendre ce que signifie un Cache Flush, et surtout ce que cela
ne signifie pas, par Martin Thompson en 2013 :
http://mechanical-sympathy.blogspot.co.uk/2013/02/cpu-cache-flushing-fallacy.html
- Réorganiser les structures de données, un texte de Randy Gaul en
2014 :
http://www.randygaul.net/2014/06/25/cache-aware-components/
- Textes d'Austin G. Walters en 2014 :
- Des algorithmes conscients de l'antémémoire :
http://cs.gmu.edu/~menasce/cs571/Spring2001/BovetSlides.pdf
- Des diapositives électroniques de
Scott Meyers :
http://aristeia.com/TalkNotes/PDXCodeCamp2010.pdf
- Profiter du Cache Prefetching par programmation, selon Katarzyna Macias en
2015 :
http://katecpp.github.io/cache-prefetching/
- Visualiser les impacts de diverses approches sur l'antémémoire :
http://igoro.com/archive/gallery-of-processor-cache-effects/
- Pour profiter de l'antémémoire, mieux vaut privilégier les conteneurs dont
les éléments sont contigus en mémoire (en
C++,
préférez
std::vector) :
- La recherche dichotomique (Binary Search) est parfois un cas pathologique
pour les antémémoires. À ce sujet, une étude assez
riche de Paul Khuong en 2012 :
http://www.pvk.ca/Blog/2012/07/30/binary-search-is-a-pathological-case-for-caches/
- Présentation assez claire d'Eric Brumer, en 2013, sur l'impact de l'accès à
la mémoire sur la vitesse d'exécution :
http://channel9.msdn.com/Events/Build/2013/4-329
- Tenir compte de l'antémémoire rapporte, comme en fait état Naftali Harris en
2013 qui explique avoir obtenu gain imposant en vitesse d'exécution par
l'ajout d'une seule ligne de code :
http://www.naftaliharris.com/blog/2x-speedup-with-one-line-of-code/
- Caching et « mémo-isation » en programmation :
- En 2014, Igor Ostrovsky décrit, par des exemples
en C#, l'impact
de la Cache sur le temps d'exécution de certaines répétitives :
http://igoro.com/archive/gallery-of-processor-cache-effects/
- Obtenir la taille de la Cache en
C++ et en
D à partir d'un
identifiant de processeur (CPU ID), par Melker Litsgård en 2016 :
http://blog.melkerlitsgard.se/2016/05/12/cache-sizes-with-cpuid/
- Les approches Struct of Arrays (SoA) et Array of Structs
(AoS) :
- Comprendre le Caching avec Postgres, par Madusudanan.B.N en
2016 :
https://madusudanan.com/blog/understanding-postgres-caching-in-depth/
- Partager efficacement une Cache, un texte d'Adrian Colyer en
2016 :
https://blog.acolyer.org/2016/03/23/fairride-near-optimal-fair-cache-sharing/
- Les avantages d'une Cache immuable, expliqués par Patrick
McManus en 2016 :
https://bitsup.blogspot.ca/2016/05/cache-control-immutable.html
Risques et périls