2011-09-14 3 views
10

Anche se ho letto le istruzioni di movntdqa a riguardo, ma ho trovato un modo pulito per esprimere un intervallo di memoria non memorizzabile o leggere i dati in modo da non inquinare la cache. Voglio farlo da gcc. Il mio obiettivo principale è quello di passare a posizioni casuali in un array di grandi dimensioni. Sperando di accelerare questa operazione evitando la memorizzazione nella cache poiché vi è una quantità di dati molto bassa.Come dichiarare un intervallo di memoria come non memorizzabile utilizzando gcc su piattaforma x86?

+1

C'è sicuramente un modo per Windows. Non sono sicuro di GCC su Linux. Tuttavia, non sono sicuro di voler dichiarare la memoria letta come non rimovibile. Anche se non inquinerai la cache, potresti (potresti) pagare la piena latenza di memoria per ogni accesso. – Mysticial

+0

Sono d'accordo sul fatto che potrebbe non migliorare le prestazioni. Ma sarei gentile sapere come usare questa funzione. – Sandeep

+1

Non c'è modo di disabilitare la cache della CPU. Né lo vorresti mai, lo renderà orribilmente lento. Le letture della memoria senza cache richiedono più di cento cicli. –

risposta

6

Penso che quello che stai descrivendo sia Memory Type Range Registers. Puoi controllare questi sotto Linux (se disponibile e sei utente 0) usando /proc/mttr/ioctl(2) vedi here per un esempio. Dato che funziona su un intervallo di indirizzi fisico , penso che avrai difficoltà a utilizzarlo in modo ragionevole.

Un modo migliore è di esaminare l'intrinseco del compilatore GCC provides e trovare uno o più, che esprimono il tuo intento. Dai un'occhiata alla serie di Ulrich Drepper su "Cosa ogni programmatore dovrebbe sapere sulla memoria", in particolare part 5 che si occupa di bypassare la cache. Sembra che _mm_prefetch(ptr, _MM_HINT_NTA) potrebbe essere appropriato per le tue esigenze.

Come sempre quando si tratta di prestazioni - misurare, misurare, misurare. La serie di Drepper ha parti eccellenti che descrivono dettagliatamente come questo può essere fatto (part 7), nonché esempi di codice e altre strategie da provare quando si velocizzano le prestazioni della memoria del proprio codice.

2

Tutti i buoni consigli dell'utente786653; specialmente l'articolo Ulrich Drepper. Io aggiungo:

  • fuori cache o no, la VM HW è costretta a guardare in alto pagina di informazioni nel TLB, che ha una capacità limitata. Non sottovalutare l'impatto del TLB che si abbatte sulle prestazioni di accesso casuale. Se non lo sei già, vedi the results here per il motivo per cui vuoi veramente utilizzare huge pages per i dati dell'array e non per il predefinito 4K teeny (che risale ai giorni di "640K dovrebbe essere sufficiente per chiunque"). Ovviamente, se stai parlando di array molto più grandi di persino un TLB pieno di pagine da 2MB puoi fare riferimento, anche questo non aiuta in questo.

  • Cosa hai contro le istruzioni "nt" (ad esempio, _mm_stream_ps intrinseco)? Non sono convinto che dichiarare le pagine non memorizzate ti consenta di ottenere prestazioni migliori rispetto all'uso appropriato di quelle, e sono molto più facili da usare rispetto alle alternative. Sarebbe molto interessato a vedere le prove in contrario però.

Problemi correlati