Mi dispiace di essere il "mito Buster" qui, ma l'impostazione affinità di thread ha una grande importanza, e cresce in importanza nel corso del tempo, come i sistemi di tutti usiamo diventiamo sempre più NUMA (Non-Uniform Memory Architettura) per natura. Anche un semplice server dual socket in questi giorni ha una RAM collegata separatamente a ciascun socket e la differenza di accesso alla memoria da un socket alla propria RAM a quella del socket del processore adiacente (RAM remota) è notevole. Nel prossimo futuro, i processori stanno raggiungendo il mercato in cui il set interno di core è NUMA in sé (controller di memoria separati per gruppi separati di core, ecc.). Non ho bisogno di ripetere qui il lavoro degli altri, basta cercare "NUMA e thread affinity" online - e puoi imparare da anni di esperienza di altri ingegneri.
Non impostare l'affinità del thread è effettivamente uguale a "sperare" che lo scheduler del SO gestisca correttamente l'affinità del thread. Lasciatemi spiegare: Hai un sistema con alcuni nodi NUMA (domini di elaborazione e memoria). Si avvia una discussione e il thread esegue alcune operazioni con la memoria, ad es. malloc un po 'di memoria e poi processo ecc. Il sistema operativo moderno (almeno Linux, probabilmente anche altri) fa un buon lavoro fino ad ora, la memoria è, per impostazione predefinita, allocata (se disponibile) dallo stesso dominio della CPU su cui è in esecuzione il thread . Al momento, il sistema di condivisione del tempo (tutto il sistema operativo moderno) farà passare il thread. Quando il thread viene reinserito nello stato di esecuzione, può essere reso eseguibile su qualsiasi dei nuclei nel sistema (poiché non è stata impostata una maschera di affinità) e più grande è il sistema, maggiori sono le possibilità che sarà "riattivato" su una CPU che è remota rispetto alla memoria precedentemente allocata o utilizzata. Ora, tutti gli accessi alla memoria sarebbero remoti (non sono sicuro cosa significhi per le prestazioni dell'applicazione?maggiori informazioni sull'accesso remoto alla memoria sui sistemi NUMA online)
Quindi, per riassumere, le interfacce di impostazione dell'affinità sono MOLTO importanti quando si esegue il codice su sistemi che hanno un'architettura più che banale - che sta rapidamente diventando "qualsiasi sistema" questi giorni. Alcuni filo runtime ambienti/librerie consentono il controllo di questo in fase di esecuzione, senza alcuna programmazione specifica (vedi OpenMP, per esempio nella realizzazione di Intel di variabile d'ambiente KMP_AFFINITY) - e sarebbe la cosa giusta per il C++ 11 esecutori ad includere meccanismi simili a le loro librerie libere e le opzioni di linguaggio (e fino a quel momento, se il tuo codice è destinato ai server, ti consiglio vivamente di implementare il controllo di affinità nel tuo codice)
fonte
2014-11-17 14:40:05
dispiace dire che non credo che C++ 11 supporta questo (presumibilmente a causa di problemi di portabilità) - potrebbe essere necessario scavare 'std :: thread' e iniziare il filo con' pthread_create' e un attributo che hai preparati con [ 'pthread_attr_setaffinity_np'] (http://man7.org/linux/man-pages/man3/pthread_attr_setaffinity_np.3.html), oppure utilizzare' std :: thread' e hanno il thread creato impostato immediatamente la propria affinità (evitando le condizioni di gara che avresti se provassi ad impostarlo dal thread di creazione). –
@ Tony Grazie mille. Ho aggiunto il codice nella risposta. Spero che sia quello che hai suggerito. –
sembra giusto ... applausi. –