如何设置一个特定的并行线程的CPU亲和力?(how to set CPU affinity of a

2019-07-17 16:46发布

我想指定一个特定的并行线程的CPU亲和力。 所有参考文献,我发现迄今处理的设置过程(将为pid_t)不是一个线程(的pthread_t)的CPU亲和力。 我尝试了一些实验路过的pthread_t的周围,如预期他们失败。 上午我试图做一些事情是不可能的? 如果没有,你可以发送一个指针吗? 太感谢了。

Answer 1:

这是我做使我的生活更方便的包装。 它的作用是调用线程被“卡住”与编号为核心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 < 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);
}


Answer 2:

假设Linux系统:

要设置亲和力的界面 - 因为你可能已经发现:

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

传递0作为PID,它会只适用于当前线程,或者有其他线程报告与Linux特有的调用将为pid_t gettid(无效)内核的PID; 和在传递作为PID。

引述手册页

亲和力掩码实际上是可以独立为每个线程组中的线程的被调整每线程属性。 从调用的返回值以gettid(2)所用的参数的PID传递。 指定PID为0将设置为调用线程的属性,并通过从调用的返回值以GETPID(2)将设置为线程组的主线程的属性。 (如果您正在使用POSIX线程API,然后使用pthread_setaffinity_np(3)代替了sched_setaffinity())。



Answer 3:

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

在POSIX环境中,你可以使用cpusets来控制哪些CPU可以处理或并行线程使用。 这种类型的控制的被称为CPU亲和力。

功能“了sched_setaffinity”接收并行线程ID和一个cpuset作为参数。 当你在第一个参数使用0,调用线程将受到影响



Answer 4:

请找到下面的例子程序特定并行线程的CPU亲和力。

请添加适当的库。

double waste_time(long n)
{

    double res = 0;
    long i = 0;
    while (i <n * 200000) {
        i++;
        res += sqrt(i);
    }
    return res;
}

void *thread_func(void *param)
{

    unsigned long mask = 1; /* processor 0 */

    /* bind process to processor 0 */
    if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
        &mask) <0) {
        perror("pthread_setaffinity_np");
    }

    /* waste some time so the work is visible with "top" */
    printf("result: %f\n", waste_time(2000));

    mask = 2;   /* process switches to processor 1 now */
    if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
        &mask) <0) {
        perror("pthread_setaffinity_np");
    }

    /* waste some more time to see the processor switch */
    printf("result: %f\n", waste_time(2000));
}


int main(int argc, char *argv[])
{

    pthread_t my_thread;

    if (pthread_create(&my_thread, NULL, thread_func, NULL) != 0) {
        perror("pthread_create");
    }
    pthread_exit(NULL);
}

编译-D_GNU_SOURCE标志上面的程序。



Answer 5:

调度将改变CPU的亲和力,因为它认为合适的; 要坚持把它请参见在/ proc文件系统cpuset。

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

或者你也可以写一个简短的程序与设置了sched_setaffinity周期性的CPU亲和力(每隔几秒钟)



文章来源: how to set CPU affinity of a particular pthread?