2009-09-22 14 views
7

Quando eseguo il mio codice multi-thread, il sistema (linux) a volte sposta i thread da un processore a un altro. Poiché ho tanti thread quanti sono i processori, invalida le cache per nessuna buona ragione e confonde le mie attività di tracciamento.Collega i thread ai processori

Sai come associare i thread ai processori e perché un sistema farebbe questo?

+1

nota che un attributo di thread "do_not_migrate" funzionerebbe anche ... – Ben

+0

La raccolta di lavori su un processore e l'uscita dell'altro processore senza lavoro potrebbe consentire un migliore risparmio energetico. – sambowry

+0

@sambowry: funziona su una macchina da 24 processori, sarei un bel spreco di energia per utilizzare solo 1 core su 24 e mantenere la macchina in funzione per 24 ore:/ – Ben

risposta

16

Utilizzare sched_setaffinity (this is Linux-specific).

Perché uno scheduler deve passare tra diversi processori? Bene, immagina che il tuo thread abbia funzionato per ultimo sul processore 1 e al momento è in attesa di essere programmato per l'esecuzione di nuovo. Nel frattempo, un thread diverso è attualmente in esecuzione sul processore 1, ma il processore 2 è gratuito. In questa situazione, è ragionevole per lo scheduler passare il thread al processore 2. Tuttavia, uno scheduler sofisticato tenterà di evitare di "rimbalzare" un thread tra processori più del necessario.

+0

Mi aspetterei che lo scheduler evitasse questo se ci fosse è meno thread rispetto ai processori ... – Ben

+1

È vero ... hai detto nella tua domanda, però, che hai "molti più thread rispetto ai processori" - si supponeva che fosse il contrario? –

+0

Non è perché knittl modifica la mia domanda senza sapere di cosa stavo parlando, ho tanti thread quanti sono i processori – Ben

8

È possibile farlo da bash. C'è un meraviglioso comando taskset che conosco nella domanda this (potresti anche trovare preziose discussioni su come lo scheduler dovrebbe operare lì). Il comando acquisisce un pid di un processo e lo associa a uno o più processori specifici.

taskset -c 0 -p PID 

lega il processo con PID al processore (core) numero 0.

Che ha a che fare con fili? Ad ogni thread è assegnato un identificatore con gli stessi diritti del pid, noto anche come "tid". Puoi ottenerlo con gettid syscall. Oppure puoi guardarlo, ad esempio, nel programma top premendo H (alcuni processi verranno suddivisi in molte voci apparentemente uguali con diversi pids --- quelli sono thread).

Problemi correlati