Cómo escribir un programa en C con 100 errores de caché
Hoy, para hacer un ppt para explicar cómo usar oprofile (tomando como ejemplo la prueba de pérdida de caché), necesito escribir un pequeño ejemplo de pérdida de caché, tomando el caché de datos de nivel 2 como ejemplo. Consulte los pasos específicos a continuación.
1. Verifique el tamaño de la caché de su sistema:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/size
Mina el sistema es centos 5,8. El comando anterior es para verificar el tamaño del caché de nivel 2. En mi servidor es 256k. Recuerde este número y utilícelo al escribir programas.
2. Verifique el tamaño de la línea de caché:
$ cat /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size
Mi servidor El número anterior es 64 y la unidad es bytes. Recuerde este número y utilícelo.
3. Escriba el programa de prueba cache.c:
[cpp] view Plaincopyprint?
int Matrix[8192][16]; 8192 *16=2^18=512k bytes
void bad_access()
{
int k, j, suma = 0
<; p > for(k = 0; k lt; 16; k)for(j = 0; j lt; 8192; j)
suma = matriz[j][k ] ;
}
int principal()
{
int i
para(i = 0 ; ilt; 5000000; i)
bad_access();
retorno
}
Aunque el código anterior es simple , requiere Para comprender, es necesario comprender la estructura simple y el principio del caché: el caché se divide en múltiples grupos (o multicanales) con 64 bytes o 128 bytes en una línea cada vez que se produce un error de caché para recuperar. datos, el caché seguirá la línea de caché. La unidad (aquí, 64 bytes a la vez) recupera datos de la memoria.
En el primer paso, sabemos que el tamaño total del caché de datos de nivel 2 es 256k. En el segundo paso, sabemos que cada línea de caché es de 64 bytes, por lo tanto, el caché de datos de nivel2***256k. /64=2^12= 4096 líneas.
Imagínese una tabla con 64 bytes por fila, 4096 filas y un tamaño de 256k. Esta es la estructura simple de nuestro caché. Para garantizar que se produzca un error cada vez que se recuperan los datos, debemos recuperar los datos en pasos de = 64 bytes.
Primero cree una matriz de 512 K, que es el doble del tamaño del caché.
Si la matriz también es de 256k, cuando finaliza el primer ciclo y los datos se recuperan desde el principio nuevamente después de que se agote la matriz, el caché ya no se reemplazará, por lo que no volverán a ocurrir errores de caché para garantizar ese caché. Se producen errores cada vez que se recuperan datos. La matriz debe tener al menos el doble del tamaño de la caché o más.
Bucle para leer los datos en la matriz, lea un tamaño int cada vez, luego agregue 64, luego lea los datos de la siguiente línea de caché y realice un bucle hasta que se eliminen todos los datos de la matriz.
Los errores de caché de estadísticas de Oprofile tienen un límite mínimo (mi versión 0.9.8 es 2.000.000 de veces), por lo que si el número de errores que ocurren es demasiado pequeño, no se puede utilizar, así que aumente el número de ciclos a 5.000.000.
4. En este punto, se puede realizar la prueba de 100 errores de caché. Sin embargo, después de la prueba, se descubrió que el error de caché no ocurrió en absoluto. Le pregunté al jefe. Para obtener ayuda, antes recordé que x86 tiene una captación previa de hardware del búfer de flujo. Si recupera datos con mucha regularidad, después del entrenamiento, el captador previo de hardware colocará los datos que desea directamente en el caché antes de que realmente los obtenga. Por lo tanto, para realizar una prueba de fallo de caché en un servidor con procesador Xeon, debe desactivar la captación previa de hardware después de reiniciar el sistema. De lo contrario, deberá modificar el programa y escribir un código que obtenga datos verdaderamente aleatorios. Sin embargo, esto no puede garantizar que la tasa de errores de caché sea 100. Solo puede garantizar que la tasa de aciertos de caché sea relativamente baja.
5. La tasa de errores de caché de mcf en SPEC CPU2006 es muy alta, por lo que puede usarse para pruebas.
No se muestra el uso de oprofile por el momento. Si tiene alguna pregunta, deje un mensaje para discutirla.