Invalidando la cache della CPU
Domanda
Quando il mio programma esegue l'operazione di caricamento con la semantica acquisiscono / negozio con la semantica di rilascio o forse un full-recinto, si invalida la cache della CPU.
La mia domanda è questa: quale parte della cache è in realtà invalidata? solo la cache-line che ha tenuto la variabile che ho usato acquisiscono / release? o forse l'intera cache viene invalidata? (L1 + L2 + L3 .. e così via?). C'è una differenza in questo argomento quando uso la semantica acquisiscono / rilascio, o quando uso un full-recinto?
Soluzione
Io non sono un esperto su questo, ma mi sono imbattuto su questo documento, forse è utile http://www.rdrop.com/users/ paulmck / scalabilità / carta / whymb.2009.04.05a.pdf
Altri suggerimenti
Quando si esegue un carico senza recinzioni o mutex, allora il valore caricato potrebbe potenzialmente provenire da qualsiasi parte, vale a dire, le cache, registri (per mezzo di ottimizzazioni del compilatore), o RAM ... ma dalla tua domanda, si sapeva già questo .
Nella maggior parte delle implementazioni mutex, quando si acquista un mutex, un recinto viene sempre applicato, in modo esplicito (per esempio, mfence, barriere, ecc) o implicito (ad esempio, il prefisso di blocco per bloccare il bus su x86). Questo fa sì che la cache linee di tutte le cache sul percorso per essere invalidata.
Si noti che l'intera cache non è inficiata, solo le rispettive cache-linee per la locazione di memoria. Questo include anche le linee per il mutex (che di solito è implementato come un valore in memoria).
Naturalmente, ci sono specifici per l'architettura dettagli, ma questo è come funziona in generale.
Si noti inoltre che questa non è l'unica ragione per la cache invalidanti, come ci possono essere operazioni su una CPU che avrebbe bisogno cache su un altro essere invalidato. Facendo una ricerca su Google per "i protocolli di coerenza della cache" vi fornirà un sacco di informazioni su questo argomento.