线程与CPU核的绑定
一 Linux中线程与CPU核的绑定 最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定cpu核的问题,在这里将所学记录一下。 不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。对于进程的情况,一般是使用sched_setaffinity这个函数来实现,网上讲的也比较多,这里主要讲一下线程的情况。 与进程的情况相似,线程亲和性的设
最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定cpu核的问题,在这里将所学记录一下。
点击(此处)折叠或打开
- #define _GNU_SOURCE
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <pthread.h>
- #include <sched.h>
- void *myfun(void*arg)
- {
- cpu_set_t mask;
- cpu_set_t get;
- char buf[256];
- int i;
- int j;
- int num= sysconf(_SC_NPROCESSORS_CONF);
- printf("system has %d processor(s)\n", num);
- for(i= 0; i< num; i++){
- CPU_ZERO(&mask);
- CPU_SET(i,&mask);
- if(pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask)< 0){
- fprintf(stderr,"set thread affinity failed\n");
- }
- CPU_ZERO(&get);
- if(pthread_getaffinity_np(pthread_self(), sizeof(get),&get)< 0){
- fprintf(stderr,"get thread affinity failed\n");
- }
- for(j= 0; j< num; j++){
- if(CPU_ISSET(j,&get)){
- printf("thread %d is running in processor %d\n",(int)pthread_self(), j);
- }
- }
- j = 0;
- while(j++< 100000000){
- memset(buf, 0, sizeof(buf));
- }
- }
- pthread_exit(NULL);
- }
- int main(int argc, char*argv[])
- {
- pthread_t tid;
- if(pthread_create(&tid,NULL,(void*)myfun,NULL)!= 0){
- fprintf(stderr,"thread create failed\n");
- return -1;
- }
- pthread_join(tid,NULL);
- return 0;
- }
DWORD_PTR SetThreadAffinityMask(HANDLE hThread,
DWORD_PTR dwThreadAffinityMask);
该函数中的h T h r e a d参数用于指明要限制哪个线程, dwThreadAffinityMask用于指明该线程能够在哪个CPU上运行。dwThreadAffinityMask必须是进程的亲缘性屏蔽的相应子集。返回值是线程的前一个亲缘性屏蔽。因此,若要将3个线程限制到CPU1、2和3上去运行,可以这样操作:
//Thread 0 can only run on CPU 0.
SetThreadAffinityMask(hThread0, 0x00000001);
//Threads 1, 2, 3 run on CPUs 1, 2, 3.
SetThreadAffinityMask(hThread1, 0x0000000E);
SetThreadAffinityMask(hThread2, 0x0000000E);
SetThreadAffinityMask(hThread3, 0x0000000E);
三 linux
cpu_set_t mask;
cpu_set_t get;
int i;
int num = sysconf(_SC_NPROCESSORS_CONF);
printf("system has %d processor(s)\n", num);
CPU_ZERO(&mask);
CPU_SET(1, &mask); //指定运行在哪个CPU上。我们linux机器(Linux version 2.6.32-5-amd64 (Debian 2.6.32-35))有4颗CPU,其编号为0-3
pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask);
for (i = 0;; i++) { //此循环导致CPU占用率为100%
if (!(i%10000))
{
std::vector<int> myvector;
for (int i = 0; i < 1000;i++)
{
myvector.push_back(i);
}
}
}
更多推荐
所有评论(0)