2012-04-07 26 views
6

Dire se il core A sta modificando una variabile X e il core B sta leggendo quella variabile (X). Ovviamente in questo caso un protocollo di coerenza della cache aggiornerà la cache del core B, poiché X è stato modificato dal core A e naturalmente questa coerenza della cache rallenterà l'esecuzione sul core B. Tuttavia, questa coerenza della cache influenzerà anche le prestazioni del core A, supponendo che la variabile X risieda nella sua cache.In che modo la coerenza della cache influisce sulle prestazioni in questo caso

risposta

3

Sì. Esistono diversi modi in cui può influire sulle prestazioni. Il protocollo standard che le persone usano è una variante di MSI (Modificato, Condiviso, Invalido) a volte con O (Proprietario) e spesso E (Esclusivo) aggiunto al protocollo. Nel tuo esempio, il core A inizierà nello stato Modificato (o Esclusivo) e la lettura del nucleo B forzerebbe il core A a cambiarlo nello stato condiviso. Questa azione richiede cicli nella cache poiché ci sono solo così tante operazioni che il core può eseguire in un dato momento. L'impatto di questo sul Core A non è molto alto, poiché non si trova nel percorso critico. L'impatto maggiore è se il Core A esegue nuovamente una scrittura. Poiché la linea della cache si trova nello stato condiviso (o non valido), deve inviare una richiesta di aggiornamento a M o E. Tale richiesta deve andare a Core B. Questa operazione è sul percorso critico e la scrittura non può terminare fino a quando il blocco cache è aggiornato. Detto questo, le scritture sono generalmente memorizzate nel buffer e il processore in genere non verrà bloccato su questa operazione.

+0

Nel mio caso, il Core A sta scrivendo frequentemente, e il core B a volte legge frequentemente, quindi suppongo che danneggerà un po 'le prestazioni. destra? – pythonic

+2

Se la maggior parte di ciò che il core a sta facendo è scrivere e la maggior parte di ciò che sta facendo il core b è la lettura, allora sì, è possibile incorrere in problemi. Questo è generalmente chiamato ping-pong. Che tipo di comunicazione stai cercando di fare? Ci sono tonnellate di carte su questa roba. Ad esempio, se stai producendo qualcosa sul core A e vuoi consumarlo sul core B, allora dovresti usare un datastructure della coda senza cache, che evita il ping-pong possibile. (Dovrebbe avere concetti come la testa dell'ombra e la coda dell'ombra.) –

+0

Nathan, grazie per un commento così informativo. Vedrò in dettaglio questo ping-ponging. – pythonic

2

Sì, sulle microarchitettura attuali che utilizzano i protocolli di coerenza ME (O) SI, rallenterà anche gli aggiornamenti di A a X. La ragione di ciò è che B's read metterà la linea cache contenente lo X nello stato 'condiviso' prima di copiarlo, e quindi la scrittura di A dovrà invalidare la copia di B per entrare nello stato 'esclusivo' prima di poterlo modificare di nuovo.

Ciò detto, le scritture di A a X potrebbero non bloccare la pipeline di esecuzione di A. Ciò dipende dal modello di consistenza di memoria dell'architettura e dal linguaggio di programmazione e dal fatto che la scrittura sia forzata come un'operazione atomica o una successiva barriera di scrittura.

Problemi correlati