2012-01-13 7 views
6

È possibile creare in modo esplicito oggetti statici nella cache della CPU, in modo da assicurarsi che tali oggetti rimangano sempre nella cache, in modo che nessun impatto sulle prestazioni venga mai raggiunto dal raggiungimento della RAM o di Dio non voglia - memoria virtuale hdd?Assegna memoria statica nella cache della CPU in c/C++: è possibile?

Sono particolarmente interessato al targeting della cache condivisa L3 di grandi dimensioni, non intendendo il targeting di L1, L2, istruzione o qualsiasi altra cache, solo il più grande cavedano di memoria on-die che ci sia.

E solo per chiarire per differenziare da altri thread ho cercato prima di postare questo, non sono interessato a privatizzare l'intera cache, solo una piccola, poche classi vale la pena di regione.

+2

Penso che il meglio che puoi fare sia usare la [__builtin_prefetch macro] di GCC (http://gcc.gnu.org/onlinedocs/gcc-3.3.6/gcc/Other-Builtins.html). La cache IIRC non è indirizzabile dal codice, la CPU la gestisce da sé (almeno su x86). –

+1

Che tipo di processore? Alcune architetture hanno istruzioni per fornire suggerimenti sulla cache o per dirigere i prefets della cache prima che i dati siano necessari. – TJD

+1

Breve anwer: no non puoi. L'unica cosa che puoi fare è mantenere la località di riferimento stretta. Non saltare in memoria, ma provare ad accedere ai dati che sono vicini ai dati a cui è stata effettuata l'operazione precedente. Inoltre: mantenere i tuoi dati allineati sui limiti della cache può aiutarti a evitare un altro recupero della cache. BTW gli slot * cache * non devono essere consecutivi. Su x86, ci sono IIRC quattro slot L1 e centinaia o migliaia di slot L2. (che devi condividere con altri processi su una macchina multiprocesso). – wildplasser

risposta

12

No. La cache non è indirizzabile, quindi non è possibile allocare oggetti in essa.

Ciò che sembra chiedere è: Dopo aver allocato spazio nella memoria virtuale, posso garantire che ottengo sempre i riscontri della cache?

Questa è una domanda più complicata e la risposta è: in parte.

È sicuramente possibile evitare di essere scambiati su disco, utilizzando l'API di gestione della memoria del sistema operativo (ad esempio mlock()) per contrassegnare la regione come non modificabile. Oppure allocare da "pool non di paging" per iniziare.

Non credo ci sia un'API simile per fissare la memoria nella cache della CPU. Anche se è possibile riservare la cache della CPU per quel blocco, non è possibile evitare errori di cache. Se un altro core scrive nella memoria, la proprietà verrà trasferita e si verificherà una perdita della cache e il trasferimento del bus associato (probabilmente alla memoria principale, probabilmente alla cache dell'altro core).

Come Mathew menziona nel suo commento, è anche possibile forzare la mancata memorizzazione della cache in parallelo con altri lavori utili nella pipeline, in modo che i dati siano nella cache quando è necessario.

1

È possibile eseguire un altro thread che esegue il loop sui dati e lo inserisce nella cache L3.

Problemi correlati