提供逻辑处理器数量的运行时 api 是什么?

下面的 UNIX 命令:


$ lscpu

Architecture:        x86_64

CPU op-mode(s):      32-bit, 64-bit

Byte Order:          Little Endian

CPU(s):              4

On-line CPU(s) list: 0-3

Thread(s) per core:  2

Core(s) per socket:  2

Socket(s):           1

显示,


  CPU(s):              4

  Thread(s) per core:  2

这是 4 X 2 = 8 个逻辑处理器。纠正我。


下面是另一个 Linux 命令:


$ cat /proc/cpuinfo

processor   : 0

....

cpu cores   : 2

.....

processor   : 1

.....

cpu cores   : 2

.....

processor   : 2

.....

cpu cores   : 2

.....

processor   : 3

.....

cpu cores   : 2

.....

但是下面的程序只显示了 4 个逻辑处理器:


package main


import (

    "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 

4

4

code$ 

更多细节:


$ go version

go version go1.14.1 linux/amd64

$ uname -a

Linux 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 数量。


我的理解是,


Go 调度程序创建操作系统线程(M),这将等同于逻辑处理器的数量。


为什么运行时 api 没有给出 8 的值?


手掌心
浏览 101回答 1
1回答

侃侃无极

根据您上面的所有列表,您有:每个插槽两个核心和一个插座这意味着您只有两个 CPU 内核。但是,您还拥有:每个核心两个线程这意味着您的两个 CPU最多可以同时运行四个线程(有一些潜在的缺点,但至少在大多数情况下,这应该比总共使用两个线程提供更多的计算能力)。由于这是实际的硬件限制,Go 计算要使用的线程数为 4 的事实似乎是正确的。(我认为您数到八的原因是您假设Linux报告的每个“cpus”都支持两个线程。事实并非如此:只有两个物理内核,但每个都支持两个线程,所以Linux将此报告为四个“cpu”。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go