指定CPU核心執行指定執行緒

2021-10-16 18:21:30 字數 1536 閱讀 9450

cpu親和性(affinity)用於繫結到固定的cpu上。主要有以下函式。

int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t*mask);//程序繫結函式 int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);//執行緒繫結函式 void cpu_zero (cpu_set_t *set) /這個巨集對 cpu 集 set 進行初始化,將其設定為空集。/ void cpu_set (int cpu, cpu_set_t *set) /這個巨集將 指定的 cpu 加入 cpu 集 set 中/ void cpu_clr (int cpu, cpu_set_t *set) /這個巨集將 指定的 cpu 從 cpu 集 set 中刪除。/ int cpu_isset (int cpu, const cpu_set_t *set)

/如果 cpu 是 cpu 集 set 的一員,這個巨集就返回乙個非零值(true),否則就返回零(false)。/

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核心執行不同的執行緒。下面的程式可以指定哪個(些)核心去執行某個執行緒,主要部分是:

cpu_set_t mask;

cpu_zero(&mask);

cpu_set(i, &mask);

pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask);

mask可以理解為乙個集合,第2行清空mask,第三行把cpui放入mask,還可以把更多cpui放入mask。

假如這段**在函式fac中,pthread_self()用於獲取fac的執行緒id,pthread_setaffinity_np把該id與mask繫結,這樣mask中的乙個或多個cpu核心就負責執行該執行緒。如形式2。

1. 形式1

#include

#include

#include

#include

#include

//統計cpu核心數量

int countcpu()

void *fun()

int main(int argc, char *ar**)

}int main (int argc, const char * ar**)

for(i = 0; i < cpu_nums; ++i)

pthread_join(thread[i],null);

return 0;

指定執行緒在特定核心

1原博部分 今天遇到這麼乙個問題,有乙個任務分上下行,都是計算複雜型的,如何保證用執行緒可以讓他們執行在雙核機器上的不同核心上充分利用cpu?我當時想了一下,認為執行緒的分配是作業系統處理的,如果足夠精明的話,可以將執行緒合理分配。不過我回去查了查資料,竟然還真能指定cpu,就是用setthread...

Tensorflow Keras 指定CPU執行

執行tensorflow 時候常出現oom out of memory 的錯誤,原因是batch size設定得太大導致視訊記憶體不足。如果想讓 僅僅執行在cpu下,可在原 中加入如下 import os os.environ cuda device order pci bus id os.envi...

讓程序執行在指定的CPU

我的linode十分繁忙,在跑一些密集運算元據庫的rake任務時尤其如此。但我觀察發現,linode伺服器的4核cpu,只有第1個核心 cpu 0 非常忙,其他都處於idle狀態。不了解linux是如何排程的,但在linode的這種狀態下,顯然有優化的餘地。除了處理正常任務,cpu 0還需要處理各種...