我今天早上试图找出如何确定哪个处理器 id 是超线程核心,但没有运气。
我希望找出这些信息并用于set_affinity()
将进程绑定到超线程线程或非超线程线程以分析其性能。
我今天早上试图找出如何确定哪个处理器 id 是超线程核心,但没有运气。
我希望找出这些信息并用于set_affinity()
将进程绑定到超线程线程或非超线程线程以分析其性能。
我发现了做我需要的事情的简单技巧。
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 这是一个超线程核心。
我很惊讶还没有人提到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 是兄弟。
HT 是对称的(就基本资源而言,系统模式可能是不对称的)。
所以,如果开启了HT,两个线程之间会共享Physical core的大量资源。打开一些额外的硬件以保存两个线程的状态。两个线程都具有对物理核心的对称访问。
禁用 HT 的核心和启用 HT 的核心是有区别的;但启用 HT 的核心的第一半和启用 HT 的核心的第二半之间没有区别。
在某一时刻,一个 HT 线程可能比其他线程使用更多的资源,但这种资源平衡是动态的。如果两个线程都想使用相同的资源,CPU 将尽可能平衡线程。你只能在一个线程中做一个rep nop
或pause
一个,让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部分没有变化)
更深的缓冲和增强的资源共享/分区策略:
在第 112 页也有图片(图 2-13),显示两个逻辑内核是对称的。
HT 技术带来的性能潜力是由于:
尽管源自两个程序或两个线程的指令同时执行并且不一定在执行核心和内存层次结构中按程序顺序执行,但前端和后端包含几个选择点,用于在来自两个逻辑处理器的指令之间进行选择。所有选择点在两个逻辑处理器之间交替,除非一个逻辑处理器不能使用流水线级。在这种情况下,另一个逻辑处理器充分利用了流水线阶段的每个周期。逻辑处理器可能不使用流水线阶段的原因包括缓存未命中、分支错误预测和指令依赖性。
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
或以文本形式:
ubuntu$ sudo apt-get hwloc-nox
ubuntu$ lstopo --of console
我们可以将物理内核视为Core L#x
每个具有两个逻辑内核PU L#y
和PU 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)
在 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
我试图通过比较核心温度和 HT 核心上的负载来验证信息。