Comment marquer certaines plages de mémoire comme non cachables à partir de C ++?

Je lisais la wikipedia sur le cache du processeur ici: http://en.wikipedia.org/wiki/CPU_cache#Replacement_Policies

Marquer certaines plages de mémoire comme non cachables peut améliorer les performances en évitant la mise en cache de régions de mémoire qui sont rarement ré-accédées. Cela évite la surcharge de charger quelque chose dans le cache, sans avoir à être réutilisé.

Maintenant, je lisais et apprenais comment écrire des programmes avec de meilleures performances en cache (considérations générales, généralement pas spécifiques à C ++), mais je ne savais pas que le code de haut niveau pouvait interagir de manière explicite avec le comportement de la mise en cache du processeur. Donc ma question, est-il possible de faire ce que j’ai cité de cet article, en C ++?

De plus, j’apprécierais des ressources sur la manière d’améliorer les performances du cache spécifiquement en C ++, même si elles n’utilisent aucune fonction traitant directement des caches de processeur. Par exemple, je me demande si l’utilisation de niveaux excessifs d’indirection (par exemple, un conteneur de pointeurs vers des conteneurs de pointeurs) peut nuire aux performances du cache.

Sous Windows, vous pouvez utiliser VirtualProtect(ptr, length, PAGE_NOCACHE, &oldFlags) pour définir le comportement de mise en cache de la mémoire afin d’éviter sa mise en cache.

Concernant trop d’index: Oui, ils peuvent nuire aux performances du cache si vous accédez très souvent à différents éléments de la mémoire (c’est ce qui se passe habituellement). Il est toutefois important de noter que si vous déréférenciez systématiquement le même ensemble de 8 blocs de mémoire, par exemple, et que seul le 9e bloc diffère, cela ne fera généralement aucune différence, car les 8 blocs seraient mis en cache après le premier access. .

Certaines plates-formes prennent en charge les charges non temporelles et les magasins qui contournent les caches. Cela évite de perdre tout ce qui se trouvait auparavant dans la mémoire cache. Ils ne sont généralement pas directement disponibles pour les langages de niveau supérieur et vous devez écrire votre propre code d’assemblage. Mais même si l’existence du cache est spécifique à la plate-forme, l’existence de moyens de contrôler l’utilisation du cache est également spécifique à la plate-forme. SSE4 inclut les charges non temporelles .

En tant que programmeur travaillant généralement avec des plates-formes x86 autres que Windows, cet article sur les composants insortingnsèques de GCC x86 et x86-64 est probablement le plus utile.

Une règle empirique pour optimiser les access au cache est la suivante: le cluster est chargé et stocké à la même adresse . Par exemple, le code suivant:

 for (size_t i=0; i 

Peut être optimisé pour accéder au cache plus efficacement:

 for (size_t i=0; i 

Les processeurs modernes sont assez efficaces pour prédire l’access à la mémoire avec des modèles réguliers en boucle et sont capables de pré-extraire de la mémoire pour la mettre en cache et d’accélérer l’exécution. Donc, une autre règle de base serait: préférez utiliser std :: vector et std :: array à d’autres conteneurs .

  • Je pense que c’est un bon exemple: ce que tout programmeur devrait savoir sur la mémoire .
  • Ceci est une autre question sur SO qui peut aider.
  • Il y a aussi un lien ici qui parle de la fonction pgprot_noncached depuis drivers/char/mem.c sur les systèmes linux. Voici la source .