2008-11-11 19 views
30

¿Existe un método progamatico para establecer la afinidad de la CPU por un proceso en c/C++ para el sistema operativo Linux?CPU Affinity

Respuesta

41

Necesita usar sched_setaffinity(2).

Por ejemplo, para funcionar en las CPU 0 y sólo el 2:

#define _GNU_SOURCE 
#include <sched.h> 

cpu_set_t mask; 
CPU_ZERO(&mask); 
CPU_SET(0, &mask); 
CPU_SET(2, &mask); 
result = sched_setaffinity(0, sizeof(mask), &mask); 

(0 para el primer parámetro significa que el proceso actual, suministrar un PID si se trata de algún otro proceso que desea controlar).

Véase también sched_getcpu(3).

+0

Esto podría complementar la técnica: para consultar la CPU el hilo se está ejecutando actualmente en usar esto: ScrollerBlaster

+1

no se olvide de definir _GNU_SOURCE_ al compilar –

+1

, por ejemplo, agregue al comando gcc "-D _GNU_SOURCE" – Simon

2

En resumen

unsigned long mask = 7; /* processors 0, 1, and 2 */ 
unsigned int len = sizeof(mask); 
if (sched_setaffinity(0, len, &mask) < 0) { 
    perror("sched_setaffinity"); 
} 

Buscar en CPU Affinity para más detalles

+0

debe usar el tipo correcto y las macros para esto (ej. 'cpu_set_t' y' CPU_SET') - no hay garantía de que los bits en 'long' estén en el lugar correcto. – Alnitak

0

he hecho muchos esfuerzos para darse cuenta de lo que está sucediendo, así que añadir a respuesta para ayudar a la gente como yo (yo uso gcc compilador en Linux menta)

#include <sched.h> 
cpu_set_t mask; 

inline void assignToThisCore(int core_id) 
{ 
    CPU_ZERO(&mask); 
    CPU_SET(core_id, &mask); 
    sched_setaffinity(0, sizeof(mask), &mask); 
} 
int main(){ 
    //cal this: 
    assignToThisCore(2);//assign to core 0,1,2,... 

    return 0; 
} 

Pero no se olvide de añadir estas opciones al comando del compilador: Debido a que el sistema operativo puede asignar un proceso para el núcleo en particular, puede añadir este GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=2,3" en el fichero de comida ubicado en /etc/default y la carrera sudo update-grub en terminal para reservar los núcleos que desea