Sto lavorando su un sistema, scritto in C++, in esecuzione su una Xeon su Linux, che deve essere eseguito il più velocemente possibile. C'è una grande struttura dati (fondamentalmente una serie di strutture) conservata nella RAM, oltre 10 GB, e gli elementi di esso devono essere accessibili periodicamente. Voglio rivedere la struttura dei dati per lavorare il più possibile con il meccanismo di caching del sistema.Quanti byte un Xeon porta nella cache per accesso alla memoria?
Attualmente, gli accessi vengono eseguiti in modo casuale in tutta la struttura e ogni volta vengono letti 1-4 indici da 32 bit. È molto prima che un'altra lettura avvenga nello stesso posto, quindi non c'è alcun beneficio dalla cache.
Ora so che quando si legge un byte da una posizione casuale nella RAM, più di quel byte viene portato nella cache. La mia domanda è: quanti byte vengono portati? Sono 16, 32, 64, 4096? Si chiama una linea della cache?
Sto cercando di ridisegnare la struttura dei dati per ridurre al minimo gli accessi RAM casuali e lavorare con la cache anziché contro di essa. Sapendo quanti byte sono tirati nella cache in un accesso casuale informerà le scelte progettuali che faccio.
Aggiornamento (ottobre 2014): Poco dopo aver posto la domanda sopra il progetto è stato messo in attesa. Da allora ha ripreso e sulla base di suggerimenti nelle risposte di seguito, ho eseguito alcuni esperimenti sull'accesso alla RAM, perché sembrava probabile che il thriller TLB stesse accadendo. Ho rivisto il programma per girare con pagine enormi (2 MB anziché lo standard 4KB) e ho osservato una piccola accelerazione, circa il 2,5%. Ho trovato ottime informazioni sulla configurazione di enormi pagine here e here.
Sì, linea cache. Puoi assumere 64 byte fino a quando non hai capito quale dei dozzine di modelli di processori Xeon hai. Anche le cache L2 e L3 hanno un ruolo. Concentrati sugli accessi sequenziali alla memoria e non assumere nulla.Misurare. –
Grazie a tutti per le vostre risposte. –