11.4.3.2.2 : Mémoire partagée et cohérence de cache


Un principe de conception central des machines multi-cœur est que tous les cœurs de tous les processeurs ont accès à l'intégralité de la RAM, la manipulent via un système d'adressage universel, et peuvent utiliser cette mémoire partagée pour communiquer avec les autres cœurs en écrivant et lisant dans des régions mémoires convenues à l'avance.

Nous avons déjà vu comment, même dans le cadre d'une mémoire en lecture seule, cette illusion d'une mémoire homogène n'est pas parfaite, car les coûts d'accès à la RAM peuvent varier significativement d'une région mémoire à une autre à cause des effets de localité.

Mais pour prendre en compte la possibilité d'écrire dans la mémoire partagée, la complexité matérielle doit encore augmenter. En effet, si l'on veut entretenir l'illusion d'une mémoire partagée, il faut garantir que tous les caches CPU s'accordent sur le contenu de cette mémoire. Par conséquent, la gestion des écritures nécessite pour le matériel l'utilisation d'un mécanisme de cohérence de cache qui garantit au moins deux propriétés~:

  • Toute écriture mémoire effectuée par un cœur finit tôt ou tard par être propagée dans les caches des autres cœurs.
  • Il n'est pas possible pour un cœur d'écrire dans une région mémoire, ni de la lire en général, pendant qu'un autre cœur y effectue une écriture.


La cohérence de cache nécessite un grand nombre de communications entre tous les cœurs processeurs, et constitue donc un obstacle fondamental à l'augmentation du parallélisme intra-nœud. Pour cette raison, il est possible qu'à l'avenir, soit le parallélisme intra-nœud cessera d'augmenter, soit la notion de mémoire partagée cohérente sera partiellement ou totalement abandonnée au nom du passage à l'échelle, comme dans les GPUs.

Mais sur les processeurs actuels, la cohérence de cache a d'ores et déjà pour conséquence observable que si un thread accède à une région mémoire dans laquelle un autre thread est en train d'écrire ou vient d'écrire, cet accès mémoire sera beaucoup plus lent. La granularité à laquelle cet effet s'applique est la ligne de cache.