how to set CPU affinity of a particular pthread?

匿名 (未验证) 提交于 2019-12-03 03:08:02

问题:

I'd like to specify the cpu-affinity of a particular pthread. All the references I've found so far deal with setting the cpu-affinity of a process (pid_t) not a thread (pthread_t). I tried some experiments passing pthread_t's around and as expected they fail. Am I trying to do something impossible? If not, can you send a pointer please? Thanks a million.

回答1:

This is a wrapper I've made to make my life easier. Its effect is that the calling thread gets "stuck" to the core with id core_id:

// core_id = 0, 1, ... n-1, where n is the system's number of cores  int stick_this_thread_to_core(int core_id) {    int num_cores = sysconf(_SC_NPROCESSORS_ONLN);    if (core_id = num_cores)       return EINVAL;     cpu_set_t cpuset;    CPU_ZERO(&cpuset);    CPU_SET(core_id, &cpuset);     pthread_t current_thread = pthread_self();        return pthread_setaffinity_np(current_thread, sizeof(cpu_set_t), &cpuset); } 


回答2:

Assuming linux:

The interface to setting the affinity is - as you've probably already discovered:

int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask); 

Passing 0 as the pid, and it'll apply to the current thread only, or have other thread report their kernel pid with the linux specific call pid_t gettid(void); and pass that in as the pid.

Quoting the man page

The affinity mask is actually a per-thread attribute that can be adjusted independently for each of the threads in a thread group. The value returned from a call to gettid(2) can be passed in the argument pid. Specifying pid as 0 will set the attribute for the calling thread, and passing the value returned from a call to getpid(2) will set the attribute for the main thread of the thread group. (If you are using the POSIX threads API, then use pthread_setaffinity_np (3) instead of sched_setaffinity().)



回答3:

//compilation: gcc -o affinity affinity.c -lpthread  #define _GNU_SOURCE #include    //cpu_set_t , CPU_SET #include  //pthread_t #include   void *th_func(void * arg);   int main(void) {   pthread_t thread; //the thread    pthread_create(&thread,NULL,th_func,NULL);     pthread_join(thread,NULL);       return 0; }   void *th_func(void * arg) {     //we can set one or more bits here, each one representing a single CPU   cpu_set_t cpuset;     //the CPU we whant to use   int cpu = 2;    CPU_ZERO(&cpuset);       //clears the cpuset   CPU_SET( cpu , &cpuset); //set CPU 2 on cpuset     /*    * cpu affinity for the calling thread     * first parameter is the pid, 0 = calling thread    * second parameter is the size of your cpuset    * third param is the cpuset in which your thread will be    * placed. Each bit represents a CPU    */   sched_setaffinity(0, sizeof(cpuset), &cpuset);    while (1);        ; //burns the CPU 2    return 0; } 

In POSIX environment you can use cpusets to control which CPUs can be used by processes or pthreads. This type of control is called CPU affinity.

The function 'sched_setaffinity' receives pthread IDs and a cpuset as parameter. When you use 0 in the first parameter, the calling thread will be affected



回答4:

Please find the below example program to cpu-affinity of a particular pthread.

Please add appropriate libs.

double waste_time(long n) {      double res = 0;     long i = 0;     while (i 

Compile above program with -D_GNU_SOURCE flag.



回答5:

The scheduler will change the cpu affinity as it sees fit; to set it persistently please see cpuset in /proc file system.

http://man7.org/linux/man-pages/man7/cpuset.7.html

Or you can write a short program that sets the cpu affinity periodically (every few seconds) with sched_setaffinity



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!