linux user group brescia

immagine del castello

Archivio della mailing list

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