2012-01-13 2 views
6

Est-il possible de créer explicitement des objets statiques dans le cache de l'UC, de sorte que ces objets restent toujours dans le cache afin de ne jamais atteindre la RAM ou la mémoire virtuelle interdid-hdd?Allouer de la mémoire statique dans le cache CPU en c/C++: est-ce possible?

Je suis particulièrement intéressé par le ciblage du grand cache partagé L3, sans avoir l'intention de cibler L1, L2, l'instruction ou tout autre cache, juste le plus gros morceau de mémoire on-die.

Et juste pour clarifier pour différencier des autres threads que j'ai cherché avant de poster ceci, je ne suis pas intéressé à privatiser le cache entier, juste un petit, quelques classes de valeur de la région.

+2

Je pense que le mieux que vous pouvez faire est d'utiliser la macro [__builtin_prefetch] de GCC (http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html). Le cache IIRC n'est pas adressable par code, le CPU le gère lui-même (au moins sur x86). –

+1

Quel type de processeur? Certaines architectures ont des instructions pour donner des indications de cache ou diriger les préfixes de cache avant que les données ne soient nécessaires. – TJD

+1

Courte anwer: non vous ne pouvez pas. La seule chose que vous pouvez faire est de garder la localité de référence serrée. Ne sautez pas en mémoire, mais essayez d'accéder aux données proches des données auxquelles vous avez accédé lors de l'opération précédente. En outre, en gardant vos données alignées sur les limites du cache, vous pouvez éviter une autre extraction de cache. BTW le cache * slots * ne doivent pas être consécutifs. Sur x86, il y a quatre slots L1 IIRC et des centaines ou des milliers de slots L2. (que vous devez partager avec d'autres processus sur une machine multiprocessus). – wildplasser

Répondre

12

Non. Le cache n'est pas adressable, vous ne pouvez donc pas y allouer d'objets. Ce que vous semblez vouloir dire est: Après avoir alloué de l'espace dans la mémoire virtuelle, est-ce que je peux m'assurer que je reçois toujours des hits de cache?

Ceci est une question plus compliquée, et la réponse est: en partie.

Vous pouvez certainement éviter d'être échangé sur le disque, en utilisant l'API de gestion de la mémoire de votre système d'exploitation (par exemple mlock()) pour marquer la région comme non paginable. Ou allouer à partir de "pool non paginé" pour commencer.

Je ne crois pas qu'il existe une API similaire pour épingler la mémoire dans le cache CPU. Même si vous pouvez réserver le cache CPU pour ce bloc, vous ne pouvez pas éviter les échecs de cache. Si un autre noyau écrit dans la mémoire, la propriété sera transférée, et vous souffrirez d'un manque de cache et d'un transfert de bus associé (éventuellement dans la mémoire principale, éventuellement dans le cache de l'autre cœur). Comme Mathew le mentionne dans son commentaire, vous pouvez également forcer le cache manqué à se produire en parallèle avec d'autres travaux utiles dans le pipeline, afin que les données soient dans le cache quand vous en avez besoin.

1

Vous pouvez exécuter un autre thread qui boucle sur les données et l'amène dans le cache L3.

Questions connexes