下面的 UNIX 命令:$ lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 4On-line CPU(s) list: 0-3Thread(s) per core: 2Core(s) per socket: 2Socket(s): 1顯示, CPU(s): 4 Thread(s) per core: 2這是 4 X 2 = 8 個邏輯處理器。糾正我。下面是另一個 Linux 命令:$ cat /proc/cpuinfoprocessor : 0....cpu cores : 2.....processor : 1.....cpu cores : 2.....processor : 2.....cpu cores : 2.....processor : 3.....cpu cores : 2.....$ 但是下面的程序只顯示了 4 個邏輯處理器:package mainimport ( "fmt" "runtime")func main() { fmt.Println(runtime.GOMAXPROCS(0)) // gives 4 fmt.Println(runtime.NumCPU()) // gives 4 }輸出:$ go install github.com/myhub/cs61a$ bin/cs61a 44code$ 更多細節(jié):$ go versiongo version go1.14.1 linux/amd64$ uname -aLinux mohet01-ubuntu 4.15.0-99-generic #100-Ubuntu SMP Wed Apr 22 20:32:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux文檔說,NumCPU 返回當前進程可用的邏輯 CPU 數(shù)量。我的理解是,Go 調(diào)度程序創(chuàng)建操作系統(tǒng)線程(M),這將等同于邏輯處理器的數(shù)量。為什么運行時 api 沒有給出 8 的值?
1 回答

侃侃無極
TA貢獻2051條經(jīng)驗 獲得超10個贊
根據(jù)您上面的所有列表,您有:
每個插槽兩個核心
和一個插座
這意味著您只有兩個 CPU 內(nèi)核。但是,您還擁有:
每個核心兩個線程
這意味著您的兩個 CPU最多可以同時運行四個線程(有一些潛在的缺點,但至少在大多數(shù)情況下,這應該比總共使用兩個線程提供更多的計算能力)。
由于這是實際的硬件限制,Go 計算要使用的線程數(shù)為 4 的事實似乎是正確的。
(我認為您數(shù)到八的原因是您假設Linux報告的每個“cpus”都支持兩個線程。事實并非如此:只有兩個物理內(nèi)核,但每個都支持兩個線程,所以Linux將此報告為四個“cpu”。)
- 1 回答
- 0 關(guān)注
- 116 瀏覽
添加回答
舉報
0/150
提交
取消