Ci sono CPU che eseguono questa possibile ottimizzazione della scrittura della cache L1?

9

Quando la CPU con una cache L1 fa una scrittura, ciò che normalmente accade è che (supponendo che la linea di cache che sta scrivendo sia già nella cache L1) la cache (oltre ad aggiornare i dati) segni quella cache linea sporca, e scriverà la linea con i dati aggiornati in un secondo momento.

Una possibile ottimizzazione sarebbe quella di far confrontare la cache con il contenuto della scrittura e il contenuto precedente della cache e, se sono uguali, non segnare la linea come sporca. Poiché questo potrebbe consentire alla cache di evitare di volta in volta rotture, posso vedere come il produttore della CPU potrebbe vedere come ciò valga le porte necessarie per fare questa logica.

La mia domanda: ci sono CPU che eseguono questa ottimizzazione?

Background sul motivo per cui ti sto chiedendo: sto scrivendo del codice che deve avere accesso costante alla memoria; cioè, qualcuno che è in grado di ascoltare il comportamento della cache non dovrebbe essere in grado di dedurre quello che sto facendo. Alcuni dei miei accessi sono scritture e, in modo ovvio, per implementare questo codice, molte delle scritture scriveranno gli stessi dati già presenti. Ho bisogno di fare le scritture perché, a seconda dei dati, i dati che sto scrivendo possono o meno essere uguali, ed è importante eseguire la stessa azione a prescindere. Se la CPU ottimizza in realtà non scrivendo un 'no-change-write', ciò significherebbe che il comportamento della cache varierebbe a seconda di cosa sto facendo, cosa che sovvertirebbe il mio obiettivo.

Quindi, c'è una CPU che tenta di ottimizzare le scritture in questo modo?

    
posta poncho 16.11.2015 - 19:44
fonte

3 risposte

3

Da ore di ricerca, non ero in grado di trovare una CPU che utilizza questa ottimizzazione specifica. La maggior parte delle ottimizzazioni menzionate di solito sono relative a hit / miss con operazioni di lettura / scrittura e accesso ai dati:

(pagine 7 e) link

Tuttavia, ciò non significa che questa ottimizzazione non possa essere eseguita. In generale, è possibile accedere a livello di programmazione alle dimensioni di una linea di cache della CPU. È anche possibile accedere ai valori correnti nei registri della cache, ma è piuttosto pericoloso farlo. Se accedete ai registri sbagliati in un brutto momento, potreste manometterli con quelli relativi a un programma in esecuzione. Oppure potresti inavvertitamente modificare il contenuto delle linee che stai cercando di leggere.

Recupero del valore corrente nella cache del registro

Inoltre, tutte le soluzioni teoriche richiedono una qualche forma di implementazione software (assemblatore). Il più vicino che ho trovato riguarda l'architettura ARM, che sembra consentire la manipolazione della cache. Oltre a questo, è necessario conoscere anche le dimensioni di una linea di cache per la CPU desiderata. È possibile leggere attentamente il contenuto della cache in una posizione secondaria in memoria, in incrementi di dimensioni linea, e confrontarlo con i dati che stanno per essere scritti nei registri (o linee della cache L1, in questo caso).

Leggi i contenuti della cache della CPU

Da lì, potresti ideare un sistema basato su software che prevenga riscritture identiche. Anche se questo è un po 'semplificato, è così perché la soluzione deve essere applicabile a qualsiasi CPU esistente.

Un'altra possibilità che ho trovato relativa alla coerenza della cache:

Passaggio pertinente da un articolo di Wikipedia sulla coerenza di

Il punto principale che ha attirato la mia attenzione, in relazione a questo problema, era la descrizione di Snarfing:

It is a mechanism where a cache controller watches both address and data in an attempt to update its own copy of a memory location when a second master modifies a location in main memory. When a write operation is observed to a location that a cache has a copy of, the cache controller updates its own copy of the snarfed memory location with the new data.

In altre parole, ci sono probabilmente dei meccanismi già in atto. È solo che potrebbero non essere utilizzati per l'ottimizzazione che hai suggerito. Dovresti implementare un software che esegua il confronto di lettura / scrittura.

    
risposta data 06.12.2015 - 08:20
fonte
3

Scrivere sulla cache L1 è un'operazione molto, molto critica.

Scrivere gli stessi identici dati sul retro sembra essere piuttosto raro. Un'ottimizzazione che accelera le cose in questo caso particolare non sta andando a ottenere un sacco di accelerazione in totale.

D'altra parte, questa ottimizzazione richiede un confronto tra vecchi dati e nuovi dati su ogni singola scrittura nella memoria cache. Ciò che lo rende peggiore è che richiede che i dati da scrivere siano effettivamente disponibili al momento della scrittura!

Di solito non è il caso di una CPU moderna. Ad esempio, i dati da scrivere possono ancora essere calcolati. La cache può ancora andare avanti, caricare la linea della cache, se necessario, contrassegnare la linea della cache come modificata e così via, anche prima del completamento del calcolo. Tutta la conservazione del libro può essere già eseguita tranne la reale modifica della linea della cache. Se si desidera confrontare il risultato appena scritto e i vecchi dati della cache, ciò non è possibile.

Ad esempio, se hai codice C a [i] = x / y; la divisione x / y richiede un tempo straordinariamente lungo per funzionare sulla maggior parte delle CPU. Tuttavia, la maggior parte del lavoro necessario per gestire la memorizzazione del risultato in un [i] è accaduto molto prima che la divisione termini; l'unica cosa che manca è lo spostamento di otto byte risultato alla linea della cache. Un'operazione che scarica la linea della cache attenderà automaticamente fino al completamento della divisione. Un'operazione che legge un [i] verrà probabilmente reindirizzata per ottenere il risultato direttamente dal divisore.

    
risposta data 06.12.2015 - 16:27
fonte
1

One possible optimization would be to have the cache compare the contents of the write and the previous contents of the cache, and if they're the same, don't mark the line as dirty

Questa ottimizzazione non raddoppierà il tempo necessario alla CPU per scrivere qualcosa nella cache? Poiché ciascuna scrittura della riga della cache verrà ora accompagnata da un'operazione di confronto, che non è gratuita.

Quindi, attualmente l'ottimizzazione dipenderà dal fattore molto vago: quante volte un software medio riscrive la sua memoria memorizzabile nella cache con gli stessi dati.

    
risposta data 20.11.2015 - 08:44
fonte

Leggi altre domande sui tag