cpu并行计算_多线程 cpu

cpu并行计算_多线程 cpu对软件开发(尤其是后台服务开发)工程师来说,这几个概念几乎是必须要缕清的:CPU主频、多个CPU、多核CPU、逻辑核(超线程)、大小端。本文我们会逐一来聊聊。在之前的文章中,我们见过古老的4004CPU,也分析过古老的8086CPU,并对它进行了汇编语言编程。它们都是单核的(每个CPU只有1个运算器&控制器)。那么,现代CPU长啥样子呢?

      对软件开发(尤其是后台服务开发)工程师来说,这几个概念几乎是必须要缕清的:CPU主频多个CPU、多核CPU、逻辑核(超线程)、大小端。本文我们会逐一来聊聊。

      在之前的文章中,我们见过古老的4004CPU,也分析过古老的8086CPU,并对它进行了汇编语言编程。它们都是单核的(每个CPU只有1个运算器&控制器)。

       那么,现代CPU长啥样子呢?来看下图的Intel CPU外形图:

cpu并行计算_多线程 cpu

       我们以"Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz"这款型号的CPU为例,最近价格大致是6300块人民币,挺贵的,来看下具体参数:

cpu并行计算_多线程 cpu

      

CPU主频(时钟频率) 

      这些参数中,人们最熟知的,是CPU主频(时钟频率)。买电脑时,肯定需要看CPU主频是多少。在前面的文章中,我们自制了一台简单的计算机,并且知道了:CPU时钟越快,产生上升沿/下降沿的速度就越快,就能更快地迫使其它器件工作。

      CPU的时钟,就好比龙舟比赛的击鼓人,击鼓频率越快,就迫使划船的人跟上节奏,龙舟也就越快,如下:

cpu并行计算_多线程 cpu

      另外,从上面的CPU参数中也可以看到,该CPU有12个物理核,每个物理核对应2个逻辑核(超线程技术),所以,从外部看, 该CPU有24个核(逻辑核)。 也就是说,该CPU有12个物理上的运算器&控制器,有24个逻辑上的运算器&控制器。

       服务器,是指配置比较高端的计算机。在我的一台服务器上,安装了2个如上型号的CPU,  总共12600块钱左右。

      我们用linux的lscpu命令,来查看服务器的CPU信息,并对相关参数给出解释:


Architecture:          x86_64              CPU架构
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian       小端模式,程序员应该知道这点,本文最后会详细解析
CPU(s):                48                  这里指逻辑核, 2个CPU的逻辑核数是48
On-line CPU(s) list:   0-47                逻辑核的标号
Thread(s) per core:    2                   每个物理核有2个逻辑核(超线程技术)
Core(s) per socket:    12                  每个CPU有12个物理核
Socket(s):             2                   计算机有2个插槽,插了2个CPU
NUMA node(s):          2
Vendor ID:             GenuineIntel        Intel公司CPU 
family:                6                   CPU家族编号为6
Model:                 85
Model name:            Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz       CPU型号
Stepping:              4
CPU MHz:               820.850
CPU max MHz:           2101.0000           CPU上标注的2.1G,是最大频率,即超频
CPU min MHz:           800.0000
BogoMIPS:              4201.63
Virtualization:        VT-x
L1d cache:             32K                 L1数据缓存大小
L1i cache:             32K                 L1指令缓存大小
L2 cache:              1024K               L2缓存大小
L3 cache:              16896K              L3缓存大小
NUMA node0 CPU(s):     0-11,24-35
NUMA node1 CPU(s):     12-23,36-47
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin mba tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts pku ospke      Flags是指令集
只听到从架构师办公室传来架构君的声音:
年年战骨埋荒外,空见蒲桃入汉家。有谁来对上联或下联?

多个CPU           

        我们看lscpu的信息:

此代码由Java架构师必看网-架构君整理
Socket(s): 2

       可以看到,在这台服务器上,总共插了2个CPU,  这2个CPU是物理上的CPU, 人眼可以看到,手也可以触摸到:

cpu并行计算_多线程 cpu

多核CPU

       我们看lscpu的信息:

 Core(s) per socket:    12

       可以看到,针对每一个物理CPU而言,内部有12个物理核。也就是说,在一个物理CPU内,有12个物理层面的运算器&控制器,它们是实实在在存在的。很霸气的感觉,12个物理核如下图所示:

cpu并行计算_多线程 cpu

逻辑核(超线程)

        我们看lscpu的信息:

此代码由Java架构师必看网-架构君整理
Thread(s) per core:    2

        由于Intel采用了超线程技术,所以每个物理核对应2个逻辑核:

cpu并行计算_多线程 cpu

       要注意,在物理上看来,只有一个核,但采用了超线程技术,在使用时,实际效果是2个核在同时并行(不是同步并发)工作,也即有2个逻辑核,如下图所示

cpu并行计算_多线程 cpu

       来看看超线程的介绍:

Hyper Threading technology was developed by Intel for their processors and appeared in the year 2002 and become visible in Pentium 4 Processors first.

In general, what is Hyper Threading Technology can be explained as, technology which allows each core of the processor to work on two different tasks at the same time and it is termed as multi tasking processing.

This technology works only when two processors with high processing requirement are running, such as a video editing tools and an antivirus.

This technology is also available for desktop replacement notebooks, in the mobile Pentium 4 Processor. In addition, the software is written for multi processor computers are capable with this Hyper Threading technology.

There is no single reason for the goodness of Hyper Threading but here we listed most important key factors of Hyper Threading technology.
1. Improved application performance.
2. Improved multitasking capabilities and lag free multitasking.
3. Better graphics output in gaming and multimedia editing.
4. Saves your much time because tasks are completing faster.

Hyper Threading is a new revolution for future computing because it is not only creating new targets for us but also makes our dream bigger.

       在上面这台服务器中,有多少个逻辑核呢?

      来算一下,服务器中插有2个物理CPU, 每个物理CPU有12个物理核,每个物理核又有2个逻辑核,所以,总共是48个逻辑核。

       因此,当操作系统俯视CPU硬件时,它看到的是,在计算机中,有48个核,即有48个运算器&控制器。对于操作系统而言,它可以认为有48个CPU核在同时并行(不是同步并发)为它提供服务,且看lscpu中的信息:

 CPU(s):                48

      这里的48个CPU(s), 其实就是48个逻辑核。有时,我们也可以说,这台服务器有48个核。

      这台服务器有2个CPU, 针对其中一个CPU,我们也可以说,它是"12核24线程"。

多核CPU和多个CPU

       来看下这个问题:多核CPU和多个CPU有何区别?

cpu并行计算_多线程 cpu

       

lscpu从哪里获取信息?

       那么,lscpu命令是从哪里读取信息的呢?且看:

LSCPU(1)                                             User Commands                                            LSCPU(1)

NAME
       lscpu - display information about the CPU architecture

DESCRIPTION
       lscpu  gathers  CPU architecture information from sysfs and /proc/cpuinfo.  The command output can be optimized for parsing or for easy readability by humans.  The information includes, for  example,  the  number  of  CPUs,
       threads,  cores,  sockets, and Non-Uniform Memory Access (NUMA) nodes.  There is also information about the CPU
       caches and cache sharing, family, model, bogoMIPS, byte order, and stepping.

      因此,可以从/proc/cpuinfo中直接读取相关信息,如下:


taoge:~$ cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
2     计算机上有两个物理CPU

taoge:~$ cat /proc/cpuinfo | grep "cpu cores" | sort | uniq
cpu cores       : 12      每个物理CPU有12个物理核

taoge:~$ cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l
48    计算机共有48个逻辑核

         

      我看了一下lscpu的源码,挺简单的,无非就是读取/proc/cpuinfo信息,然后解析并组装而已。有兴趣的朋友,可以去看看lscpu的源码:https://github.com/karelzak/util-linux/blob/master/sys-utils/lscpu.c

/proc/cpuinfo的信息从何而来?

      既然lscpu从/proc/cpuinfo中获取信息,那么,我们自然要继续问:/proc/cpuinfo的信息从何而来?

      必然是在CPU内部存储了这些基本的信息啊。从这个意义上讲,CPU的指令集确实也存放在CPU中(在之前的文章中,我只说指令集存放在CPU使用手册中)。

      要注意,虽然CPU的指令集也存放在CPU中,但它仅仅是一个文本式的字符串信息而已,如下是lscpu获取的指令集信息:

Flags:  fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin mba tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts pku ospke

      来看看/proc/cpuinfo的信息,摘取部分,如下:

processor       : 47      总共48个逻辑核,编号是0-47
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz
stepping        : 4
microcode       : 0x200004d
cpu MHz         : 912.130
cache size      : 16896 KB
physical id     : 1
siblings        : 24
core id         : 13
cpu cores       : 12      1个物理CPU有12个物理核
apicid          : 59
initial apicid  : 59fpu             : yes
fpu_exception   : yes
cpuid level     : 22wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin mba tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts pku ospke
bugs            : cpu_meltdown spectre_v1 spectre_v2
bogomips        : 4201.63
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

       

操作系统对核的分配     

       需要注意的是,如上的服务器有2个CPU,  每个CPU有12物理核,每个物理核有2个逻辑核, 这仅仅是针对特定服务器和CPU的。其他计算机或者CPU, 就不一定如此了。

      来看我的另外一台云服务器,其配置就比较寒酸了:总共只有1个CPU, 1个物理核,1个逻辑核:

ubuntu@VM-0-15-ubuntu:~$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-26xx v4
Stepping:              1CPU MHz:               2394.446
BogoMIPS:              4788.89
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch bmi1 avx2 bmi2 rdseed adx xsaveopt
ubuntu@VM-0-15-ubuntu:~$

       如果在这个单核服务器上,运行如下的死循环程序,会如何呢?


#include <stdio.h>

int main()
{
  while(1);  // 死循环
  return 0;
}

      来看下top命令给出的结果,可以看到,1个进程就消耗了大约99.0%的CPU,整个CPU的使用率达到99.7%:

cpu并行计算_多线程 cpu

      那么,如果开启2个进程并发执行呢?可以看到,每个进程几乎都是占用49.x%的CPU,整个CPU的使用率达到99.7%:

cpu并行计算_多线程 cpu

      那么,如果开启3个进程并发执行呢?可以看到,每个进程几乎都是占用32.x%的CPU,整个CPU的使用率达到98.7%:

cpu并行计算_多线程 cpu

      可以看到,整个CPU几乎被瓜分殆尽。这种调度和分配,是由操作系统linux完成的。

      好的,我们再看在多核CPU上的情况。我找了另外一台服务器,用lscpu查看其CPU配置如下:

hadoop:~$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                32
On-line CPU(s) list:   0-31
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
Stepping:              1
CPU MHz:               1198.750
CPU max MHz:           3000.0000
CPU min MHz:           1200.0000
BogoMIPS:              4196.50
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap intel_pt xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local ibpb ibrs stibp dtherm ida arat pln pts

       可以看到,这个服务器有32个逻辑核,简称32个核。

       好的,我们来运行一下死循环进程,用top命令来分析,可以看到,1个进程占满1个核,使用率100%, 而服务器32个核的使用率是3.6%:

cpu并行计算_多线程 cpu

      运行2个进程,可以看到,2个进程都占用99.7%的核,而服务器32个核的使用率是6.5%:

cpu并行计算_多线程 cpu

      运行3个进程,可以看到,3个进程都占用100%的核,而服务器32个核的使用率是9.8%  

cpu并行计算_多线程 cpu

      看到使用率为100%时,不要紧张,不要以为CPU就用完了,这台服务器有32个核呢(拥有3200%的能力)。

      来看下3个进程时,每个核的具体使用情况(3个进程,总共大概占用300%的核):

cpu并行计算_多线程 cpu

      这些值会动态地变化,而且不一定是消耗在某些固定的核上。核的调度和资源分配,由操作系统linux来完成:

cpu并行计算_多线程 cpu

      到此为止,我们对CPU逻辑核应该有了更深入的了解。

大小端模式

       最后,来看一个大小端的问题,看lscpu信息:

Byte Order:            Little Endian

       它的含义是: CPU是小端模式。相信几乎所有的程序员都听说过这个概念,我们具体来测试一下:

      下面是在Intel CPU + Windows + VC++6.0上的测试结果,可以看到:低位的0x78存储在地址较小的位置(端模式):

cpu并行计算_多线程 cpu

      我找大端模式的CPU,  找了好久,终于找到了。下面是对8051单片机进行的仿真测试,可以看到:高位的0x12存储在地址较小的位置(大端模式):

cpu并行计算_多线程 cpu

       好了,至此为止,我们对CPU的基本参数,有了大致的了解。以后也可以谈笑风生地聊多个CPU、多核CPU、逻辑核和大小端模式了,装X吹水不成问题。

       先聊到这里,下次再见。

架构君码字不易,如需转载,请注明出处:https://javajgs.com/archives/165796
0
 

发表评论