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)
該段**將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++)
}下面是乙個完整的例子
檔案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 傳遞執行緒標號(自己定義)
while (1)
int i;
for (i = 0; i < num; i++)}}
return null;
}int main(int argc, char* argv)
for(i=0; i< num; i++)
return 0;
}編譯命令:gcc bind.c -o bind -lpthread
執行:./bind
輸出結果:略
特別注意:
#define __use_gnu不要寫成#define _use_gnu
#include必須寫在#define __use_gnu之後,否則編譯會報錯
檢視你的執行緒情況可以在執行時在另乙個視窗使用top -h來檢視執行緒的情況,檢視各個核上的情況請使用top命令然後按數字「1」來檢視。
出處:gx注釋:如果要讓各個核處於全負荷執行狀態,需要將threadfun函式中while(1){}中包含的處理程式注釋掉。緣由是處理while(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這個函式來實現,網上講的也比較多,這裡主要講一下執行緒的情...