Je viens d'avoir une interview téléphonique où on m'a posé cette question. Je suis conscient des moyens de stocker dans le registre ou le tas ou la pile, mais mettre en cache spécifiquement? P>
5 Réponses :
en C, comme indiqué par la norme C? Non. P>
en C, comme dans une implémentation spécifique sur une plate-forme spécifique? Peut-être. P>
quelle plate-forme pourrait-elle être? Ce que je sais, c'est que la CPU gère le cache L1 / L2 / .. Cache et la seule chose que vous puissiez faire est d'écrire du code intelligent que la chance est plus élevée qu'une variable et / ou un code est stockée dans le cache L1. Mais je ne suis pas un développeur de noyau, demandez-vous et curieux
@Arthur: Je ne suis pas vraiment un développeur de noyau expérimenté, d'où le "peut-être". Au plus j'ai lu sur certaines choses (telles que coreboot ) à l'aide du cache de la CPU comme RAM lorsque le contrôleur RAM n'a pas encore été initialisé.
@MATTI: Autant que je comprends bien, le cache-as-Ram est un mode CPU dans lequel la mémoire cache de la CPU est utilisée à la place de DRAM. Mais ce n'est pas lié à C, il a besoin d'un support matériel. Il existe également des compilateurs tels que ROMCC qui utilise uniquement des registres (ou du cache sous forme de RAM) et ne dament jamais.
Err, non, au niveau C, le plus que vous pouvez vous attendre à forcer une variable à stocker à un TCM (qui n'est pas un cache) à l'aide des attributs de section de GCC. Accès directement au système Coprocesseur (à l'aide d'instructions d'assembleur Proviled) sur certains processeurs, vous pourrez peut-être verrouiller une partie du cache.
@kriss, @ninjalj: soupir i> d'où le "peut-être!" Cela signifie qu'il est éventuellement faisable dans un programme écrit dans C. C'est tout.
@MATTI: Vous auriez généralement besoin d'une extension ASM ou d'une cible de pragma spécifique pour y parvenir. Pouvez-vous vraiment dire que c'est c? De mon point de vue, je dirais que non, car il est très improbable que votre programme soit toujours portable. Mais toutefois, dans des projets tels que l'écriture du BIOS, vous ne vous souciez généralement pas d'une grande partie de la portabilité ...
pas en c comme langue. Dans GCC en tant que compilateur - cherche __ intégré_prefetch code> a>. p>
Peut-être que le __builtin_praftch était ce qu'il voulait dire, mais je suppose que je ne saurais que si je suis appelé à une interview sur place, peut-être que je lui demanderai alors! Super article cependant!
.. Quel vaste article ... ne peut vraiment pas arrêter de lire. Merci Nikolai!
Comme le cache est un concept de processeur et n'a pas de sens pour le langage C (et la langue C a cible les processeurs qui n'ont pas de cache, peu probable aujourd'hui, mais assez courants dans les vieux jours), sans aucun doute essayer d'optimiser de telles choses à la main em> est également une idée assez mauvaise. P>
Ce que vous pouvez faire est de garder le travail facile pour le compilateur de conserver des boucles très courts et de faire une seule chose (bon pour le cache d'instructions), itérale sur des blocs de mémoire dans le bon ordre (préférez les accès aux cellules consécutives en mémoire d'accès à la mémoire ), Évitez de réutiliser les mêmes variables pour différentes utilisations (elle introduit des dépendances en lecture-après-écriture), etc. Si vous êtes attentif à de tels détails, le programme est plus susceptible d'être optimisé efficacement par le compilateur et les accès à la mémoire être mis en cache. p>
Mais cela dépendra toujours du matériel actuel et même du compilateur peut ne pas le garantir. P>
Si vous essayez de forcer quelque chose à stocker dans le cache de la CPU, je vous recommanderais d'éviter d'essayer de le faire à moins que vous n'ayez une raison d'une très bonne raison. Manipulation manuelle Le cache de la CPU peut avoir toutes sortes de conséquences inattendues, et non le moins d'entre eux de la cohérence dans des applications multi-noyau ou multi-processeurs. C'est quelque chose qui se fait par la CPU au moment de l'exécution et est généralement transparent pour le programmeur et le compilateur pour une bonne raison. P>
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 CODE> CACHE CODE> (Assemblée) qui vous permet de faire des manipulations de cache CPU. P>
Cela dépend de la plate-forme, donc si vous parliez à une société ciblant des consoles de génération de courant, vous devez connaître la mise en intrigue / instructions du cache de données PowerPC. Sur différentes plates-formes, vous devez également connaître les règles de partage de fausses règles. En outre, vous ne pouvez pas mettre en cache de la mémoire marquée explicitement comme incaché. P>
Sans plus de contexte sur l'emploi ou la compagnie ou la question réels, cela serait probablement mieux répondu en parlant de ce que non fort> à faire pour conserver des références de mémoire dans le cache de données. P>
Quel compilateur et plate-forme utilisez-vous?
Aucune plate-forme ou compilateur n'a été mentionné, mais au cas où nous devions assumer le bras avec le compilateur de bras, il y aurait une réponse spécifique? Il y aura également une différence s'il y avait un système d'exploitation présent par opposition à un morceau de code autonome?
Certains processeurs de bras supportent le verrouillage du cache.
Le cache est transparent; Tout magasin à la mémoire (à l'exception des régions marqués non accables) sera mis en cache. Si vous souhaitez utiliser une mémoire rapide (vitesses de type cache) qui n'est pas soutenue par la mémoire principale lente, vous recherchez une mémoire "ScratchPad". Certaines DSPS, et Xeon Phi, ont une telle mémoire ou (pour Xeon Phi) peut être configurée pour utiliser leur EDRAM comme gratte-patch à la place du cache L3. Voir la réponse de Dr. Bandwidth sur Pouvez-vous accéder directement au cache à l'aide de l'assemblage? - Ce n'est pas quelque chose que ISO C sait quoi que ce soit; L'attribution d'un espace de grattage serait spécifique à une plate-forme donnée.