【问题标题】:What is the runtime api to provide number of logical processors?提供逻辑处理器数量的运行时 api 是什么?
【发布时间】:2020-05-06 19:36:23
【问题描述】:

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

Documentation 说,

NumCPU 返回当前进程可用的逻辑 CPU 数量。


我的理解是,

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

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

【问题讨论】:

  • 这是什么版本的 Go?看起来这可能是运行时中的缺陷。
  • @Adrian 1.14 我用go version 输出编辑了查询。
  • lscpu 输出中的“CPU(s): 4”行是逻辑 CPU 的数量。您还可以在“On-line CPU(s) list: 0-3”行中看到这一点,它表示逻辑内核 0、1、2 和 3 当前在线(当前可用)。您也可以尝试在 shell 中运行以下命令来获取物理内核的数量:grep 'cpu cores' /proc/cpuinfo | uniq
  • @nussjustin 使用所需命令输出编辑查询

标签: multithreading go


【解决方案1】:

根据您上面的所有列表,您有:

  • 每个插槽两个核心
  • 和一个插座

这意味着您只有两个 CPU 内核。但是,您也有:

  • 每个内核两个线程

这意味着您的两个 CPU可以同时运行多达四个线程(some potential drawbacks,但至少在大多数情况下,这应该比总共使用两个线程提供更多的计算能力)。

由于这是实际的硬件限制,Go 计算要使用的线程数为 4 的事实似乎是正确的。

(我认为您数到 8 的原因是您假设 Linux 报告的每个“cpus”都支持两个线程。事实并非如此:只有两个物理内核,但每个都支持两个线程,因此 Linux 将其报告为四个“cpu”。)

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2010-10-29
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多