2011-05-07 19 views
6

Hay 12 núcleos y 12 subprocesos en ejecución .. Quiero unir 1 hilo a cada núcleo. esto es lo que llamo al comienzo de cada hilo.Uso correcto de SetThreadAffinityMask

int core=12; 
SetThreadAffinityMask(GetCurrentThread(),(1<<core)-1); 

Esto es lo que tengo ... No sé si esta sería la manera correcta de llamarlo. No estoy seguro de si entiendo cómo funciona el 2.º parámetro ...

¿También necesito llamar a SetProcessaffinitymask también?

Respuesta

7

El segundo parámetro para SetThreadAffinityMask() es un vector de bits. Cada bit corresponde a un procesador lógico: un núcleo de CPU o un hiper hilo. Si un bit en el segundo parámetro se establece en 1, se permite que el subproceso se ejecute en el núcleo correspondiente.

Para core igual a 12, su máscara (1<<core)-1 contiene 0..11 bits configurados, por lo que cada subproceso se puede ejecutar en cualquiera de los 12 núcleos. Presumiblemente, deseaba configurar cada hilo para que se ejecutara en un núcleo dedicado. Para esto, necesita que cada subproceso tenga un número único entre 0 y 11, y configure solo el bit correspondiente de la máscara de afinidad. Sugerencia: puede usar InterlockedIncrement() para obtener el número único. Alternativamente, si todos los subprocesos se inician en un bucle, ya se conoce el número único (es el recuento de los viajes en bucle) y puede usarlo, p. pasar a cada hilo como un argumento, o establecer afinidad para nuevos hilos en ese mismo bucle.

Y, por favor, preste atención a la precaución en la respuesta de David Heffernan: a menos que sepa cómo usar la afinidad para siempre, es mejor que no juegue con afinidad. Además de las razones que David ya mencionó, agregaré la portabilidad de las aplicaciones en computadoras que tengan diferentes números de sockets, núcleos e hipersubprocesos.

+0

, por lo general, harías un bucle en la afinidad de configuración del hilo principal, por lo que no sería necesario enclavar –

+0

@David: sí, también es una opción.Añadiré a la respuesta. –

+0

(1 << core) -1 es un conjunto de 12 bits – Jake

7

Parece que está estableciendo afinidad con los 12 procesadores, que no es lo que pretende.

Me gustaría, en el hilo principal, recorrer los 12 hilos para establecer la afinidad. No establezca la afinidad dentro del hilo porque eso requiere que el hilo conozca su índice, que a menudo no necesita saber. Declararía una variable de máscara y le asignaría el valor 1. Cada vez que pasa el ciclo, establece la afinidad de la secuencia y luego cambia por 1. No debe cambiar la afinidad del proceso.

Una palabra de advertencia. Establecer afinidad es peligroso. Si el usuario cambia la afinidad del proceso, puede terminar con un hilo que no se puede ejecutar en ningún procesador. Ten cuidado.

Además, según mi experiencia, la configuración manual de la afinidad no tiene beneficios de rendimiento y, a veces, es más lenta. Por lo general, el sistema hace un buen trabajo.

+0

¿Cómo se configura la afinidad del hilo en la función principal? Lo tengo configurado al comienzo de las funciones de hilo>,>. El primer parámetro requiere el manejador de subprocesos .... Solo puedo llamar a GetCurrentThread() .. ¿hay otra función para obtener el manejador de la función principal? – Jake

+0

no lo entendí ... gracias – Jake

4

Puede escribir el código siguiente. GetThreadHandle (i) es la función que obtiene el control de cada hilo.

int core = 12; 
for(int i=0; i<core; i++) 
    SetThreadAffinityMask(GetThreadHandle(i), 1<<i); 
0

La máscara de bits es típicamente de 64 bits. Una solución más portátil que evita el desbordamiento aritmético, para los casos en que hay más de 32 procesadores sería:

auto mask = (static_cast<DWORD_PTR>(1) << core);//core number starts from 0 
auto ret = SetThreadAffinityMask(GetCurrentThread(), mask);