Existe-t-il un moyen de forcer le stockage d’une variable dans le cache en C?

Je viens d’avoir un entretien téléphonique où on m’a posé cette question. Je suis au courant des manières de stocker dans le registre ou le tas ou la stack, mais cache spécifiquement?

Pas en C comme langage. Dans GCC en tant que compilateur, recherchez __builtin_prefetch .

Vous pourriez être intéressé par la lecture de Ce que tout programmeur devrait savoir sur la mémoire .

Modifier:

Juste pour dissiper une certaine confusion, les caches sont des mémoires physiquement séparées, mais non des abstractions logicielles de la machine. Un mot dans un cache est toujours associé à une adresse dans la mémoire principale. Ceci est différent des registres de la CPU, qui sont nommés / adressés séparément de la RAM.

En C, tel que défini par la norme C? Non.

En C, comme dans une implémentation spécifique sur une plate-forme spécifique? Peut être.

Comme le cache est un concept de CPU et n’a pas de sens pour le langage C (et le langage C a des processeurs cibles qui n’ont pas de cache, peu probable aujourd’hui, mais assez courant jadis), définitivement Non .

Essayer d’optimiser de telles choses à la main est aussi généralement une très mauvaise idée.

Ce que vous pouvez faire, c’est garder le travail facile pour le compilateur en gardant les boucles très courtes et en ne faisant qu’une seule chose (bon pour le cache d’instruction), itérer sur les blocs de mémoire dans le bon ordre (préférer les access aux cellules consécutives en mémoire aux access clairsemés) réutiliser les mêmes variables pour différents usages (cela introduit des dépendances lecture-après-écriture), etc. Si vous êtes attentif à de tels détails, le programme aura plus de chances d’être optimisé efficacement par le compilateur et les access à la mémoire mis en cache.

Mais cela dépendra toujours du matériel réel et même le compilateur peut ne pas le garantir.

Cela dépend de la plate-forme. Par conséquent, si vous parlez à une entreprise qui cible les consoles de la génération actuelle, vous devez connaître les instructions / instructions insortingnsèques du cache de données PowerPC. Sur diverses plates-formes, vous devez également connaître les règles de partage erronées. En outre, vous ne pouvez pas mettre en cache à partir de la mémoire marquée explicitement comme non mise en cache.

Sans plus de contexte sur le travail, l’entreprise ou la question, il serait probablement préférable d’y répondre en indiquant ce qu’il ne faut pas faire pour conserver les références mémoire dans le cache de données.

Si vous essayez de forcer le stockage de quelque chose dans le cache de la CPU, je vous recommande de ne pas essayer de le faire, sauf si vous avez une très bonne raison. Manipuler manuellement le cache du processeur peut avoir toutes sortes de conséquences inattendues, notamment la cohérence dans les applications multicœurs ou multi-processeurs. Ceci est quelque chose qui est fait par le CPU au moment de l’exécution et est généralement transparent pour le programmeur et le compilateur pour une bonne raison.

La réponse spécifique dépendra de votre compilateur et de votre plate-forme. Si vous ciblez une architecture MIPS, il existe une instruction CACHE (assembly) qui vous permet de manipuler le cache du processeur.