线程数,核心数,多核,cluster
Linux-查看系统CPU个数、核心数、线程数
1.CPU个数(socket的个数)
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
2.每个CPU的核心数
grep 'core id' /proc/cpuinfo | sort -u | wc -l
3.线程数
grep 'processor' /proc/cpuinfo | sort -u | wc -l
所以,CPU总的并发线程数为:
线程数=CPU个数(socket个数) x 核心数/CPU x 线程数/核心(考虑到超线程)
注意,对于分大小核的情况,核心数/CPU,线程数/核心分别计算。/proc/cpuinfo不区分大小核,显示的线程数是总线程。
以12th Gen Intel(R) Core(TM) i5-12600K为例,此款CPU是10核16线程,粗看感觉不对,毕竟16个线程没有办法平均到10个核上。实际上这是一款大小核结构的处理器。分成6个大核和4个小河。6个大核每个核2个线程,四个小核每个核1个线程,所以一共12+4=16线程。下图可以看到,其前12个线程对应的core id是2对1的关系。后面四个线程和CORE ID则是一一对应。
$ cat /proc/cpuinfo |grep "core id"
core id : 0
core id : 0
core id : 4
core id : 4
core id : 8
core id : 8
core id : 12
core id : 12
core id : 16
core id : 16
core id : 20
core id : 20
core id : 28
core id : 29
core id : 30
core id : 31
对于windows来说,通过任务管理器或者设备管理器都可以看到,要注意的是,从设备管理器中看到的CPU列表是CPU线程数,并非核数。
numa&uma:
在现代广泛应用的计算机系统中,以内存为研究对象可以分成两种体系结构,一种是统一内存访问(uniform memory access, UMA)体系结构,另一种是非统一内存访问(non-uniform memory access, NUMA)体系结构。他们的特点分别介绍如下:
UMA体系结构:内存有统一的结构并且可以统一寻址,SMP(Smmetric Multi-Processor)属于其中的一类,所有处理器访问内存花费的时间都是一样的,可以理解为整个内存只有一个节点。目前大部分嵌入式系统,手机操作系统以及台式机操作系统采用NUMA体系结构。如下图所示,该系统使用UMA体系结构,有4个CPU,他们都有L1高速缓存,其中,CPU0和CPU1组成一个簇(Cluster0),他们共享一个L2高速缓存,另外,CPU2和CPU3组成另外一个簇,他们共享另外一个L2高速缓存。4个CPU都共享同一个L3高速缓存,最重要的一点是,他们可以通过系统总线来访问DDR物理内存。
NUMA体系结构:系统中多个内存结点和多个CPU簇,CPU访问本地内存节点的速度最快,访问远端内存结点的速度要慢一点,如下图所示,该系统有三个内存节点,其中CPU0,CPU1组成一个节点node0,他们可以通过系统总线访问本地DDR物理内存,同理,CPU2和CPU3,以及CPU4和CPU5分别构成了Node1和Node2,它们也可以通过系统总线访问本地内存,如果通过UPI或者QPI总线连接,那么CPU0可以通过这条内部总线访问远端的内存节点的物理内存。但是访问速度要比访问本地物理内存慢很多。
这里有两个要点:
1.同一个CPU,访问不同的domain memory,速度不一样。
2.同一个domain memory,被不同的CPU访问,速度不一样。
numa还有一个特点,NUMA对存储的访问是通过不同的memory controller进行的,并不是同一个memory controller.而UMA所有的内存访问都从一个MC发出。NUMA对性能的提升主要是通过多个内存控制器可以独立访问带来的高带宽引起的,UMA下同一时刻只有一个processor可以访问内存。 NUMA下每个CPU/GPU可以独立访问内存。