无论大小核现在的实际性能和功耗表现如何,它的基本原理都具有合理的成分。在这里我仅从线程调度和执行的角度来谈谈为什么大小核的架构具有前瞻性,甚至线程调度的原则本身与大小核的缓存架构也是相适应的。
过去为了追求更强的单线程性能,核心规模做的越来越大,面临的功耗和发热限制也是越来越显著的,所以发展到一定程度,多核心架构成为了必然。双核心cpu刚诞生的时候就是为了达到“在功耗限制下增加多线程性能”的目标,但是存在一个问题,如果要保持单线程性能不变,那么总功耗将随着核心数量的增加而线性增加。虽然线性增长的功耗相对于平方甚至立方增长的功耗来说相当不错了,但总功耗的增长仍然是显著的,当核心增加到一定程度就不得不需要水冷等特殊的散热手段。另一方面,同构的核心并不能被同等地利用,软件总是存在少数几个主要线程承担繁重负载和多数次要线程,同构的核心意味着同等对待这些线程,所以会导致功耗白白浪费。超线程虽然可以更加充分利用大核已有的资源提高能效,但是线程之间的资源竞争冲突影响了单线程性能,对于串行任务来说是得不偿失的。所以一种天才的想法就是:既然很多线程不需要那么高的处理性能,我们把这些线程交给低功耗低性能的更多数量的小核不就行了,省下来的功耗刚好给大核让其维持高性能,这一步还顺便解决了多核睿频与单核睿频的冲突。过去在多线程负载下,intel的cpu是要一同降频的,导致多线程性能与单线程性能不得兼得,现在多线程交给小核了不影响大核频率,大核就可以实现更高的单线程性能的同时还有更高的多线程性能。
大小核唯一重要的挑战就是:哪些线程给大核,哪些线程给小核?真正称得上大小核的系统,大核规模与小核规模必须要有足够的区分度,比如苹果大核是8发射,小核是4发射,这决定了两种核心的ipc上限。但是问题来了,是否所有线程跑到大核上就能实现很高的ipc呢?答案显然是否定的!有的线程有着较高的潜在ilp(指令并行度),这样的线程跑在大核上就能比在小核上有显著的ipc提升,而有的线程有着大量的等待和与其他线程的通信,这样的线程扔到大核上并不能充分利用大核的宽架构,ipc提升很小,所以这样的线程更适合给小核。以上事实导致了intel thread director这个硬件调度器正是按照这样的逻辑进行设计的,即把那些显著受益于大核宽架构的线程优先调度给大核,其他的则交给小核,实现了高低ipc线程的分离,这样大核上只留下高ipc线程,大核就能始终维持在一个很高的ipc状态,硬件得到了充分利用的同时还实现了更高的性能。或者换句话说就是实现同样的性能需要的频率可以更低了。大小核架构的区别越大,这种区分线程ipc的逻辑就越优越。
分离两种线程的另一个好处就是,低ipc线程给小核后,高ipc线程就不需要等待低ipc线程执行完后再执行了,响应延迟就大大降低。现在我们来看intel在12代对缓存结构的改变,大核有着更大的独占的L2缓存。高ipc线程有着很大的可能是较为独立的线程,很少与其他线程进行通信,因为通信频繁的线程很难维持在高ipc状态,所以独占的大L2缓存的设计刚好适合这样的线程,也更容易让大核跑满,那些通信频繁经常等待的线程交给低ipc的小核,性能损失也很小,小核共享二级缓存刚好适合低ipc线程交流数据。
所以大小核从线程调度来看是非常具有前瞻性的,intel设计的线程调度器本身是没有问题的,出问题的正如我前面的帖子所言,是系统的锅,因为系统软件层面的调度优先级是高于硬件的,所以如果系统层面的调度有问题的话,硬件调度器就没法充分发挥优势。不过在我修改后的调度文件中,已经把系统软件层面的调度优先级降到最低,几乎不会有什么不良的影响了。下面贴出最新版本供有需要的使用
https://pan.baidu.com/s/1WvQ3bm8rnN3SsDFa8BuUFw?pwd=qmgg
过去为了追求更强的单线程性能,核心规模做的越来越大,面临的功耗和发热限制也是越来越显著的,所以发展到一定程度,多核心架构成为了必然。双核心cpu刚诞生的时候就是为了达到“在功耗限制下增加多线程性能”的目标,但是存在一个问题,如果要保持单线程性能不变,那么总功耗将随着核心数量的增加而线性增加。虽然线性增长的功耗相对于平方甚至立方增长的功耗来说相当不错了,但总功耗的增长仍然是显著的,当核心增加到一定程度就不得不需要水冷等特殊的散热手段。另一方面,同构的核心并不能被同等地利用,软件总是存在少数几个主要线程承担繁重负载和多数次要线程,同构的核心意味着同等对待这些线程,所以会导致功耗白白浪费。超线程虽然可以更加充分利用大核已有的资源提高能效,但是线程之间的资源竞争冲突影响了单线程性能,对于串行任务来说是得不偿失的。所以一种天才的想法就是:既然很多线程不需要那么高的处理性能,我们把这些线程交给低功耗低性能的更多数量的小核不就行了,省下来的功耗刚好给大核让其维持高性能,这一步还顺便解决了多核睿频与单核睿频的冲突。过去在多线程负载下,intel的cpu是要一同降频的,导致多线程性能与单线程性能不得兼得,现在多线程交给小核了不影响大核频率,大核就可以实现更高的单线程性能的同时还有更高的多线程性能。
大小核唯一重要的挑战就是:哪些线程给大核,哪些线程给小核?真正称得上大小核的系统,大核规模与小核规模必须要有足够的区分度,比如苹果大核是8发射,小核是4发射,这决定了两种核心的ipc上限。但是问题来了,是否所有线程跑到大核上就能实现很高的ipc呢?答案显然是否定的!有的线程有着较高的潜在ilp(指令并行度),这样的线程跑在大核上就能比在小核上有显著的ipc提升,而有的线程有着大量的等待和与其他线程的通信,这样的线程扔到大核上并不能充分利用大核的宽架构,ipc提升很小,所以这样的线程更适合给小核。以上事实导致了intel thread director这个硬件调度器正是按照这样的逻辑进行设计的,即把那些显著受益于大核宽架构的线程优先调度给大核,其他的则交给小核,实现了高低ipc线程的分离,这样大核上只留下高ipc线程,大核就能始终维持在一个很高的ipc状态,硬件得到了充分利用的同时还实现了更高的性能。或者换句话说就是实现同样的性能需要的频率可以更低了。大小核架构的区别越大,这种区分线程ipc的逻辑就越优越。
分离两种线程的另一个好处就是,低ipc线程给小核后,高ipc线程就不需要等待低ipc线程执行完后再执行了,响应延迟就大大降低。现在我们来看intel在12代对缓存结构的改变,大核有着更大的独占的L2缓存。高ipc线程有着很大的可能是较为独立的线程,很少与其他线程进行通信,因为通信频繁的线程很难维持在高ipc状态,所以独占的大L2缓存的设计刚好适合这样的线程,也更容易让大核跑满,那些通信频繁经常等待的线程交给低ipc的小核,性能损失也很小,小核共享二级缓存刚好适合低ipc线程交流数据。
所以大小核从线程调度来看是非常具有前瞻性的,intel设计的线程调度器本身是没有问题的,出问题的正如我前面的帖子所言,是系统的锅,因为系统软件层面的调度优先级是高于硬件的,所以如果系统层面的调度有问题的话,硬件调度器就没法充分发挥优势。不过在我修改后的调度文件中,已经把系统软件层面的调度优先级降到最低,几乎不会有什么不良的影响了。下面贴出最新版本供有需要的使用
https://pan.baidu.com/s/1WvQ3bm8rnN3SsDFa8BuUFw?pwd=qmgg