cpu超线程有什么用(cpu超线程的优缺点)

cpu超线程有什么用(cpu超线程的优缺点)

  在2021年,应该已经没有人会问出为什么我购买了一颗四核心的i3-10100,却能在任务管理器看到八个框框这种问题了,随着牙膏厂在初代酷睿I系列开始重新加入超线程技术,超线程已经不知不觉在消费级市场存在了十多年,并已经成为大家见怪不怪的功能。众所周知八个框框就是比四个框框性能高(FX系列除外)。(首先,牙膏厂的超线程(HT,Hyper-Threading)其实更应该叫做同步多线程(SMT,Simultaneous Multi-Threading),至少AMD也是这么叫的,只不过大家超线程喊习惯了,包括我)

  超线程技术在2002年就被牙膏厂安排进了奔腾4 HT中,据我所知这是消费级桌面平台第一款超线程处理器。只不过由于当时的超线程技术不成熟以及缺乏软件和操作系统的优化支持,这颗奔腾4的超线程大部分情况下是负提升,因此intel之后雪藏了这个技术,直到2008年推出全新的酷睿i系列,超线程技术重回消费级市场,并且一直沿用至今。如今的第10、11代酷睿已经下至i3上到i5全系支持超线程,在2017年奔腾G4560的推出也标志着奔腾系列正式支持超线程,似乎只剩下赛扬时至今日依然不支持超线程了(笑)。而隔壁AMD在翻身之后的初代Ryzen开始支持超线程,ZEN3则实现了全系超线程支持。

  超线程最明显的特征,就是能让任务管理器看到双倍于核心数量的框框(当然IBM甚至能1核当8核用,这里就不提了)比如四核心的i3-10100在任务管理器里可以看到八个核心。系统或者软件会认为i3-10100这个处理器就是八个核心,并且也会按照最多八个核心的“事实”去调度应用程序的运行。

  这里不得不提到两个概念:进程与线程。我就不带大伙复习操作系统了,不然这可不是一个图文就能讲明白的,简单来说,你们可以把进程看做是一个正在运行的程序,而线程是这个程序执行的最小单元。一个程序有许许多多的功能,那么这些功能可以交给多个线程分别执行,因此一个进程可以包含一个或者多个线程。

  讲一个常见的例子:高速公路收费站,有车道+收费站+收费站的工作人员。一辆辆汽车(指令队列)排队进入收费站(前端发射单元),收费站需要核验汽车信息和收费(指令解码),并指定汽车去前方哪一条车道(执行单元:ALU运算器、FPU运算器、Cache……)

  而CPU最小的执行粒度就是线程,一般来讲一个物理核心同一时刻只能执行一个线程,也就是说,这个高速公路只能同时检查收费一辆车,并且指定一次车道,而当第二辆车进来时,需要等待第一辆车跑出这段车道,再放行第二辆车。这时候我们可以注意到,一辆车只会占用一个车道,而其他车道都是空着的,也就是说车道资源被大大浪费了。

  这时候,领导一拍大腿:收费站现在只有一个,那我们在旁边再建一个!于是收费站变成了两个,当第一个收费站放行了车辆1到车道1之后,第二个收费站发现车辆2需要进去车道3,那么车1和车2就能在互不干扰的情况下在车道同时跑了。而这大致就是超线程技术的实现方法。

  好了,你已经明白了超线程技术的基本原理,现在我们来动手设计一颗SIMD五级流水线RISC处理器吧!

  通过超线程技术,处理器可以利用其他指令执行时闲置的执行单元丢入其他指令执行,尽可能的充分利用一个物理核心的全部部分。原本CPU在执行一个线程时用不到的单元是闲置的,通过超线程技术可以尽量榨干CPU的每一寸晶体管。英特尔曾经说超线程技术只需要增加约5%的核心面积,便可以增加约20%的多线程性能。视操作系统的调度和应用程序的优化,这个性能的提升幅度也不全相同,但终归不会再出现早年奔腾4HT那样开启超线程负提升的情况了。并且随着超线程技术的进步和应用程序多线程优化水平的进步,超线程无论是在还是生产力中都有了很明显的性能表现提升。

  以农企5600X为例,这是一颗6核心12线程的处理器 我们分别在BIOS中关闭和开启SMT Mode,并运行象棋跑分和-z跑分,结果如下:

  关闭超线程

  打开超线程

  可以看到超线程开启带来的性能提升约在30%左右,已经完全可以看做多出来凭空两颗物理核心了(10600K VS 9700K)

  至于牙膏厂这边,我拿10100F试了一下cpu-z

  ,多线程提升似乎比AMD少那么一点点

  当然,一个核心“虚拟”成两个核心,也会对多核调度水平有更高的要求。分别放入同一个物理核心的两个虚拟核心和放入两个不同物理核心执行,其性能差距十分巨大。上面已经通过跑分证明多线程也就带来30%左右的提升,并不是一个核心可以完全当作两个核心用。以下是通过任务管理器限制程序处理器在一颗核心的两个线程运行和两个核心上运行得到的跑分,可以看到被限制在同一个物理核心上,性能只有真正的双核运行的70%的性能。

  而当通过限制程序运行在3C6T和6C6T上时,同样会得到相似的数据,我已经拿牙膏厂U和农企U都试过,在任务管理器里同一个物理核心的两个逻辑线程是相邻的,比如CPU0和CPU1是第一颗物理核心的两个逻辑线程,CPU2和CPU3是第二颗物理核心的两个逻辑线程,以此类推。通过在任务管理器详细信息的进程右键菜单设置相关性,限制进程的核心分配并进行测试,可以复现我的结论。

  当然啦,以上测试只是一时兴起,随手测试,没有严格控制变量,后台还开挂个QQ,任务管理器的图表显示也会占用一部分处理器资源,所以,大家图一乐就好。

  Q1:这么牛逼的技术,为什么没有完全普及呢?

  A1:超线程技术相对更适合一些流水线冗长复杂、执行单元众多的架构,用于提高晶体管利用率,一些比较简单的架构就算加入超线程技术,也没啥卵用,还不如省下来空间多做一个核心。

  Q2:为什么手机处理器没有做超线程?

  A2:其实手机处理器有,以前联想出过,搭载的Atom Z2580 2C4T处理器(但是反响似乎一般)。顺带一提ARM也有cortex-A65AE,支持超线程,过不是做给手机的。我怀疑是因为八核心听着比四核心八线程强所以没搞。另外相比于超线程,移动终端为了闲置续航和功耗,用的是big.LITTLE大小核解决多任务并行,多余的任务直接丢后台让小核跑,比一个大核心分出来俩超线程要省电。

  Q3:超线程会不会损失单核性能?

  A3:理论上,会的,当一个物理核心的一个线程运行时,另一个线程如果需要执行新任务,一旦发生资源占用冲突,势必会影响速度。在高负载时这个现象尤为明显,我试了5600X单核象棋4300分,而单核双线程象棋6000分,相当于单线程性能降低到了3000分,当然以上只是极端情况,对比我前面的CPU-Z测试截图,低负载下超线程开启与关闭对于单核性能的影响有限,5600X完全可以看做测试误差,10100F影响大一点约莫5%,但是相比超线程带来的接近30%的性能提升,这点损失不算什么。

推荐阅读