最近在對專案進行效能優化,由於在多核平台上,所以了解了些程序、執行緒繫結cpu核的問題,在這裡將所學記錄一下。
不管是執行緒還是程序,都是通過設定親和性(affinity)來達到目的。對於程序的情況,一般是使用sched_setaffinity這個函式來實現,網上講的也比較多,這裡主要講一下執行緒的情況。
與程序的情況相似,執行緒親和性的設定和獲取主要通過下面兩個函式來實現:
int pthread_setaffinity_np(pthread_t
thread
, size_t
cpusetsize,
const cpu_set_t *
cpuset
); int pthread_getaffinity_np(pthread_t
thread
, size_t
cpusetsize,
cpu_set_t *
cpuset
);從函式名以及引數名都很明了,唯一需要點解釋下的可能就是cpu_set_t這個結構體了。這個結構體的理解類似於select中的fd_set,可以理解為cpu集,也是通過約定好的巨集來進行清除、設定以及判斷:
//初始化,設為空
void cpu_zero (cpu_set_t *set);
//將某個cpu加入cpu集中
void cpu_set (int cpu, cpu_set_t *set);
//將某個cpu從cpu集中移出
void cpu_clr (int cpu, cpu_set_t *set);
//判斷某個cpu是否已在cpu集中設定了
int cpu_isset (int cpu, const cpu_set_t *set);
cpu集可以認為是乙個掩碼,
每個設定的位都對應乙個可以合法排程的 cpu,而未設定的位
則對應乙個不可排程的 cpu。換而言之,執行緒都被繫結了,只能在那些對應位被設定了的處理
器上執行。通常,掩碼中的所有位都被置位了,也就是可以在所有的cpu中排程。
以下為測試**:
#define _gnu_source
#include #include #include #include #include #include void *myfun(void *arg)
cpu_zero(&get);
if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0)
for (j = 0; j < num; j++)
}j = 0;
while (j++ < 100000000)
}pthread_exit(null);
}int main(int argc, char *argv)
pthread_join(tid, null);
return 0;
}
這段**將使myfun執行緒在所有cpu中依次執行一段時間,在我的四核cpu上,執行結果為:
system has 4 processor(s)
thread 1095604544 is running in processor 0
thread 1095604544 is running in processor 1
thread 1095604544 is running in processor 2
thread 1095604544 is running in processor 3
在一些嵌入式裝置中,執行的程序執行緒比較單一,如果指定程序執行緒執行於特定
的cpu核,
減少程序、執行緒的核間切換,有可能可以獲得更高的效能。
Linux中線程與CPU核的繫結
最近在對專案進行效能優化,由於在多核平台上,所以了解了些程序 執行緒繫結cpu核的問題,在這裡將所學記錄一下。不管是執行緒還是程序,都是通過設定親和性 affinity 來達到目的。對於程序的情況,一般是使用sched setaffinity這個函式來實現,網上講的也比較多,這裡主要講一下執行緒的情...
Linux中線程與CPU核的繫結
不管是執行緒還是程序,都是通過設定親和性 affinity 來達到目的。與程序的情況相似,執行緒親和性的設定和獲取主要通過下面兩個函式來實現 int pthread setaffinity np pthread t thread size t cpusetsize,const cpu set t c...
CPU的核與執行緒 4核8執行緒
邏輯cpu 單核cpu和多核cpu 總結 cat proc cpuinfo物理cpu就是計算機上實際配置的cpu個數。在linux上可以開啟cat proc cpuinfo來檢視,其中的physical id就是每個物理cpu的id,能找到幾個physical id就代表計算機實際有幾個cpu。在l...