20

我今天早上试图找出如何确定哪个处理器 id 是超线程核心,但没有运气。

我希望找出这些信息并用于set_affinity()将进程绑定到超线程线程或非超线程线程以分析其性能。

4

6 回答 6

45

我发现了做我需要的事情的简单技巧。

cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list

如果第一个数字等于 CPU 编号(本例中为 0),则它是一个真正的内核,否则它是一个超线程内核。

真实核心示例:

# cat /sys/devices/system/cpu/cpu1/topology/thread_siblings_list
1,13

超线程核心示例

# cat /sys/devices/system/cpu/cpu13/topology/thread_siblings_list
1,13

第二个示例的输出与第一个示例完全相同。但是我们正在检查cpu13,第一个数字是1,所以 CPU 13 这是一个超线程核心。

于 2011-10-18T18:53:50.243 回答
14

我很惊讶还没有人提到lscpu。这是一个具有四个物理内核并启用超线程的单插槽系统的示例:

$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,0,0,0,,0,0,0,0
5,1,0,0,,1,1,1,0
6,2,0,0,,2,2,2,0
7,3,0,0,,3,3,3,0

输出解释了如何解释 ID 表;具有相同核心 ID 的逻辑 CPU ID 是兄弟。

于 2016-12-15T17:51:55.970 回答
12

HT 是对称的(就基本资源而言,系统模式可能是不对称的)。

所以,如果开启了HT,两个线程之间会共享Physical core的大量资源。打开一些额外的硬件以保存两个线程的状态。两个线程都具有对物理核心的对称访问。

禁用 HT 的核心和启用 HT 的核心是有区别的;但启用 HT 的核心的第一半和启用 HT 的核心的第二半之间没有区别。

在某一时刻,一个 HT 线程可能比其他线程使用更多的资源,但这种资源平衡是动态的。如果两个线程都想使用相同的资源,CPU 将尽可能平衡线程。你只能在一个线程中做一个rep noppause一个,让CPU给其他线程更多的资源。

我希望找出这些信息并使用 set_affinity() 将进程绑定到超线程线程或非超线程线程以分析其性能。

好的,您实际上可以在不知道事实的情况下衡量性能。只需在系统中唯一的线程绑定到 CPU0 时进行配置;并在绑定到 CPU1 时重复此操作。我认为,结果几乎是一样的(如果操作系统将一些中断绑定到 CPU0 会产生噪音;所以在测试时尽量减少中断数量,如果有的话,请尝试使用 CPU2 和 CPU3)。

附言

Agner(他是 x86 中的 Guru)建议在您不想使用 HT 的情况下使用偶数内核,但在 BIOS 中启用了它:

如果检测到超线程,则锁定进程以仅使用偶数逻辑处理器。这将使每个处理器内核中的两个线程之一空闲,从而不会争用资源。

PPS 关于 New-reincarnation HT(不是 P4,而是 Nehalem 和 Sandy)——基于 Agner 对微架构的研究

Sandy Bridge 中需要注意的新瓶颈如下: ... 5. 线程之间的资源共享。当超线程开启时,许多关键资源在核心的两个线程之间共享。当多个线程依赖于相同的执行资源时,关闭超线程可能是明智之举。

...

在 NetBurst 和 Nehalem 和 Sandy Bridge 中引入了一种中途解决方案,采用了所谓的超线程技术。超线程处理器有两个逻辑处理器共享同一个执行核心。如果两个线程竞争相同的资源,这样做的优势是有限的,但是如果性能受到其他因素(例如内存访问)的限制,超线程可能会非常有利。

...

英特尔和 AMD 都在开发混合解决方案,其中部分或全部执行单元在两个处理器内核之间共享(英特尔术语中的超线程)。

PPPS:Intel Optimization book 列出了第二代HT中的资源共享:(第93页,这个列表是给nehalem的,但是这个列表在Sandy部分没有变化)

更深的缓冲和增强的资源共享/分区策略:

  • — HT操作的复制资源:寄存器状态,重命名返回堆栈缓冲区,大页面ITLB //我的评论:这个HW有2组
  • — 用于 HT 操作的分区资源:加载缓冲区、存储缓冲区、重新排序缓冲区、小页面 ITLB 在两个逻辑处理器之间静态分配。// 我的评论:这个硬件只有一组;它在两个 HT 虚拟内核之间静态拆分为两半
  • — HT 操作期间的竞争共享资源:保留站、缓存层次结构、填充缓冲区、DTLB0 和 STLB。// 注释:单组,但不分成两半。CPU 会动态地重新分配资源。
  • — 在 HT 操作期间交替:前端操作通常在两个逻辑处理器之间交替,以确保公平。// 注释:有单个前端(指令解码器),因此线程将按顺序解码:1、2、1、2。
  • — HT 不知道的资源:执行单元。// 注释:有实际的硬件设备会进行计算、内存访问。只有一套。如果其中一个线程能够使用大量执行单元,并且它的内存等待数量很少,它将消耗所有执行单元并且第二个线程的性能会很低(但 HT 有时会切换到第二个线程。多久一次? ??)。如果两个线程都没有进行重度优化和/或有内存等待,则执行单元将在两个线程之间拆分。

在第 112 页也有图片(图 2-13),显示两个逻辑内核是对称的。

HT 技术带来的性能潜力是由于:

  • • 操作系统和用户程序可以调度进程或线程在每个物理处理器中的逻辑处理器上同时执行的事实
  • • 与仅单个线程消耗执行资源时相比,能够在更高级别使用片上执行资源;更高水平的资源利用率可以导致更高的系统吞吐量

尽管源自两个程序或两个线程的指令同时执行并且不一定在执行核心和内存层次结构中按程序顺序执行,但前端和后端包含几个选择点,用于在来自两个逻辑处理器的指令之间进行选择。所有选择点在两个逻辑处理器之间交替,除非一个逻辑处理器不能使用流水线级。在这种情况下,另一个逻辑处理器充分利用了流水线阶段的每个周期。逻辑处理器可能不使用流水线阶段的原因包括缓存未命中、分支错误预测和指令依赖性。

于 2011-09-01T19:11:54.183 回答
4

OpenMPI 项目提供通用(Linux/Windows)和便携式硬件拓扑检测器(核心、HT、cacahes、南桥和磁盘/网络连接位置)hwloc。你可以使用它,因为 linux 可能使用不同的 HT 核心编号规则,我们无法知道它是偶数/奇数还是 y 和 y+8 编号规则。

hwloc主页: http ://www.open-mpi.org/projects/hwloc/

下载页面: http ://www.open-mpi.org/software/hwloc/v1.10/

描述:

Portable Hardware Locality (hwloc) 软件包提供了现代架构分层拓扑的可移植抽象(跨操作系统、版本、架构……),包括 NUMA 内存节点、套接字、共享缓存、内核和同时多线程。它还收集各种系统属性,例如缓存和内存信息,以及网络接口、InfiniBand HCA 或 GPU 等 I/O 设备的位置。它主要旨在帮助应用程序收集有关现代计算硬件的信息,以便相应地有效地利用它。

它具有lstopo以图形形式获取硬件拓扑的命令,例如

 ubuntu$ sudo apt-get hwloc
 ubuntu$ lstopo

来自 hwloc (OpenMPI) 的 lstopo - 输出示例

或以文本形式:

 ubuntu$ sudo apt-get hwloc-nox
 ubuntu$ lstopo --of console

我们可以将物理内核视为Core L#x每个具有两个逻辑内核PU L#yPU L#y+8.

Machine (16GB)
  Socket L#0 + L3 L#0 (4096KB)
    L2 L#0 (1024KB) + L1 L#0 (16KB) + Core L#0
      PU L#0 (P#0)
      PU L#1 (P#8)
    L2 L#1 (1024KB) + L1 L#1 (16KB) + Core L#1
      PU L#2 (P#4)
      PU L#3 (P#12)
  Socket L#1 + L3 L#1 (4096KB)
    L2 L#2 (1024KB) + L1 L#2 (16KB) + Core L#2
      PU L#4 (P#1)
      PU L#5 (P#9)
    L2 L#3 (1024KB) + L1 L#3 (16KB) + Core L#3
      PU L#6 (P#5)
      PU L#7 (P#13)
  Socket L#2 + L3 L#2 (4096KB)
    L2 L#4 (1024KB) + L1 L#4 (16KB) + Core L#4
      PU L#8 (P#2)
      PU L#9 (P#10)
    L2 L#5 (1024KB) + L1 L#5 (16KB) + Core L#5
      PU L#10 (P#6)
      PU L#11 (P#14)
  Socket L#3 + L3 L#3 (4096KB)
    L2 L#6 (1024KB) + L1 L#6 (16KB) + Core L#6
      PU L#12 (P#3)
      PU L#13 (P#11)
    L2 L#7 (1024KB) + L1 L#7 (16KB) + Core L#7
      PU L#14 (P#7)
      PU L#15 (P#15)
于 2015-02-28T23:11:09.917 回答
2

在 bash 中获取 cpu 内核的超线程兄弟姐妹的简单方法:

cat $(find /sys/devices/system/cpu -regex ".*cpu[0-9]+/topology/thread_siblings_list") | sort -n | uniq

还有lscpu -e哪些将提供相关的核心和 cpu 信息:

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0       yes    4100.0000 400.0000
1   0    0      1    1:1:1:0       yes    4100.0000 400.0000
2   0    0      2    2:2:2:0       yes    4100.0000 400.0000
3   0    0      3    3:3:3:0       yes    4100.0000 400.0000
4   0    0      0    0:0:0:0       yes    4100.0000 400.0000
5   0    0      1    1:1:1:0       yes    4100.0000 400.0000
6   0    0      2    2:2:2:0       yes    4100.0000 400.0000
7   0    0      3    3:3:3:0       yes    4100.0000 400.0000
于 2019-10-09T15:06:39.880 回答
1

我试图通过比较核心温度和 HT 核心上的负载来验证信息。

在此处输入图像描述

于 2014-04-12T17:30:53.337 回答