对intel未来硬件调度的最终形态的设想
第一部分 intel频率调节的进化
在intel第六代skylake问世之前,cpu频率的调节都是由操作系统os控制的。这个时候windows是根据在一段时间内cpu的繁忙程度,以利用率为量度,当利用率超过上限阈值时提高频率,利用率低于下限阈值时降低频率。这种原始的频率调节需要windows隔一段时间就检测一次cpu利用率,时间段长了达不到及时调频的目的,时间段短了又会增加开销,都会白白浪费能源。于是在skylake,intel引入了speedshift技术,这只是个商业说法,本质上就是硬件频率调节HWP(hardware p-state)。这个技术要求windows也要有相应的内核修改,因此windows和intel共同引入了epp(energy performance preference)的概念,只需要windows将epp的值写入cpu上的一个特殊的寄存器就可以由cpu自己根据这个性能能效的要求自主调频,调频的时间间隔可以短到以微秒计,精确的同时又节能。
一直到11代都是这么过来的,但是自从12代大小核架构出现后,windows的内核又做了一个小的修改。现在windows可以对线程分类了,它可以在每一个线程开始执行之前,根据这个线程的类型往cpu寄存器写入不同的epp值,这样不同的线程就会以不同的速度执行,可以有重点的将能源向高性能要求的线程倾斜。这个功能对内核的修改很小,因为epp的机制都是现成的,是windows变着花样玩罢了,这个epp机制成为后面我对未来intel硬件线程调度的完全体设想的基础。
第二部分 intel thread director只是硬件“辅助”调度
从intel披露的所有信息和国外有人做过的研究来看,intel thread director(简称ITD)算不上是真正的硬件调度,充其量只是硬件辅助系统进行调度而已。ITD增加的内容是线程在cpu核心上执行时指令的差异信息和性能能效的具体信息,提供给windows,而最终仍然是要由windows自己来作出调度决策,也就是说windows完全可以不鸟ITD的建议,这导致了很多购买了12代酷睿的用户有着各种各样的调度问题,各种神奇的毛病,还是具体问题具体分析的那种。ITD提供了一张也是以极高的频率更新的量表,可以显示每一个线程的指令类型,在核心上运行时候的性能(pe值)和能效(ee值),windows就是参考的这些信息来进行调度的。但是问题还是,如果调度仍然需要系统亲力亲为,那么延迟就会像频率由系统决定的那样大,而且系统作出的调度决策还不一定是精确的。所以未来如果intel要发展更多类型的核心(至少现在第三个类型的超低功耗核心已经出来了),那么调度的硬件化就是未来的必然趋势。
第三部分 硬件调度的最终形态
现在我讲讲自己对intel如何利用现有条件实现纯硬件调度的绝妙想法。第一步也是最关键的一步就是线程接口的虚拟化,也就是说cpu只向windows暴露“cpu总共有几个线程(框框)”的信息,windows只能看到有几个框框可以用,哪些正在被使用,哪些是空闲的。第一步实际上是将系统对cpu线程的调度与实际上的cpu调度解绑。举个例子就是windows调用了第三个框框,但实际上软件线程是在第六个小核上执行的。
Windows之所以不需要关注软件线程在哪个核心上执行,是因为它只需要知道软件线程对性能和能效的偏好如何,而这正好就是已经有的机制!你想想在没有大小核架构之前,windows如果想要线程执行的更快,那减少这个线程的epp值不就行了嘛。有了大小核架构后,windows也只需要事先定下这个线程的epp,然后cpu自己就能分析这个线程在哪一类核心的哪一个具体核心上最能够满足epp值的要求。前面ITD提供的那张表就不需要系统去参考而是作为cpu自己的分析的一部分了。
epp值如何在调度中起作用呢?可以与pe值和ee值相结合。因为epp值本身就是性能和能效偏好程度的度量。在cpu上这个值范围是0到255,它映射到系统上时是0到100,epp值为0时表明只要性能不考虑能效,epp值为100时只要能效不考虑性能。所以我们只需要根据epp值来作加权对pe值和ee值进行综合就好!综合值称为ce的话那么公式就是
ce=(epp/100)*ee+(1-epp/100)*pe
当epp=0时,ce=pe,当epp=100时,ce=ee,当epp=50时,ce=1/2*(pe+ee)
完美符合要求!这时候cpu只要根据ce值选择ce值最大的那个核心就解决了调度问题!这样我们就利用上了intel的所有现有条件,在不增加任何系统负担的情况下将调度完全硬件化了,这很可能就是未来intel的发展方向。核心类型越多,每个核心的频率都各不相同的情况下这种硬件化的调度的优势会相当大。Intel可以把性能核心进一步分化为计算密集型的核心(计算资源巨大)和内存密集型的核心(像amd那样搞巨大的缓存),cpu在自主分析下就可以以极高的精度将线程调度到最适合的核心上,windows只要像傻子一样有空闲线程就调度线程然后指定一个epp值就ok了。