No estoy seguro de cómo explicar algunos de los resultados de rendimiento de mi código de multiplicación de matriz paralela
Estoy ejecutando este código en OpenMP para la multiplicación de matrices y medí sus resultados:
#pragma omp for schedule(static)
for (int j = 0; j < COLUMNS; j++)
for (int k = 0; k < COLUMNS; k++)
for (int i = 0; i < ROWS; i++)
matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];
Hay diferentes versiones del código en función de dónde coloco el#pragma omp
directiva: antes del bucle j, el bucle k o el bucle i. Además, para cada una de esas variantes ejecuté diferentes versiones para la programación estática predeterminada, la programación estática con los fragmentos 1 y 10 y la programación dinámica con los mismos fragmentos. También medí el número de accesos de CC, fallos de CC, relojes de CPU, instrucciones retiradas y otros indicadores de rendimiento en CodeXL. Aquí están los resultados para la matriz de tamaño 1000x1000 en AMD Phenom I X4 945:
Resultados de mediciones de desempeño
Dóndemultiply_matrices_1_dynamic_1
es una función con#pragma omp
antes del primer ciclo y la programación dinámica con el fragmento 1, etc. Aquí hay algunas cosas que no entiendo bien sobre los resultados y agradecería ayuda:
Además, estoy confundido acerca de la relación de los errores de TLB con los errores de caché. ¿Cuándo se usa DTLB específicamente? El documento de mi profesor dice que cada acceso de DC es una solicitud de DTLB, pero no entiendo cómo funciona: la cantidad de fallas de TLB es a menudo mayor que la cantidad de accesos de DC. ¿Cómo calculo el índice de fallas TLB? Mi profesor dice que son errores TBL / accesos DC. También dice que puedo calcular la localidad temporal por la relación de aciertos de caché y la localidad espacial por la relación de aciertos TLB. Como funciona exactamente?