Programmazione cache C++ consapevole




optimization caching (6)

c'è un modo in C ++ per determinare la dimensione della cache della CPU? Ho un algoritmo che elabora un sacco di dati e mi piacerebbe suddividere questi dati in blocchi in modo che si adattino alla cache. È possibile? Potete darmi qualche altro suggerimento sulla programmazione tenendo conto delle dimensioni della cache (specialmente riguardo all'elaborazione di dati multithread / multicore)?

Grazie!


È interessante notare che ho scritto un programma per farlo da un po 'di tempo fa (in C però, ma sono sicuro che sarà facile da incorporare nel codice C ++).

http://github.com/wowus/CacheLineDetection/blob/master/Cache%20Line%20Detection/cache.c

La funzione get_cache_line è quella interessante, che restituisce il punto giusto prima del picco maggiore nei dati di temporizzazione degli accessi agli array. Ha indovinato correttamente sulla mia macchina! Se altro, può aiutarti a crearne uno tuo.

Si basa su questo articolo, che originariamente suscitava il mio interesse: http://igoro.com/archive/gallery-of-processor-cache-effects/


A seconda di cosa stai cercando di fare, potresti anche lasciarlo in qualche libreria. Poiché si parla di elaborazione multicore, è possibile dare un'occhiata a Intel Threading Building Blocks .

TBB include allocatori di memoria sensibili alla cache. Più specificamente, controlla cache_aligned_allocator (nella documentazione di riferimento, non sono riuscito a trovare alcun collegamento diretto).


La cache di solito fa la cosa giusta. L'unica vera preoccupazione per il normale programmatore è la condivisione falsa, e non è possibile prenderla in considerazione al momento dell'esecuzione perché richiede le direttive del compilatore.


Lo stesso C ++ non "cura" delle cache della CPU, quindi non c'è supporto per l'interrogazione delle dimensioni della cache incorporate nella lingua. Se si sta sviluppando per Windows, esiste la funzione GetLogicalProcessorInformation()-function , che può essere utilizzata per richiedere informazioni sulle cache della CPU.


Puoi vedere questo thread: http://software.intel.com/en-us/forums/topic/296674

La risposta breve è in questo altro thread:

Sul moderno hardware IA-32, la dimensione della linea cache è 64. Il valore 128 è un retaggio della Microarchitettura Intel Netburst (ad es. Intel Pentium D) in cui le linee a 64 byte sono accoppiate in settori a 128 byte. Quando viene recuperata una linea in un settore, l'hardware recupera automaticamente anche l'altra linea nel settore. Quindi, da una falsa prospettiva di condivisione, la dimensione effettiva della linea è 128 byte sui processori Netburst. ( http://software.intel.com/en-us/forums/topic/292721 )


Secondo " Quello che ogni programmatore dovrebbe sapere sulla memoria ", di Ulrich Drepper puoi fare quanto segue su Linux:

Una volta che abbiamo una formula per i requisiti di memoria, possiamo confrontarla con la dimensione della cache. Come accennato in precedenza, la cache potrebbe essere condivisa con più altri core. Attualmente {Ci sarà sicuramente presto un modo migliore!} L'unico modo per ottenere informazioni corrette senza la conoscenza di hardcoding è attraverso il filesystem / sys. Nella Tabella 5.2 abbiamo visto ciò che il kernel pubblica sull'hardware. Un programma deve trovare la directory:

/sys/devices/system/cpu/cpu*/cache

Questo è elencato nella Sezione 6: Cosa possono fare i programmatori .

Descrive anche un breve test proprio sotto la Figura 6.5 che può essere usato per determinare la dimensione della cache L1D se non è possibile ottenerlo dal sistema operativo.

C'è un'altra cosa che ho trovato nel suo articolo: sysconf(_SC_LEVEL2_CACHE_SIZE) è una chiamata di sistema su Linux che dovrebbe restituire la dimensione della cache L2 anche se non sembra essere ben documentata.







cpu-cache