2010-03-04 20 views
6

Quiero portar un pequeño fragmento de código en el procesador ARM Cortex A8. Tanto el caché L1 como el caché L2 son muy limitados. Hay 3 arreglos en mi programa. Dos de ellos se acceden secuencialmente (tamaño> Matriz A: 6 MB y Matriz B: 3 MB) y el patrón de acceso para el tercer conjunto (tamaño> Matriz C: 3 MB) es impredecible. Aunque los cálculos no son muy rigurosos, pero hay enormes fallas de caché para acceder a la matriz C. Una solución que pensé sería asignar más espacio en caché (L2) para la matriz C y menos para la matriz A & B. Pero no puedo para encontrar cualquier forma de lograr esto. Pasé por el motor de precarga de ARM pero no pude encontrar nada útil.Optimizar el uso de la memoria caché ARM para diferentes matrices

Respuesta

1

Sería una buena idea dividir el caché y asignar cada arreglo en una parte diferente del mismo.

Desafortunadamente eso no es posible. Los cachés de CortexA8 simplemente no son tan flexibles. El buen viejo StrongArm tenía un caché secundario para exactamente este propósito de división, pero ya no está disponible. Tenemos cachés L1 y L2 en su lugar (en general un cambio bueno en mi humilde opinión.)

Sin embargo, hay una cosa que puede hacer:

La unidad NEON SIMD de la CortexA8 va a la zaga de la unidad de procesamiento de propósito general en un 10 ciclos de procesador. Con la programación inteligente puede emitir prefijos de caché desde la unidad de propósito general, pero hacer los accesos a través de NEON. La demora entre las dos canalizaciones da a la memoria caché un poco de tiempo para realizar las captaciones previas, por lo que el tiempo de caché promedio será menor.

El inconveniente es que si nunca debe mover el resultado de un cálculo desde NEON a la unidad ARM. Como NEON queda rezagado, se producirá un enjuague completo de la CPU. Casi si no es incluso más costoso que un error de caché.

La diferencia en el rendimiento puede ser significativa. De la nada, esperaría algo entre 20% y 30% de mejora en la velocidad.

0

Según lo que pude encontrar a través de Google, parece que ARMv7 (que es la versión del ISA que admite Cortex A8) tiene capacidad de caché, aunque no pude encontrar una referencia clara sobre cómo usarlo - - Quizás puedas hacerlo mejor si pasas más tiempo en él que uno o dos minutos que pasé escribiendo "Flush en caché ARM" en un cuadro de búsqueda y leyendo los resultados.

En cualquier caso, debe poder lograr una aproximación de lo que desea al emitir periódicamente instrucciones de "descarga" para eliminar las partes de A y B que sabe que ya no necesita.

Cuestiones relacionadas