Linux找出超线程的核心ID

我今天上午花在了解如何确定哪个处理器ID是超线程核心,但没有运气。

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

Solutions Collecting From Web of "Linux找出超线程的核心ID"

我发现了简单的伎俩来做我所需要的。

 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 ,所以cpu13是超线程核心。

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

因此,如果HT打开,两个线程之间将共享物理内核的大量资源。 一些额外的硬件打开,以保存两个线程的状态。 两个线程都有对物理核心的对称访问。

HT禁用核心和HT核心有所不同, 但HT核心的第一半和HT核心的第二半核心没有区别。

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

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

好吧,您实际上可以在不知道事实的情况下衡量表现。 当系统中唯一的线程绑定到CPU0时,只需要执行配置文件; 绑定到CPU1时重复。 我认为,结果几乎是一样的(如果将某些中断绑定到CPU0,操作系统可能会产生噪声;所以如果有这样的情况,请尝试降低中断次数,并尝试使用CPU2和CPU3)。

PS

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

如果检测到超线程,则锁定进程仅使用偶数编号的逻辑处理器。 这将使每个处理器内核中的两个线程中的一个处于空闲状态,以便不存在资源争用。

PPS关于新轮回HT(不是一个P4,而是Nehalem和Sandy) – 基于Agner关于微体系结构的研究

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

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

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

PPPS: 英特尔优化书籍列出第二代HT中的资源共享:(第93页,此列表适用于nehalem,但在Sandy部分没有此列表的更改)

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

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

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

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

  • •操作系统和用户程序可以安排进程或线程在每个物理处理器的逻辑处理器上同时执行
  • •比仅有单个线程占用执行资源时更高的级别使用片上执行资源的能力; 更高的资源利用率会导致更高的系统吞吐量

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

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

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

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

描述:

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

它具有lstopo命令来获得图形形式的hw拓扑

  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) 

我很惊讶没有人提到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内核的温度和负载来验证信息。

在这里输入图像说明