对超线程几个不同角度的解释

角度1:举个栗子

假设我是一个CPU,我现在需要process(吃)一些食物,我现在只有一张嘴。

假如我有多张嘴,肯定就可以process更多的食物。这就是multi-core processor所要想要完成的任务。但是由于某些原因及限制,有时候无法实现这种方式。

我只有一张嘴,我可以用手抓一片食物,送到嘴边,然后在嘴busy的时候,抓起下一片食物,继续送到嘴边。如果出现这种情况:当我的嘴已经吃完那一片食物了,这个时候手还没有将食物送到嘴边,这时候我的嘴就处于空闲状态。假如我有两只手,即使我的嘴并不能吃得更快,但我的嘴也不需要浪费任何时间,可以一直处于busy的状态。这就是hype-threading(超线程),一个processor,然后加上很智能的调度系统,使得processor可以一直处于busy的状态。

超线程对单线程的任务,也就是后面一部分任务必须依赖于前面一部分任务,并没有太大作用。

比如你要吃一个两勺冰淇淋锥,你必须先吃掉上面的部分,然后才能吃下面的部分。在这种情况下,增加更多的嘴或者手,都是没有什么意义的。

与之相反的,吃很多糖果。吃红色的糖和吃蓝色的糖之间,是没有任何先后关系的。如果现在我有多张手、多张嘴,肯定是可以更多吃完这糖果的。

在现实生活中,受益于超线程和多核处理器的常见任务有:

  • 编辑视频
  • 3D渲染
  • 繁重的多线程任务

比如编辑视频,视频是一帧一帧的,完全可以在编辑这一帧的时候同时编辑另外一帧。

总结一下:超线程的目的,就是使得processor busy,充分利用CPU资源。所以,超线程并没有他名字听上去那么神奇,

角度2:超线程之于CPU的意义

首先需要理清楚CPU核core的关系:

上面这张图一图胜千言,CPU(processor)是一个物理上的小盒子,里面在物理上又分为多个core,每个core在功能上市独立的,可以独立运行自己的线程。不同的core之间共享一个3级缓存、共享common bus。相比多CPU单核,单CPU多核的优势在于不同的core之间可以共享一部分资源,之间通信也要相对容易很多;缺点在于复杂度提升,因为共享自然就会牵涉到不同线程之间的协调、管理、锁等问题。

超线程是intel开发的,已经有10多年的历史了,它可以在同一时刻,执行两个线程,从而提高了单个CPU core的效率。如下图所示:

来简略看一下CPU的发展阶段: 刚开始,一个CPU只有一个core,一个CPU只能同时运行一个线程:

接着,CPU设计师开始往一个CPU里面添加更多的core,现在一个CPU就可以同时运行多个线程了:

为了进一步提高CPU的性能,Intel又发明了超线程。超线程把一个物理的core,在逻辑上分成了两个虚拟核(two virtual cores)。现在,在操作系统的眼里,这个2核CPU实际上就是一个4核CPU了。

在操作系统眼里,现在CPU有4个核,她可以把工作分摊给这4个(虚拟的)核。每个core都可以独立地执行指令。 总结一下:超线程就是提高虚拟核的一种手段,减少了CPU处于空闲状态的时间。

角度3:超线程是如何实现的

我们还是从最开始、最简单的说起。

首先是单核CPU,树莓派使用的就是单核CPU,但是树莓派依然可以运行多任务的linux系统。为什么呢?实际上在底层,操作系统在不停地切换不同的任务,速度之快到让你觉得他们是真的同时运行的。

然后是多核CPU,如上所说的,不同的core之间在逻辑上是独立的,他们会共享一些资源。操作系统就可以给不同的core分发不同的任务,如果你要运行一个多线程的任务,你拥有的core越多,速度就会越快。

再然后就是超线程了。要在一个core上面实现两个线程,那么这个core该怎么设计呢?

把一个core的前半部分复制一下,然后合在一起,再和后半部分拼接一下,这种情况下,我们就有了一个可以同时执行两个线程的FRONTEND,或者以一个程序员更容易理解的角度来说,有了一个可以执行双线程的api接口,对于操作系统来说,他可以"调用"这个接口,同时分两个任务给这个core!这样不就在一个core的基础上实现了双线程吗?(当然,在最后,这两个线程最终是需要合并的。)

把这种core组合一下,就成了多核CPU,且每个CPU都支持超线程技术。

接着再来看一个现实生活中的栗子:地铁过安检。

排了有两个队,但是只有一个安检员。分三种情况讨论:

  • 对面那队是空的,这种情况下我这一对可以很快通过。
  • 对面那队阻塞了,这对我这一队没有影响,我们可以不受影响地通过。
  • 两队都是正常的,这个时候在安检员那儿,就会产生竞争核堵塞。

把队伍换成前面说的两个FRONTEND接口,把安检员当作是core,每个接口都能独立得fetch指令,然后把指令传递给core。core在真正执行指令的时候,是会产生竞争的,**所以在性能上来说,一个有超线程能力的单核CPU,是无法和一个双核CPU相比的。**只有当其中一个queue阻塞的时候,才能得到双倍的性能。一般而言,有超线程的核,性能上是没有超线程的核的1.25倍。

那么我们来做一个计算题:一个6核12线程的CPU,和一个8核8线程的CPU,哪一个综合性能要好一点?

  • 6核12线程,也就是6个有超线程能力的物理核,实际上可以相等于6 * 1.25 = 7.5个核
  • 8核8线程,就是8个核

所以,8核8线程的性能还要相对好一点。

关注我的微信公众号

猜你喜欢

转载自juejin.im/post/5c58f1e951882562811d2f5f