2012-04-25 7 views
13

Nella mia applicazione, a un certo punto ho bisogno di eseguire calcoli su un grande blocco contiguo di dati di memoria (100s di MB). Quello che stavo pensando è stato di mantenere il prefetching della parte del blocco che il mio programma toccherà in futuro, così che quando eseguo i calcoli su quella parte, i dati sono già nella cache.Prefetching dei dati nella cache per x86-64

Qualcuno può darmi un semplice esempio di come ottenere ciò con gcc? Ho letto _mm_prefetch da qualche parte, ma non so come usarlo correttamente. Si noti inoltre che ho un sistema multicore, ma ogni core lavorerà su una diversa regione di memoria in parallelo.

+6

Se l'accesso alla memoria è sequenziale, il prefetcher hardware lo farà già per te. Quindi probabilmente non migliorerai molto con il prefetch manuale. – Mysticial

+6

Vedere questa domanda per un esempio di dove il precaricamento effettivamente aiuta: http://stackoverflow.com/questions/7327994/prefetching-examples – Mysticial

+2

Vuoi dire che il prefetcher dell'hardware riconosce in qualche modo che sto utilizzando aree contigue in memoria e porto quelle porzioni nella cache ? – pythonic

risposta

16

gcc utilizza le funzioni integrate come interfaccia per le istruzioni di livello inferiore. In particolare per il tuo caso __builtin_prefetch. Ma si dovrebbe vedere una differenza misurabile quando si utilizza questo nei casi in cui il modello di accesso non è facile da prevedere automaticamente.

13

Le moderne CPU hanno un buon prefetch automatico e potreste scoprire che fate più male che bene se provate ad avviare il precaricamento del software. È molto probabile che ci sia molto più "basso appeso" che puoi concentrarti sull'ottimizzazione se trovi che hai effettivamente un problema di prestazioni. Il prefetch tende ad essere una delle ultime cose che potresti provare, quando sei alla disperata ricerca di un throughput in più.

+4

+1 Ho provato il prefetching in almeno 10 diverse occasioni. Solo una volta sono riuscito a ottenere un notevole aumento di velocità. (quello che ho inserito nei commenti.) – Mysticial

+4

Concordato - anche su CPU meno recenti con prefetching automatico meno sofisticato era sempre difficile ottenere benefici dal prefetch del software - i problemi principali consistono nel fatto che in genere è necessario avviare il precaricamento di alcune centinaia di cicli di clock in anticipo e, naturalmente, è necessario disporre di una larghezza di banda di memoria di riserva che è possibile sfruttare, cosa che spesso non si verifica nel codice ad alte prestazioni. –

+1

Il prefetch non è necessario, finché non è necessario. Nella mia attuale applicazione - i pattern di accesso alla memoria non sono stati individuati dal pre-fetcher hardware. E sfortunatamente, non è stato possibile modificare questi modelli di accesso per essere più precocivoli. Quindi _mm_prefetch. Il throughput è diminuito del ~ 10%, ma abbiamo raggiunto i numeri di latenza che volevamo. È stato un compromesso molto consapevole che è stato fatto dopo una profilazione molto approfondita tramite perf e vtune. – quixver

Problemi correlati