how to set CPU affinity of a particular pthread? how to set CPU affinity of a particular pthread? multithreading multithreading

how to set CPU affinity of a particular pthread?


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 coresint stick_this_thread_to_core(int core_id) {   int num_cores = sysconf(_SC_NPROCESSORS_ONLN);   if (core_id < 0 || 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);}


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 threads 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().)


//compilation: gcc -o affinity affinity.c -lpthread#define _GNU_SOURCE#include <sched.h>   //cpu_set_t , CPU_SET#include <pthread.h> //pthread_t#include <stdio.h>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 controlwhich 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 threadwill be affected