2015-06-24 9 views
6

Sono curioso del comportamento della cache. Ecco alcune domande relative alla cache qui sotto:Il nuovo/malloc o delete/free occupa o annulla le linee della cache?

  1. L'operazione di scrittura porta i dati nella cache? Considerando un compito come A [i] = B [i], A [i] verrà caricato nella cache? Poiché scrivo qualcosa in A [i] invece di leggere il suo valore.

  2. Quando si assegna una memoria di grandi dimensioni, la memoria potrebbe provenire dal sistema operativo. E il sistema operativo inizializzerà i dati a zero per motivi di sicurezza (Reference). Se i compiti porteranno i dati nella cache (domanda 1), questo meccanismo occuperà la cache?

  3. Si supponga che sia presente un array B assegnato e che l'intera B sia ora nella cache. Le linee della cache occupate da B diventano non valide (disponibili) subito dopo l'array B libero?

Qualcuno potrebbe darmi un suggerimento?

+0

Direi che questo non è qualcosa controllato dalla lingua. Per la lingua, tutto ciò è astratto come "memoria". Vedi [questo] (http://www.programcreek.com/2012/10/how-is-an-array-stored-in-memory-and-brought-to-cache/) però. –

+0

@ArjunSreedharan: il compilatore conosce il sistema operativo e la CPU. Potrebbe aggiungere istruzioni per il controllo della cache. – MSalters

risposta

3

Da qui https://people.freebsd.org/~lstewart/articles/cpumemory.pdf

-

  1. Does scrivere operazione portare i dati nella cache?

Dall'articolo:

Di default tutti i dati letti o scritti dai core della CPU è memorizzato nella cache . Vi sono aree di memoria che non possono essere memorizzate nella cache, ma questo è qualcosa di cui devono preoccuparsi solo gli implementatori del sistema operativo; è non visibile al programmatore dell'applicazione. Esistono anche le istruzioni che consentono al programmatore di ignorare deliberatamente determinate cache. Questo saranno discussi nella sezione 6.

-

  1. Nell'assegnazione grande memoria, la memoria può venire dal sistema operativo. questo meccanismo occuperà la cache?

Forse no. Occuperà la cache solo dopo aver letto o scritto i dati. Dall'articolo:

Sui sistemi operativi come Linux con il supporto della domanda di paging, una chiamata mmap modifica solo le tabelle di pagina ... No memoria effettiva è allocato al momento della chiamata mmap.

La parte di allocazione si verifica quando si accede per la prima volta a una pagina di memoria, leggendo o scrivendo dati o eseguendo il codice. Nella risposta al conseguente errore di pagina, il kernel prende il controllo e determina, usando l'albero della tabella della pagina, i dati che devono essere presenti sulla pagina . Questa risoluzione dell'errore di pagina non è economica, ma succede per ogni singola pagina utilizzata da un processo.

-

3 .Assume che v'è un array allocato B, e l'intero B è ora nella cache. Le linee della cache occupate da B diventano non valide (disponibili) subito dopo l'array B libero?

dall'articolo invalidazione di una linea di cache avviene solo quando v'è stata un'operazione di scrittura su un altro CPU

Che ha sviluppato nel corso degli anni è la MESI coerenza della cache protocollo (Modified, Esclusivo, Condiviso , Non valido). Il protocollo prende il nome da i quattro stati in cui può essere inserita una linea di cache quando si utilizza il protocollo MESI. ... Se il secondo processore desidera scrivere sulla linea cache, il primo processore invia il contenuto della riga cache e contrassegna la linea cache localmente come non valida.

E anche la linea di cache può essere sfrattati:

un altro particolare della cache che è piuttosto interessante per i programmatori è la strategia di sostituzione della cache. La maggior parte delle cache sfrutta prima l'elemento meno recente (LRU).

E dalla mia esperienza con TCMalloc free() non è un motivo valido per sfrattare la memoria da una cache. Al contrario potrebbe essere dannoso per le prestazioni. Su free() TCMalloc mette semplicemente un blocco di memoria liberato nella sua cache. E questo blocco di memoria verrà restituito da malloc() quando un'applicazione richiederà un blocco di memoria la volta successiva. Questa è l'essenza di un coclea di allibratori come TCMalloc. E se questo blocco di memoria è ancora in cachethen, è ancora meglio per le prestazioni!

+0

In aggiunta a 3): In teoria, free/delete potrebbe esplicitamente emettere istruzioni/richieste di invalidazione della cache - non ho mai visto nessuna implementazione farlo comunque. – nos

2

Questo è un articolo interessante dove potrete trovare maggiori informazioni (probabilmente troppo) su ciò che si sta chiedendo circa:

What every programmer should know about memory

quanto riguarda la tua domanda ogni operazione si fa sulla memoria verrà memorizzata nella cache. Come programmatore non hai alcun controllo su di esso (e il sistema operativo non lo ha). Tenere presente che se è necessario implementare un algoritmo di consumo di spazio (memoria), provare ad aumentare la località di memoria.

Quindi, supponendo che si abbia a che fare con 1 GB di dati, provare a suddividere il calcolo in cluster (sezioni di dati) e provare a eseguire tutte le operazioni una sezione alla volta. In questo modo utilizzerai effettivamente i dati dalla cache e non avrai bisogno di accedere alla memoria esterna ogni volta. Questo potrebbe darti un aumento delle prestazioni.

+0

In realtà il sistema operativo ha molto controllo sulla cache, e necessariamente così. Sarebbe piuttosto brutto se la cache della CPU contenesse i dati rimanenti dal processo in esecuzione in precedenza. E poiché la CPU non conosce i processi, questa deve essere applicata al sistema operativo. – MSalters

1

Per rispondere alla domanda del titolo, no. Queste operazioni non invalidano le cache e in modo abbastanza intenzionale. Cosa succede alla memoria liberata? Ci sono due casi importanti. Uno, la memoria viene immediatamente riciclata per l'allocazione successiva dei programmi. Avere l'indirizzo ancora nella cache è efficiente in questo caso, in quanto riduce il numero di scritture nella memoria principale.

Ma anche se la memoria non viene riutilizzata direttamente, l'allocatore di memoria può unire blocchi liberi dietro le quinte o eseguire altre operazioni. Questo spesso comporta la scrittura nello spazio precedentemente assegnato dai tuoi dati. Dopo tutto, liberare memoria non distrugge fisicamente la memoria. Si limita a impostare il proprietario. Dopo delete, la proprietà viene trasferita dal programma al runtime o al sistema operativo.

Problemi correlati