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.