确定哪个逻辑核心是超线程的,哪个不是。

4
我从/proc/cpuinfo获取了以下信息,我的问题是哪个核是超线程的。其次,由于这是一个双插槽系统,总共有8个内核,因此哪个核心位于哪个处理器上,因为有两个四核处理器。
我的解释是:核心0,2,4和6是处理器1中的4个物理核心,而核心1,3,5和7是处理器0上的4个物理核心。核心9-15是超线程的。我的解释正确吗?
-bash-3.2$ cat /proc/cpuinfo | grep 'physical id'
physical id     : 1
physical id     : 0
physical id     : 1
physical id     : 0
physical id     : 1
physical id     : 0
physical id     : 1
physical id     : 0
physical id     : 1
physical id     : 0
physical id     : 1
physical id     : 0
physical id     : 1
physical id     : 0
physical id     : 1
physical id     : 0
-bash-3.2$ cat /proc/cpuinfo | grep 'core id'
core id         : 0
core id         : 0
core id         : 1
core id         : 1
core id         : 2
core id         : 2
core id         : 3
core id         : 3
core id         : 0
core id         : 0
core id         : 1
core id         : 1
core id         : 2
core id         : 2
core id         : 3
core id         : 3
-bash-3.2$ cat /proc/cpuinfo | grep 'processor'
processor       : 0
processor       : 1
processor       : 2
processor       : 3
processor       : 4
processor       : 5
processor       : 6
processor       : 7
processor       : 8
processor       : 9
processor       : 10
processor       : 11
processor       : 12
processor       : 13
processor       : 14
processor       : 15

5
询问哪个核心是超线程的就像询问同时出生的双胞胎兄弟中的哪一个是双胞胎一样。同一核心上的所有CPU都是相等的。 - Gabe
Gabe,我同意你的观点。 - MetallicPriest
Gabe,这里唯一可能的问题是:哪些虚拟处理器对共享物理核心和物理芯片(插座)? - osgx
4个回答

3

您能发布启动时的dmesg结果吗?它们应该包含coreids的描述:

http://lxr.linux.no/linux+v3.0.4/arch/x86/kernel/cpu/common.c#L493

 493        if (!printed && (c->x86_max_cores * smp_num_siblings) > 1) {
 494                printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
 495                       c->phys_proc_id);
 496                printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
 497                       c->cpu_core_id

另一种选择是使用 hwlochttp://www.open-mpi.org/projects/hwloc/ 它被创建来挖掘任何系统的拓扑结构。以下是普通系统的示例: Example of topology in graphic form 它将代表HT-cores: Example of HT-topology in graphic form 此实用程序的输出可以是文本格式、XML格式或渲染格式。

0

仅回答如何解释/proc/cpuinfo的问题:可以通过挑选具有相同cpu idcore id值的“处理器”条目来识别超线程对。

因此,在原始问题提供的输出中,处理器0和处理器8是一个超线程对,1和9、2和10等也是。


0

最好的方法就是进行基准测试。

编写任何使用2个线程的简单程序。然后将这两个线程绑定到两个核心上。 如果在一对核心与另一对核心之间性能显著下降,则说明这两个核心位于同一个物理核心上。

我会相信像这样的基准测试,而不是其他任何东西告诉你的。

在Windows中,逻辑/物理核心是交错的。 核心0,1位于同一个物理核心上。 核心2,3位于同一个... 核心4,5位于同一个...等等...

在Linux上可能会有所不同。


是的,神秘的我也尝试过那个方法,结果支持了我的解释。 - MetallicPriest
如果机器上有其他不相关的负载正在同一核心上运行,那么这种基准测试方式是不可靠的。 - snap
MetallicPriest,你的基准测试是一个宏(fluidanimate),在使用不同线程数时代码是不同的。尝试使用一个更简单的基准测试,使用2个线程没有代码差异。例如,在循环中执行障碍。 - osgx
osgX,我也尝试了来自PARSEC的其他基准测试,并且所有结果都支持我的解释。在Linux中,CPU 0-7是物理核心,而8-15是超线程。在Windows中,就像你所说的那样,即CPU 0,1是一个核心。 - MetallicPriest
你不应该运行大型的(宏观的)基准测试来寻找核心之间的超线程关系。你应该在一对一的基础上运行微基准测试。 - osgx
基准测试结果并不代表什么,仅仅是你对结果的解读。可能会有误差。我认为,更好的方法是学习Linux内核源码及其HT-enumerator(它通过APCI,可以看到HT核心)。此外,请阅读内核引导日志(dmesg)。 - osgx

0

当您启用超线程时,所有处理器都变成虚拟的。正如Raymond Chen所解释的

当您打开超线程时,每个单独的物理处理器都会像两个虚拟处理器一样运行。...与每个物理处理器相关联的两个虚拟处理器是完全等效的。它们不像一个是物理的,一个是虚拟的。它们都是虚拟的,并且平等地竞争着分享一个物理CPU的资源。当您设置处理器亲和性时,您将其设置为虚拟处理器。


我们知道,但将它们命名为“物理”和“虚拟”只是一种简单的方式来识别哪些配对在一起。 - Mysticial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接