2012-04-13 12 views
6

Quando diverse variabili si trovano all'interno della stessa riga della cache, è possibile provare False Sharing, il che significa che anche se due thread diversi (in esecuzione su core diversi) accedono a due variabili diverse, se quelle due variabili risiedono nel stessa linea della cache, si avrà un impatto sulle prestazioni, poiché ogni volta verrà attivata la coerenza della cache.False Condivisione e Variabili atomiche

Ora queste variabili sono variabili atomiche (per atomico intendo le variabili che introducono una recinzione di memoria, come ad esempio lo atomic<t> di C++), la condivisione falso è importante, oppure non importa se le variabili atomiche si trovano nella stessa cache linea o no, come presumibilmente introdurranno la coerenza della cache comunque. In altre parole, mettere le variabili atomiche nella stessa riga della cache rende l'applicazione più lenta rispetto a non inserirle nella stessa riga della cache?

risposta

5

Un chiarimento: per conseguenze negative almeno alcuni accessi a variabili "falsamente condivise" dovrebbero essere scritti. Se le scritture sono rare, l'impatto sul rendimento della condivisione falsa è piuttosto trascurabile; più le scritture (e quindi i messaggi invalidi della riga di cache) peggiorano le prestazioni.

Anche con l'atomica, la condivisione della linea cache (falsa o vera) è ancora importante. Cerca qualche prova qui: http://www.1024cores.net/home/lock-free-algorithms/first-things-first. Pertanto, la risposta è: sì, posizionare le variabili atomiche utilizzate da diversi thread sulla stessa riga della cache potrebbe rendere l'applicazione più lenta rispetto a metterle su due linee diverse. Tuttavia, penso che sarà per lo più inosservato, a meno che l'app passi una parte significativa del proprio tempo ad aggiornare queste variabili atomiche.

0

inserendo le variabili atomiche nella stessa riga della cache rendono l'applicazione più lenta rispetto a non inserirle nella stessa riga della cache?

False condivisione delle variabili "atomiche" potrebbe portare a problemi di performance (se sia o non sarà portare a questi problemi dipende da un sacco di cose).

Supponiamo di avere due core, A e B, e ognuno di essi opera sulla propria variabile. Chiamiamo queste variabili a e b rispettivamente.

A ha a nella sua cache e B ha nella cache b.

Considerare cosa succede quando incrementi Aa.

  • se a e b condividere una linea di cache,B 's copia di b otterrà invalidata, e la sua successiva Accesso alle b saranno soggetti a una cache miss.
  • se a e b non condividono una linea di cache, non c'è alcun impatto sulle B quanto riguarda la sua copia cache della b è interessato.

Ciò accade indipendentemente dal fatto a e b sono "atomica".

0

Se si utilizzano variabili atomiche con i requisiti di coerenza più elevati, una barriera di memoria completa, l'effetto della condivisione errata probabilmente non sarà evidente.Per un tale accesso, la prestazione di un'operazione atomica è fondamentalmente limitata dalla latenza di accesso alla memoria. Quindi le cose sono lente comunque, non credo che si otterrebbero molto più lentamente in presenza di false condivisioni.

Se si dispone di altri ordini di memoria meno invadenti, la prestazione colpita dall'atomica stessa potrebbe essere inferiore e pertanto l'impatto della condivisione errata potrebbe essere significativo.

In totale, vorrei prima esaminare le prestazioni dell'operazione atomica stessa prima di preoccuparmi di false condivisioni per tali operazioni.

Problemi correlati