【问题标题】:Identifying which logical core is hyperthreaded and which one is not识别哪个逻辑核心是超线程的,哪个不是
【发布时间】:2011-09-03 07:10:27
【问题描述】:

我从 /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

【问题讨论】:

  • 问哪个内核是超线程的就像问两个同时出生的兄弟中的哪个是双胞胎。同一核心上的所有 CPU 都是平等的。
  • 加布,我同意你的看法。
  • Gabe,这里唯一可能的问题是:哪些虚拟处理器对共享物理内核和物理芯片(插槽)。

标签: c linux multithreading


【解决方案1】:

你能发布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/

创建它是为了挖掘任何系统的拓扑。普通系统示例:

它将代表HT-cores:

此实用程序的输出可以是文本格式、xml 格式、渲染。

【讨论】:

    【解决方案2】:

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

    编写任何使用 2 个线程的简单程序。然后将线程绑定到两个核心。 如果一对核心与另一对核心之间的性能显着下降,那么您就知道这两个核心位于同一个物理核心上。

    我相信这样的基准胜过其他任何事情。

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

    在 Linux 上可能会有所不同。

    【讨论】:

    • 是的,神秘的我也尝试过,结果支持我的解释。
    • 如果机器有一些其他不相关的负载在相同的内核上运行,那么以这种方式进行基准测试是不可靠的。
    • MetallicPriest,你的基准测试是一个宏(fluidanimate),当使用不同的线程数时它是不同的代码。尝试使用具有 2 个线程的更简单的基准测试;代码没有区别。例如。循环做屏障。
    • osgx,我还尝试了 PARSEC 的其他基准测试,是的,所有结果都支持我的解释。在 Linux 中,CPU 0-7 是物理 CPU,而 8-15 是超线程。在Windows中,就像你说的那样,CPU 0,1是一个核心。
    • 您不应该运行大型(宏)基准测试来查找内核之间的 HT 关系。您应该逐对运行微基准测试。
    【解决方案3】:

    当您启用超线程时,所有处理器将变为虚拟。没有纯粹的物理处理器。作为Raymond Chen explains

    当您打开超线程时,每个单独的物理处理器 就好像它是两个虚拟处理器一样。 ...两个虚拟 与每个物理处理器关联的处理器完全 相等的。这不像一个是物理的,一个是虚拟的。他们是 虚拟和平等竞争一个物理 CPU 的份额。 当您设置处理器关联时,您将它们设置为虚拟处理器。

    【讨论】:

    • 我们知道,但是将它们命名为“物理”和“虚拟”只是识别哪些对在一起的简单方法。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多