2010-03-04 8 views
6

Voglio portare un piccolo pezzo di codice sul processore ARM Cortex A8. Sia la cache L1 che la cache L2 sono molto limitate. Ci sono 3 array nel mio programma. Due di questi sono ad accesso sequenziale (dimensione> Array A: 6 MB e Array B: 3 MB) e il modello di accesso per il terzo array (dimensione> Array C: 3 MB) è imprevedibile. Anche se i calcoli non sono molto rigorosi ma ci sono enormi errori di cache per l'accesso all'array C. Una soluzione che ho pensato sarebbe di allocare più spazio di cache (L2) per array C e meno per Array A & B. Ma non sono in grado trovare un modo per ottenere questo. Ho passato il motore di precarico di ARM ma non ho trovato nulla di utile.Ottimizzazione dell'utilizzo della cache ARM per array diversi

risposta

1

Sarebbe una buona idea dividere la cache e allocare ogni array in una parte diversa di esso.

Purtroppo ciò non è possibile. Le cache di CortexA8 non sono così flessibili. Il buon vecchio StrongArm aveva una cache secondaria esattamente per questo scopo di suddivisione, ma non è più disponibile. Abbiamo cache L1 e L2 invece (nel complesso un buon cambiamento imho.)

Tuttavia, c'è una cosa che puoi fare:

L'unità NEON SIMD della CortexA8 in ritardo rispetto l'unità generale di elaborazione scopo di circa il 10 cicli del processore. Con una programmazione intelligente è possibile emettere prefets cache dall'unità di uso generale, ma effettuare gli accessi tramite NEON. Il ritardo tra le due pipeline dà alla cache un po 'di tempo per fare i prefetches, quindi il tempo medio di mancanza della cache sarà inferiore.

Lo svantaggio è che se non si deve spostare mai il risultato di un calcolo da NEON all'unità ARM. Poiché NEON è in ritardo, ciò causerà un flush completo della pipeline della CPU. Quasi se non addirittura più costoso come una mancanza di cache.

La differenza di prestazioni può essere significativa. All'improvviso mi aspetterei qualcosa tra il 20% e il 30% del miglioramento della velocità.

0

Da quello che ho trovato tramite Google, sembra che ARMv7 (che è la versione di ISA supportata da Cortex A8) abbia funzionalità di cache-flush, anche se non sono riuscito a trovare un chiaro riferimento su come usarlo - - forse puoi fare di meglio se passi più tempo su di esso rispetto al minuto o due che ho speso digitando "ARM cache flush" in una casella di ricerca e leggendo i risultati.

In ogni caso, dovresti essere in grado di ottenere un'approssimazione di ciò che desideri emettendo periodicamente le istruzioni "flush" per svuotare le parti di A e B che sai che non ti servono più.