GNU/Linux >> Tutoriels Linux >  >> Linux

Alignement sur la ligne de cache et connaissance de la taille de la ligne de cache

J'utilise Linux et une plate-forme x86 à 8 cœurs. Tout d'abord, comment puis-je trouver la taille de la ligne de cache.

$ getconf LEVEL1_DCACHE_LINESIZE
64

Transmettez la valeur en tant que définition de macro au compilateur.

$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...

A l'exécution sysconf(_SC_LEVEL1_DCACHE_LINESIZE) peut être utilisé pour obtenir la taille du cache L1.


Pour connaître les tailles, vous devez les rechercher à l'aide de la documentation du processeur, autant que je sache, il n'y a aucun moyen de le faire par programmation. Cependant, la plupart des lignes de cache ont une taille standard, basée sur les normes Intel. Sur les lignes de cache x86, il y a 64 octets, cependant, pour éviter les faux partages, vous devez suivre les directives du processeur que vous ciblez (intel a quelques notes spéciales sur ses processeurs basés sur netburst), généralement vous devez vous aligner sur 64 octets pour cela (Intel indique que vous devez également éviter de franchir les limites de 16 octets).

Pour ce faire en C ou C++, vous devez utiliser le standard aligned_alloc fonction ou l'un des spécificateurs spécifiques au compilateur tels que __attribute__((align(64))) ou __declspec(align(64)) . Pour remplir entre les membres d'une structure afin de les diviser en différentes lignes de cache, vous devez insérer un membre suffisamment grand pour l'aligner sur la prochaine limite de 64 octets


Un autre moyen simple est de cat le /proc/cpuinfo :

grep cache_alignment /proc/cpuinfo

Il n'y a pas de moyen complètement portable d'obtenir la taille de la ligne de cache. Mais si vous êtes sur x86/64, vous pouvez appeler le cpuid instruction pour obtenir tout ce que vous devez savoir sur le cache - y compris la taille, la taille de la ligne de cache, le nombre de niveaux, etc...

http://softpixel.com/~cwright/programming/simd/cpuid.php

(faites défiler un peu, la page concerne SIMD, mais elle contient une section récupérant la ligne de cache.)

Quant à l'alignement de vos structures de données, il n'y a pas non plus de moyen complètement portable de le faire. GCC et VS10 ont différentes façons de spécifier l'alignement d'une structure. Une façon de la "pirater" consiste à remplir votre structure avec des variables inutilisées jusqu'à ce qu'elle corresponde à l'alignement souhaité.

Pour aligner votre mallocs(), tous les compilateurs traditionnels ont également des fonctions malloc alignées à cette fin.


Linux
  1. Comment puis-je voir la taille des fichiers et des répertoires sous Linux ?

  2. Comment produire l'effet cache cpu en C et java ?

  3. Comment puis-je déterminer la taille actuelle de l'ARC dans ZFS, et comment l'ARC est-il lié à la mémoire libre ou cache ?

  4. Répertorier les étiquettes de partition à partir de la ligne de commande

  5. Signification de la ligne buffers/cache dans la sortie de free

Ohcount - Le compteur et l'analyseur de lignes de code source

Imprimer la ligne correspondante et la nième ligne à partir de la ligne correspondante ?

Pourquoi Ls et Hexdump ne sont-ils pas d'accord sur la taille du fichier ?

Recherche des fichiers et dossiers les plus volumineux dans la ligne de commande Linux

MySQL la ligne de commande et les pagers

Le concept de 'Hold space' et 'Pattern space' dans sed