超线程和小核不是一回事,调度简单多了。
超线程并不存在主核副核之分,同一物理核心上的两个逻辑核心是相同的。之所以超线程的两个线程性能加起来只相当于单核心的125~160%,是因为超线程的原理在于尽可能降低CPU执行单元的闲置时间。
CPU单个核心有多种运算单元,部分运算单元还有多个相同的,虽然现代CPU有多种机制如乱序执行、寄存器重命名等尽可能在一个时钟周期内执行多条指令,但也无法保证这些执行单元每个时钟周期都在满负荷工作。至于因为分支预测失败、内存访问等待期间的流水线空泡,也是只能尽量降低但无法完全避免的,空泡出现时,所有执行单元都在闲置。此外应用程序本身也可能导致部分执行单元闲置——例如普通整数应用几乎用不到浮点单元,执行这类应用的线程时浮点单元几乎一直闲置。
超线程的原理就是利用第二个线程的指令来利用上这些闲置的执行单元。可以说,超线程效率越高,意味着单线程时CPU的浪费越严重。压缩软件因为存在大量的比对-判断,相比其他应用的分支预测失败率和缓存命中失败率都更高,所以超线程效率比一般应用要高。

PS:超线程因为两个线程之间都在一个物理核心上执行,线程之间交互延迟很低。如果多个线程之间交互很频繁的话也能大幅提升性能,例如上面计算粒子3D碰撞的3DPM,开启超线程后性能超过了160%,开启AVX支持是甚至超过170%。
反过来某些本来就执行效率就很高的应用,启用超线程后两个线程之间还要争抢执行单元,性能可能反而有所降低,例如上面的Y-Cruncher、AI-Benchmark,都是AVX优化应用而且数据量足够大,执行单元很少闲置,所以开启超线程后甚至性能明显降低。
所以操作系统对于超线程的调度很简单:A核心上有线程在执行,而且还有其它核心空闲,那就用其它核心执行新的线程而不要分配到A核心上。
大小核的调度,最麻烦的是操作系统不知道你怎么想。一个渲染应用被你放到后台了,你是希望留出全部大核跑游戏呢还是就留两个大核给你水群刷知乎就够?甚至你一开始只是想刷知乎水个群,结果群里哥们拉你开黑…你自己都不知道,操作系统怎么可能猜得准?
然而吐槽大小核调度的人忽略的一个问题是:不是大小核的CPU,当然没有调度问题,因为他根本没有的选择——后台渲染着还想开黑,还想上网水群不卡?