为什么传感器输出的CPU核心数不连续?

为什么传感器输出的CPU核心数不连续?

命令中的核心编号为0,4,8,.....39 sensors

为什么不是0、1、2、3、4……?

foo@foo-linux:~$ sensors
coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +73.0°C  (high = +80.0°C, crit = +100.0°C)
Core 0:        +46.0°C  (high = +80.0°C, crit = +100.0°C)
Core 4:        +50.0°C  (high = +80.0°C, crit = +100.0°C)
Core 8:        +52.0°C  (high = +80.0°C, crit = +100.0°C)
Core 12:       +47.0°C  (high = +80.0°C, crit = +100.0°C)
Core 16:       +73.0°C  (high = +80.0°C, crit = +100.0°C)
Core 20:       +50.0°C  (high = +80.0°C, crit = +100.0°C)
Core 24:       +58.0°C  (high = +80.0°C, crit = +100.0°C)
Core 28:       +52.0°C  (high = +80.0°C, crit = +100.0°C)
Core 36:       +48.0°C  (high = +80.0°C, crit = +100.0°C)
Core 37:       +48.0°C  (high = +80.0°C, crit = +100.0°C)
Core 38:       +48.0°C  (high = +80.0°C, crit = +100.0°C)
Core 39:       +48.0°C  (high = +80.0°C, crit = +100.0°C)

再次更新

这是第 12 代英特尔(R) 酷睿(TM) i7-12700

这是一台 PC,不是服务器,只有 1 个 CPU 插槽。

更新

foo@foo-linux:~$ cat /proc/cpuinfo | grep -i apicid
apicid      : 0
initial apicid  : 0
apicid      : 1
initial apicid  : 1
apicid      : 8
initial apicid  : 8
apicid      : 9
initial apicid  : 9
apicid      : 16
initial apicid  : 16
apicid      : 17
initial apicid  : 17
apicid      : 24
initial apicid  : 24
apicid      : 25
initial apicid  : 25
apicid      : 32
initial apicid  : 32
apicid      : 33
initial apicid  : 33
apicid      : 40
initial apicid  : 40
apicid      : 41
initial apicid  : 41
apicid      : 48
initial apicid  : 48
apicid      : 49
initial apicid  : 49
apicid      : 56
initial apicid  : 56
apicid      : 57
initial apicid  : 57
apicid      : 72
initial apicid  : 72
apicid      : 74
initial apicid  : 74
apicid      : 76
initial apicid  : 76
apicid      : 78
initial apicid  : 78

答案1

核心编号来自驱动模块中cpu_core_id的变量。在其源码中是这样描述的:struct temp_datacoretempcpu_core_id

* @cpu_core_id: The CPU Core from which temperature values should be read
*       This value is passed as "id" field to rdmsr/wrmsr functions.

rdmsrwrmsr用于读取/写入指定处理器中的特定于模型的寄存器的机器代码指令。该coretemp模块通过中定义的函数使用这些指令拱门/x86/lib/msr-smp.c。这些函数只是按原样传递 CPU/核心 ID 字段,因此显示的 ID 正是您的主板和 CPU 使用的 ID。

如果您的主板有 4 个 CPU 插槽,其中仅填充了一个插槽,则固件可能已配置为依次为每个插槽分配 ID 号,因此属于空插槽的 ID 不会被使用。但在您的情况下,末尾有四个连续核心 ID 的序列(36 .. 39),因此这可能有所不同。

也许这是一个具有两种类型核心的单个处理器,并且一种类型的核心的编号有间隙(0、4、8 ...),而另一种类型的核心没有间隙(36 .. 39)?

要了解更多信息,有必要确定确切的处理器型号(例如,使用 的输出lscpu | head -14),然后研究该处理器型号的技术文档,以了解如何在硬件/微码级别分配核心 ID。

如果主板/固件无法规定核心 ID 的分配,那么人们可以猜测 CPU 制造商可能正在规划具有更多第一类型核心的下一代处理器(即部分或完全填充编号中的间隙) 。但这只是猜测,制造商的计划无论如何都可能会改变......

答案2

sensors这个答案可能不会令您感到惊讶,但是:因为这就是写的方式。

sensors只是用于sensors_get_detected_chips遍历所有传感器,而不是通过 CPU 内核。传感器的这些顺序是在相关总线上“检测到的”(因此,主要是 I²C/SMBUS、模拟 ISA),而不是按照 CPU 内核(相对任意)编号的顺序。

相关内容