Estoy usando Linux y una plataforma x86 de 8 núcleos. Primero, ¿cómo encuentro el tamaño de la línea de caché?
$ getconf LEVEL1_DCACHE_LINESIZE
64
Pase el valor como una definición de macro al compilador.
$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...
En tiempo de ejecución sysconf(_SC_LEVEL1_DCACHE_LINESIZE)
se puede utilizar para obtener el tamaño de caché L1.
Para conocer los tamaños, debe buscarlo utilizando la documentación del procesador, pero no hay forma programática de hacerlo. Sin embargo, en el lado positivo, la mayoría de las líneas de caché tienen un tamaño estándar, según los estándares de Intel. En x86, las líneas de caché son de 64 bytes; sin embargo, para evitar el uso compartido falso, debe seguir las pautas del procesador al que se dirige (Intel tiene algunas notas especiales sobre sus procesadores basados en netburst), por lo general, debe alinearse con 64 bytes para esto. (Intel indica que también debe evitar cruzar los límites de 16 bytes).
Para hacer esto en C o C++ requiere que use el estándar aligned_alloc
función o uno de los especificadores específicos del compilador, como __attribute__((align(64)))
o __declspec(align(64))
. Para rellenar entre miembros en una estructura para dividirlos en diferentes líneas de caché, debe insertar un miembro lo suficientemente grande como para alinearlo con el siguiente límite de 64 bytes
Otra forma sencilla es simplemente catear /proc/cpuinfo:
grep cache_alignment /proc/cpuinfo
No existe una forma completamente portátil de obtener el tamaño de caché. Pero si está en x86/64, puede llamar al cpuid
instrucciones para obtener todo lo que necesita saber sobre el caché, incluido el tamaño, el tamaño de la línea de caché, cuántos niveles, etc.
http://softpixel.com/~cwright/programming/simd/cpuid.php
(Desplácese un poco hacia abajo, la página trata sobre SIMD, pero tiene una sección que obtiene la línea de caché).
En cuanto a la alineación de sus estructuras de datos, tampoco hay una forma completamente portátil de hacerlo. GCC y VS10 tienen diferentes formas de especificar la alineación de una estructura. Una forma de "hackearla" es rellenar su estructura con variables no utilizadas hasta que coincida con la alineación que desea.
Para alinear sus mallocs(), todos los principales compiladores también tienen funciones malloc alineadas para ese propósito.