Il raggruppamento dei thread in base all'attività migliora le prestazioni?

2

Questa è una specie di domanda pigra da parte mia, dato che ho rinunciato dopo aver provato solo alcuni termini di Google.

Ma quando ho letto delle prestazioni multi-thread, ho letto che il cambio di contesto è negativo per le prestazioni dal momento che la cache è trucidata o altro.

La mia domanda è, la cache è sempre resa inutilizzabile dopo un cambio di contesto? Che dire quando il contesto viene commutato per condividere gran parte dello stack e forse anche i dati che venivano elaborati nel contesto precedente? Il raggruppamento di pool di thread per attività o categoria di attività aiuta le prestazioni perché ha aumentato questo effetto?

O la cache viene sempre svuotata, indipendentemente dall'interruttore (intrinseco?) dello spazio degli indirizzi o qualcosa del genere?

    
posta Bwmat 16.04.2015 - 23:34
fonte

1 risposta

5

Is the cache always rendered useless after a context switch?

No, per niente.

Gli switch di contesto sono in realtà un concetto del software che gira su una CPU, non su una della CPU stessa. Quando il software decide di eseguire un commutatore di contesto, lo stato della CPU viene salvato in un luogo conveniente, viene caricato uno stato nuovo o precedentemente salvato e l'esecuzione salta all'indirizzo in cui è stato interrotto il processo di conversione. Questo è un po 'troppo semplificato, ma il punto principale è che la CPU sta solo seguendo tutte le istruzioni che gli viene detto di eseguire e non sa o si preoccupa che l'effetto di quelle istruzioni sia un interruttore di contesto.

La cache è il dominio della CPU, che ha le sue regole per ciò che mantiene in quale cache e quando si verificano sfratti o commit ad altre cache o RAM. Supponiamo che tu abbia una CPU single-core a cache singola con un supervisore e due processi. Se il codice e i dati per tutti e tre si inseriscono nella cache, tutti e tre i contesti potrebbero cambiare tra loro per sempre senza dover mai raggiungere il processore. Questo perché ciò che è nella cache rimane valido tra le fasce temporali. L'unica ragione per cui la RAM dovrebbe mai essere toccata è quella di rendere i dati visibili dal processore, come per le periferiche che eseguono l'I / O.

What about when the context being switched to shares much of the stack and maybe even data which was being processed in the previous context?

I contesti possono operare nello stesso codice e nello stesso spazio dati se sono thread dello stesso processo. Una cosa che non possono condividere è uno stack, quindi ognuno ottiene il proprio e il puntatore dello stack viene cambiato durante un cambio di contesto. Se ci sono dati in comune che vengono usati abbastanza frequentemente, rimarranno nella cache. Questo effetto viene sfruttato durante la progettazione di software per prestazioni molto elevate, ma ha lo svantaggio di dipendere dalle funzionalità specifiche della CPU.

Would grouping thread pools by task or category of task help performance because it increased this effect?

Può, a seconda dell'architettura della macchina, il carico di lavoro e il modo in cui lo gestisci. Si desidera eseguire lo stesso contesto sullo stesso core il più spesso possibile perché aumenta le probabilità di un hit della cache e gli hit della cache migliorano le prestazioni. Ciò non significa che i fallimenti sono automaticamente cattivi, ma il costo deve essere bilanciato con quello dell'attesa in linea per lo stesso core, che potrebbe aver già sfrattato ciò che il contesto stava usando nella cache a livello di socket a cui è possibile accedere altrettanto velocemente da altri core.

Si vede questo genere di cose su una scala macro nei sistemi NUMA, dove i sistemi operativi cercheranno di assegnare contesti allo stesso socket per evitare l'invalidazione della cache e il trasferimento di dati tra i socket.

    
risposta data 17.04.2015 - 00:31
fonte

Leggi altre domande sui tag