2008-11-11 5 views
30

Есть ли способ прогамации для определения близости процессора к процессу в c/C++ для операционной системы Linux.CPU Affinity

ответ

41

Вам необходимо использовать sched_setaffinity(2).

Например, для работы на процессорах 0 и 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 для первого параметра означает текущий процесс, поставить PID, если это какой-то другой процесс, который вы хотите контролировать).

См. Также sched_getcpu(3).

+0

Это может дополнить метод: для запроса CPU поток в настоящее время работает при использовании этого: ScrollerBlaster 2012-02-28 23:09:32

+1

не забудьте указать _GNU_SOURCE_ при компиляции – 2014-01-20 16:42:34

2

Короче

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

ВИскать CPU Affinity для получения более подробной информации

0

Я сделал много усилий, чтобы понять, что происходит, поэтому я добавить этот ответ для помощи людям, как я (я использую gcc компилятор в Linux мята)

#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; 
} 

Но не забудьте добавить эту опцию в команде компилятора: -D _GNU_SOURCE Поскольку операционная система может назначить процесс конкретного ядра, вы можете добавить этот GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=2,3" в файл потайного, расположенном в /etc/default и пробег sudo update-grub в терминале для резервирования ядер вы хотите

Смежные вопросы