GNU/Linux >> Tutoriales Linux >  >> Linux

Alineación con la línea de caché y conocimiento del tamaño de la línea de caché

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.


Linux
  1. ¿El resultado de Ls *, Ls ** y Ls ***?

  2. ¿La diferencia entre [[ $a ==Z* ]] y [ $a ==Z* ]?

  3. ¿Cómo cambiar la longitud de línea predeterminada para Od y Hexdump?

  4. ¿Por qué Ls y Hexdump no están de acuerdo sobre el tamaño del archivo?

  5. ¿Cómo puedo ver el tamaño de los archivos y directorios en Linux?

10 trucos y consejos interesantes sobre la línea de comandos de Linux que vale la pena conocer

Ohcount:el contador y analizador de líneas de código fuente

Encontrar los archivos y carpetas más grandes en la línea de comandos de Linux

MySQL la línea de comando y buscapersonas

El concepto de 'Espacio de espera' y 'Espacio de patrón' en sed

Significado de la línea buffers/cache en la salida de free