windows下繫結執行緒(程序)到指定的CPU核心

2021-07-11 12:04:35 字數 1628 閱讀 3027

乙個程式指定到單獨乙個cpu上執行會比不指定cpu執行時快。這中間主要有兩個原因:

1)cpu切換時損耗的效能。

2)intel的自動降頻技術和windows的機制衝突:windows有乙個功能是平衡負載,可以將乙個執行緒在不同時間分配到不同cpu,從而使得每乙個cpu不「過累」。然而,inter又有乙個技術叫做speedstep,當乙個cpu沒有滿負荷執行時自動降頻從而達到節能減排的目的。這兩個功能實際是衝突的:乙個程式被分配到多個cpu協同工作->每個cpu都不是滿載->每個cpu都會降頻->windows發現每個cpu效能都降低了,因此程式執行速度也降低了。

因此,將執行緒(程序)繫結到指定cpu核心,從而不讓windows自作主張幫我們分散任務,從而提高單執行緒效率是很有必要的。有兩種方法實現繫結程序到指定cpu:

1)手工調節:在資源管理器的程序裡面,設定相關性,可以設定程序到某個或者某些指定的cpu核心。

這種方法最簡便,同樣是最優效率的,因為你可以根據當前cpu的負載情況進行選擇。

2)**自動調節:

參考:具體函式為:

1

dword_ptr setthreadaffinitymask(handle hthread, dword_ptr dwthreadaffinitymask);

其中,第乙個引數為執行緒控制代碼,第二個引數為乙個mask。

如果要知道當前執行緒的控制代碼,可以通過函式:getcurrentthread()得到。否則,在建立多執行緒的時候,也同樣可以得到建立的執行緒的控制代碼。

第二個引數為mask,可取值為0~2^31(32位)和0~2^63(64位),每一位代表每乙個cpu是否使用。

比如,你要指定程序到第0個cpu上,則mask=0×01

第1個cpu:mask=0×02

第2個cpu:mask=0×04 (注意不是0×03)

第3個cpu:mask=0×08

以此類推。

如果要指定多個cpu:

比如第0、1個:mask=0×03

第1、2個:mask=0×06

以此類推。

如果cpu個數不足,則會進行取模操作。比如一共4個cpu,則mask=0×0010則和0×01一樣。

這種方法的好處是多執行緒時不用每次都手動選擇cpu,缺點是萬一選到的cpu負載很高,那麼程式執行速度就慢了(英雄所見略同所以大家都搶到同乙個cpu去了麼~~)

效果如下圖所示:

還有乙個實用的函式來獲取當前cpu的核心數量:

1

2

3

system_info info;

getsysteminfo(&info);

printf("number of processors: %d.\n", info.dwnumberofprocessors);

輸出的是邏輯核心數量,比如i3處理器就是雙核心四執行緒,輸出4。i5處理器是四核心四執行緒,輸出也是4。

這樣就可以方便的知道當前系統一共有多少個cpu了,同時也方便了執行緒數選擇。

Linux程序或執行緒繫結到CPU

linux提供乙個介面,可以將程序繫結到特定的cpu include int sched setaffinity pid t pid,size t cpusetsize,const cpu set t mask int sched getaffinity pid t pid,size t cpuse...

linux繫結程序到指定cpu

方法之一 top p pidof 程序名稱 方法之二 top p ps h o pid c 程序名稱 如果還要檢視此程序下的各執行緒,可用如下 top h p pidof process 我是分割線 top實時顯示程序在那個cpu上 1 top 2 按 1 實時顯示cpu資訊 3 按 f 進入顯示配...

如何將程序 執行緒繫結到固定的CPU核

什麼是cpu affinity affinity 是程序的乙個屬性,這個屬性指明了程序排程器能夠把這個程序排程到哪些 cpu上。在linux 中,我們可以利用 cpu affinity 把乙個或多個程序繫結到乙個或多個 cpu上。cpu affinity分為2 種,soft affinity 和ha...