Allocazione dinamica in C
Enrico Colombini
erix a erix.it
Ven 31 Dic 2004 09:23:35 UTC
On Thursday 30 December 2004 18:02, Bauno wrote:
> Posso capire che l'accesso alla memoria sia molto + lento dell'esecuzione
> di istruzioni in una cache L1 sincrona, ma da qui a rendere un lookup meno
> performante di centinaia di migliaia (!) di operazioni, mi sembra un po'
> strano (anche se dipende, è chiaro).
Sono stato un po' troppo sintetico :-) Era un trattamento di immagine in tempo
reale e la look-up table evitava 6-7 operazioni a pixel, sostituendole con un
accesso all'array. Le operazioni risparmiate erano quindi moltiplicate per il
numero dei pixel, dal che mi aspettavo un miglioramento... invece trovai un
vistoso peggioramento.
> Però sto facendo fatica a capire come il discorso sulle maggiori
> performance dell'L1 cache si inserisca in quello sull'allocazione dinamica
> e sulle maggiori performance dell'aritmetica dei puntatori...:-?
Semplice: nel caso del singolo array lineare (che simula una matrice
bidimensionale) ci sono due accessi: uno al pointer di base dell'array stesso
e uno all'elemento di destinazione, piu' le variabili intermedie che sono
nello stack frame o nei registry; il pointer di base e' sicuramente nella
cache, lo stack frame pure e a questo punto il caching dipende solo dal
pattern di accesso all'array (in rapporto alle caratteristiche della cache).
Nel caso dell'array di pointer, invece, si risparmiano istruzioni di calcolo
ma si introduce un secondo accesso, quello al pointer di riga che sta in
un'area di memoria allocata separatamente, complicando (almeno
potenzialmente) il lavoro della cache, specie nel caso che le righe siano
parecchie e/o allocate anch'esse una per una, come solitamente accade.
(il che risponde anche alla tua considerazione sulla prevedibilita' del
caching: qualcosa si puo' fare minimizzando gli accessi separati o lontani
fra loro).
.Erix.
Maggiori informazioni sulla lista
Lug
|