執行緒繫結CPU核

2021-06-26 11:23:32 字數 3016 閱讀 9150

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這個函式來實現,網上講的也比較多,這裡主要講一下執行緒的情...