C 识别哪个逻辑核是超线程的,哪个不是
我从/proc/cpuinfo(如下所示)获得此信息。我的问题是,这里超读了哪个核心。其次,哪个核位于哪个处理器上,因为这里有两个四核处理器,因为它是一个双插槽系统,总共有8个核 我将其解释为,内核0、2、4和6是处理器1中的4个物理内核,而内核1、3、5和7是处理器0中的4个物理内核。岩心9-15为超硬岩心。我的解释正确吗C 识别哪个逻辑核是超线程的,哪个不是,c,linux,multithreading,C,Linux,Multithreading,我从/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
-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
最好的方法就是对其进行基准测试 编写任何使用2个线程的普通程序。然后将线程绑定到两个核心上。 如果一对内核与另一对内核之间的性能显著下降,那么您就知道这两个内核位于同一个物理内核上 我会相信这样的基准,而不是其他任何告诉你的东西 在Windows中,逻辑/物理内核是交错的。 核心0,1位于同一物理核心上。 芯2,3在同一个。。。 磁芯4,5在同一个。。。等等
在Linux上可能会有所不同。您可以发布启动后的
dmesg
结果吗?它们应包含coreids的描述:
另一种变体是使用hwloc
:
创建它是为了挖掘任何系统的拓扑结构。正常系统示例:
它将代表
此实用程序的输出可以是文本格式、xml格式和渲染格式。启用超线程时,所有处理器都将变为虚拟。没有纯粹的物理处理器。作为: 打开“超线程读取”时,每个物理处理器 就好像它是两个虚拟处理器。。。两个虚拟 与每个物理处理器关联的处理器完全相同 相等的一个是物理的,一个是虚拟的。他们是 虚拟CPU和虚拟CPU都在平等竞争一个物理CPU的份额。 设置处理器亲缘关系时,将其设置为虚拟处理器
仅解决如何解释
/proc/cpuinfo
的问题:可以通过挑选具有相同值的cpu id
和核心id
的“处理器”条目来识别超读对
因此,在原始问题中提供的输出中,处理器0和处理器8是超线程对,1和9、2和10等也是超线程对。是,mystical我也试过了,结果支持我的解释。如果机器有其他无关的负载正在相同的内核上运行,那么这种基准测试方法是不可靠的。MetallicPrist,您的基准测试是一个宏(fluidanimate),当使用不同的线程号时,它是不同的代码。尝试使用具有2个线程的更简单基准测试;代码上没有区别。例如,在loop.osgx中执行屏障,我还尝试了来自PARSEC的其他基准测试,是的,所有结果都支持我的解释。在Linux CPU中,0-7是物理CPU,而8-15是超线程。在Windows中,就像你说的,CPU 0,1是一个核心。你不应该运行一个大的(宏)bechmark来查找核心之间的HT关系。你应该在成对的基础上运行microbenchmark。询问哪个核心是超线程的就像询问两个同时出生的兄弟中的哪一个是双胞胎一样。同一个内核上的所有CPU都是平等的。Gabe,我同意你的看法。Gabe,这里唯一可能的问题是:哪些虚拟处理器对共享物理内核和物理芯片(套接字)。我们知道,但将它们命名为“物理”和“虚拟”只是一种简单的方法,可以确定哪些对在一起。
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