我想指定特定pthread的cpu-affinity。到目前为止,我发现的所有引用都涉及设置进程的cpu-affinity(pid_t)而不是线程(pthread_t)。我尝试了一些传递pthread_t的实验,正如预期的那样,它们会失败。我想做一些不可能的事吗?如果没有,你能发一个指针吗?万分感谢。
答案 0 :(得分:53)
这是我为使我的生活更轻松而做的包装。它的作用是调用线程被“卡住”到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 < 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);
}
答案 1 :(得分:41)
假设linux:
设置亲和力的界面是 - 正如您可能已经发现的那样:
int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);
传递0作为pid,它只适用于当前线程,或者让其他线程报告其内核pid与linux特定的调用pid_t gettid(void);并将其作为pid传递。
引用man page
亲和力掩码实际上是可以的每线程属性 为每个人独立调整 线程组中的线程。价值 从gettid(2)的电话回来可以 在参数pid中传递。 将pid指定为0将设置 调用线程的属性,和 传递呼叫返回的值 to getpid(2)将设置属性 对于线程的主线程 组。 (如果您使用的是POSIX 线程API,然后使用 pthread_setaffinity_np(3)而不是 了sched_setaffinity()。)
答案 2 :(得分:19)
//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来控制 进程或pthreads可以使用哪些CPU。 这种类型的控制称为CPU亲和力。
函数'sched_setaffinity'接收pthread ID和 一个cpuset作为参数。 在第一个参数中使用0时,调用线程 会受到影响
答案 3 :(得分:-3)
请在下面的示例程序中找到特定pthread的cpu-affinity。
请添加适当的库。
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标志编译上述程序。
答案 4 :(得分:-3)
调度程序将根据需要更改cpu关联;要永久设置它,请参阅/ proc文件系统中的cpuset。
http://man7.org/linux/man-pages/man7/cpuset.7.html
或者您可以编写一个简短的程序,使用sched_setaffinity定期设置cpu亲和力(每隔几秒)