linux系統提供api函式sched_setaffinity和sched_getaffinity用於設定或獲取執行緒的可以使用的cpu核。
int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);
這個函式中pid表示需要設定或獲取繫結資訊的執行緒id(或程序id),如果為0,表示對當前呼叫的執行緒進行設定;第2個引數cpusetsize一般設定為sizeof(cpu_set_t),用以表示第3個引數指向的記憶體結構物件的大小;第3個引數mask指向型別為cpu_set_t物件的指標,用以設定或獲取指定執行緒可以使用的cpu核列表。linux提供函式cpu_zero、cpu_set和cpu_isset對cpu_set_t型別的物件進行操作,其中cpu_zero用於清空cpu_set_t型別物件的內容,cpu_set用於設定cpu_set_t型別物件,cpu_isset用於判斷cpu_set_t型別物件與核對應的位是否被設定。下面通過簡單的**示例來說明這兩個函式的具體用法。
設定執行緒繫結**:
cpu_set_t mask;
int blist[8]=; //設定需要繫結的核列表
#pragma omp parallel private(mask)
cpu_zero(&mask);
cpu_set(blist[omp_get_thread_num()], &mask); //對每個執行緒設定繫結方案
sched_setaffinity(0,sizeof(cpu_set_t), &mask);
該段**將paralle region裡面的8個執行緒依次繫結到核2,5,13,9,3,6,7,4。同樣可以使用sched_getaffinity函式獲取執行緒的能夠使用的核的列表,示例**如下:
int num_processors = sysconf(_sc_nprocessors_conf); //獲取當前節點核的數目
cpu_set_t get;
int i = 0;
cpu_zero(&get);
sched_getaffinity(0, sizeof(cpu_set_t), &get); //獲取當前呼叫執行緒的可以使用的核
for(i = 0; i < num_processors; i++)
if(cpu_isset(i, &get))
printf(「the current thread %d bound to core %d\n「, omp_get_thread_num(), i);
下面是乙個完整的例子
檔案bind.c
#include
#include
#include
#include
#include
#define __use_gnu
#include
#include
#include
#include
#define thread_max_num 100 //1個cpu內的最多程序數
int num=0; //cpu中核數
void* threadfun(void* arg) //arg 傳遞執行緒標號(自己定義)
cpu_set_t mask; //cpu核的集合
cpu_set_t get; //獲取在集合中的cpu
int *a = (int *)arg;
printf("the a is:%d\n",*a); //顯示是第幾個執行緒
cpu_zero(&mask); //置空
cpu_set(*a,&mask); //設定親和力值
if (sched_setaffinity(0, sizeof(mask), &mask) == -1)//設定執行緒cpu親和力
printf("warning: could not set cpu affinity, continuing...\n");
while (1)
cpu_zero(&get);
if (sched_getaffinity(0, sizeof(get), &get) == -1)//獲取執行緒cpu親和力
printf("warning: cound not get thread affinity, continuing...\n");
int i;
for (i = 0; i < num; i++)
if (cpu_isset(i, &get))//判斷執行緒與哪個cpu有親和力
printf("this thread %d is running processor : %d\n", i,i);
return null;
int main(int argc, char* argv)
num = sysconf(_sc_nprocessors_conf); //獲取核數
pthread_t thread[thread_max_num];
printf("system has %i processor(s). \n", num);
int tid[thread_max_num];
int i;
for(i=0;itid[i] = i; //每個執行緒必須有個tid[i]
pthread_create(&thread[0],null,threadfun,(void*)&tid[i]);
for(i=0; i< num; i++)
pthread_join(thread[i],null);//等待所有的執行緒結束,執行緒為死迴圈所以ctrl+c結束
return 0;
編譯命令:gcc bind.c -o bind -lpthread
執行:./bind
輸出結果:略
特別注意:
#define __use_gnu不要寫成#define _use_gnu
#include必須寫在#define __use_gnu之後,否則編譯會報錯
檢視你的執行緒情況可以在執行時在另乙個視窗使用top -h來檢視執行緒的情況,檢視各個核上的情況請使用top命令然後按數字「1」來檢視。
執行緒繫結CPU核
linux系統提供api函式sched setaffinity和sched getaffinity用於設定或獲取執行緒的可以使用的cpu核。int sched setaffinity pid t pid,unsigned int cpusetsize,cpu set t mask 這個函式中pid表...
xilinx 繫結執行緒到cpu核
linux系統提供api函式sched setaffinity和sched getaffinity用於設定或獲取執行緒的可以使用的cpu核。int sched setaffinity pid t pid,unsigned int cpusetsize,cpu set t mask 這個函式中pid表...
Linux中線程與CPU核的繫結
最近在對專案進行效能優化,由於在多核平台上,所以了解了些程序 執行緒繫結cpu核的問題,在這裡將所學記錄一下。不管是執行緒還是程序,都是通過設定親和性 affinity 來達到目的。對於程序的情況,一般是使用sched setaffinity這個函式來實現,網上講的也比較多,這裡主要講一下執行緒的情...