天天看点

超线程_Hyper Thread超线程的种种

说起HT技术,这早就是15年以前的技术了,当下主流的X86 CPU大多数都支持HT技术。简而言之,HT技术就是一个把物理CPU core虚拟成多个逻辑CPU并允许并行执行指令的功能。之所以写这篇文章主要是回答几个常见的问题:

  • 为什么有HT技术,为什么HT只有单核心双线程?
  • HT和真实的core到底有什么区别?

首先第一个问题:X86到底属于复杂指令集CPU CISC(Complex Instruction Set Computer)还是精简指令集CPU RISC(Reduced Instruction Set Computer)?

这个问题还是有点“意识形态”的味道。RISC的指令集简单精练,比较容易提升CPU频率从而提升性能。这是一把双刃剑,一方面过于简单的指令意味着更高的开发、调优成本,没有足够经验丰富工程师支持的CPU平台注定吸引力不足。反观CISC这边,一切都是相反的——难以快速地提升硬件性能,却有大(lian)量(jia)的足够经验的工程师。

于是当今的X86搞定了一个相对骑墙的做法:用户层面依然保留着CISC那冗长且强大的指令集,增加了一个Front-end,将CISC翻译成RISC跑在底层电路上。这种方法一方面降低了软件工程师的门槛,另一方面也同时保持住了x86沿用至今40多年的向下兼容指令集或者说历史包袱。用户层的代码通过编译器譬如C/C++得到的CISC指令集代码称为机器码,而内部的RISC指令集则称为微码。这里要指出的是,“升级微码”事实上只是升级了从机器码到微码的编译器,并不是直接字面意义上修改什么指令。

一句题外话,跟X86作为CISC的扛把子一样,ARM作为RISC界的扛把子也在RISC之上实现了部分的CISC的指令集,殊途同归。——可笑的是这两家还是市场上的冤家,只是因为现在实在找不出其他家的产品可以达到这个市场占有量了。

说了半天,貌似这些指令集的事情跟HT一点关系也没有,其实不然。

CISC的指令比RISC重很多,借鉴了工业化流水线的思路,一条CISC可以被翻译成若干RISC指令。于是CPU内部处于加速指CISC速度的原因采用了多种技术:

  • 集成了多个处理单元执行不同的RISC,达到了并行化RISC的目的。
  • RISC微码经过解耦之后,支持乱序执行,执行时间规划,分支预测等时间统筹方法。
超线程_Hyper Thread超线程的种种

上图是某代X86平台执行引擎的示意图。 scheduler是负责时间规划的调度器,相当于企业的销售部门。有0-7总共8个端口并发执行微码,端口在这里可以理解为工厂的车间。如果留意到端口之后的处理单元的话,你会发现不同的处理单元的数量是不一样的。不同配置的处理单元可以理解为各个车间职责的不同。比如INT ALU整数加减单元就大于INT MUL整数乘单元,这是综合了实现复杂度、处理时间、指令统计占比等多重考虑的结果。同时,理论上多条指令只要没有依赖性,存在空闲的执行模块就可以并行操作。这就好比一个流水线上生产的某一个通用螺丝,它本身并不在意会被用在产品A还是产品B上。

在OS层面上,线程的实现本身就是软件上降低依赖性,提升并发度的方法。而“假装自己是两个处理器”是最简单的硬件解耦,于是HT技术就这么产生了。首先解码逻辑核心1的机器码,送入执行单元,等待结果的同时解码逻辑核心2的机器码,如果出现的空闲的执行单元恰好是逻辑核心2的微码需要的,就直接送入执行单元不必一定要等待逻辑核心1的代码完全执行完毕。这一来一去,两个逻辑核心变得相对独立了。

回答另一个问题,决定一个物理核心的HT数量有几个限制条件:

执行单元的限制,从上面的介绍你应该有这个概念。假设一个物理核心上的两个逻辑核心都抢占某个处理单元,那逻辑上的“并发”就无从谈起。

执行时间的长短,即便是等价于RISC指令的微码,每个微码的执行时间也是长短不一的,比如ALU加减法和MUL乘法的门电路实现就比DIV除法的门电路实现简单的多,一条除法运算的时间足够做几条加法计算的。并发在这个时候就是有意义的,如果所有微码的执行时间都是一致的,“共线生产”的方式就变得低效率,执行时间规划和分支预测就意义不大了。

还有就是,当前2HT的设定还考虑到了Front-end的解码能力和CPU的占空比,这是相对宏观的设定。即便在当下的L1缓存下,CPU访存照样还有3个cycles左右的时延,这个过程中完全可以执行多条其他逻辑核心的指令。

以上可知,HT的初衷是“不让RISC执行单元空闲下来”,而讽刺的是为了提升HT性能,近几年冗余的RISC执行单元却越来越多。这似乎成了x86平台历来的诅咒。从ALU的数量上以及当前指令中front-end耗时占比来看(推荐我的另一篇帖子),HTx4 似乎也不具备实现上的难度,1 phy-core = 2 logical-core 更多的像是一个妥协下的产物。

牛顿:我能看的更远,是因为我站在巨人的肩膀上! X86 CPU架构师:我看的不远,是因为巨人站在我肩膀上……

--原文2019/02/22 发布于开源小站

Hyper Thread超线程的种种​www.litrin.net

超线程_Hyper Thread超线程的种种

---

20190312 update:

补充农企这边的架构,与牙膏不同的是dispatch是包含在front-end里的,而且划分为整数单元和浮点数单元两个大部分。万变不离其宗,CISC转RISC以及,不让RISC执行单元闲置的哲学是一致的。

超线程_Hyper Thread超线程的种种