Toutes les plateformes sont les bienvenues, veuillez préciser la plateforme pour votre réponse.
Une question similaire: comment obtenir par programme la taille de la page du cache du processeur en C ++?
c++
c
caching
operating-system
systems-programming
paxos1977
la source
la source
SDL_GetCPUCacheLineSize
fonction de SDL2 , puis jetez un œil à celuicpuid macro
qui contient le code source de l'assembly pour chaque du modèle de processeur. Vous pouvez jeter un œil à imgur.com/a/KP57m6s , ou jeter un œil directement à la source vous-même.Réponses:
Sous Linux (avec un noyau raisonnablement récent), vous pouvez obtenir ces informations de / sys:
Ce répertoire a un sous-répertoire pour chaque niveau de cache. Chacun de ces répertoires contient les fichiers suivants:
Cela vous donne plus d'informations sur le cache que vous espérez jamais savoir, y compris la taille de la ligne de cache (
coherency_line_size
) ainsi que les processeurs qui partagent ce cache. Ceci est très utile si vous effectuez une programmation multithread avec des données partagées (vous obtiendrez de meilleurs résultats si les threads partageant des données partagent également un cache).la source
cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
revient64
dans mon système. Idem pour les dossiers index1,2,3 également.Sur Linux, regardez sysconf (3).
Vous pouvez également l'obtenir à partir de la ligne de commande en utilisant getconf:
la source
J'ai travaillé sur des trucs de ligne de cache et j'avais besoin d'écrire une fonction multiplateforme. Je l'ai engagé dans un dépôt github à adresse https://github.com/NickStrupat/CacheLineSize , ou vous pouvez simplement utiliser la source ci-dessous. N'hésitez pas à en faire ce que vous voulez.
la source
Sur x86, vous pouvez utiliser le instruction CPUID avec la fonction 2 pour déterminer diverses propriétés du cache et du TLB. L'analyse de la sortie de la fonction 2 est quelque peu compliquée, je vous renvoie donc à la section 3.1.3 de l' identification du processeur Intel et de l'instruction CPUID (PDF).
Pour obtenir ces données à partir du code C / C ++, vous devez utiliser l'assembly en ligne, les éléments intrinsèques du compilateur ou appeler une fonction d'assemblage externe pour exécuter l'instruction CPUID.
la source
Si vous utilisez SDL2, vous pouvez utiliser cette fonction:
Qui renvoie la taille de la taille de la ligne de cache L1, en octets.
Dans ma machine x86_64, exécutez cet extrait de code:
Produit
CacheLineSize = 64
Je sais que je suis un peu en retard, mais je ne fais qu'ajouter des informations pour les futurs visiteurs. La documentation SDL indique actuellement que le nombre renvoyé est en Ko, mais il est en fait en octets.
la source
Sur la plateforme Windows:
depuis http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx
la source
ARMv6 et supérieur a
C0
ou le registre de type de cache. Cependant, il n'est disponible qu'en mode privilégié.Par exemple, à partir du Manuel de référence technique Cortex ™ -A8 :
Ne supposez pas que le processeur ARM a un cache (apparemment, certains peuvent être configurés sans un). La méthode standard pour le déterminer est via
C0
. À partir du BRAS ARM , page B6-6:la source
Vous pouvez également essayer de le faire par programme en mesurant un certain timing. Évidemment, ce ne sera pas toujours aussi précis que cpuid et autres, mais il est plus portable. ATLAS le fait à sa phase de configuration, vous voudrez peut-être l'examiner:
http://math-atlas.sourceforge.net/
la source