2009-09-22 13 views
7

Cuando ejecuto mi código multiproceso, el sistema (Linux) a veces mueve los hilos de un procesador a otro. Como tengo tantos hilos como procesadores, invalida los cachés sin buenas razones y confunde mis actividades de rastreo.Enlazar hilos a procesadores

¿Sabes cómo vincular los hilos a los procesadores, y por qué un sistema haría esto?

+1

tenga en cuenta que un atributo de subproceso "do_not_migrate" también funcionaría ... – Ben

+0

Recopilar trabajos en un procesador y dejar el otro procesador sin trabajar puede proporcionar un mejor ahorro de energía. – sambowry

+0

@sambowry: se ejecuta en la máquina de 24 procesadores, sería un desperdicio de energía usar solo 1 núcleo de 24 y mantener la máquina encendida durante 24 veces más:/ – Ben

Respuesta

16

Use sched_setaffinity (this is Linux-specific).

¿Por qué un programador podría cambiar los hilos entre los diferentes procesadores? Bueno, imagine que su hilo se ejecutó por última vez en el procesador 1 y actualmente está esperando ser programado para su ejecución nuevamente. Mientras tanto, se está ejecutando un hilo diferente en el procesador 1, pero el procesador 2 está libre. En esta situación, es razonable que el planificador cambie su hilo al procesador 2. Sin embargo, un programador sofisticado tratará de evitar "rebotar" un hilo entre los procesadores más de lo necesario.

+0

Espero que el planificador evite esto si hay es menos hilos que procesadores ... – Ben

+1

Es verdad ... usted dijo en su pregunta, sin embargo, que tiene "muchos más hilos que procesadores" - ¿se suponía que era al revés? –

+0

No es porque knittl edite mi pregunta sin saber de qué estaba hablando, tengo tantos hilos como procesadores tengo – Ben

8

Puede hacerlo desde bash. Hay un maravilloso comando taskset que conozco en la pregunta this (también puede encontrar una valiosa discusión sobre cómo debería funcionar el programador allí). El comando toma un pid de un proceso y lo vincula a los procesadores específicos.

taskset -c 0 -p PID 

une el proceso con PID al procesador (núcleo) número 0.

¿Qué tiene que ver con hilos? A cada hilo se le asigna un identificador con los mismos derechos que pid, también conocido como "tid". Puede obtenerlo con gettid syscall. O puede verlo, por ejemplo, en el programa top al presionar H (algunos procesos se dividirán en muchas entradas aparentemente iguales con diferentes pids --- esos son hilos).