比如说,如果我有一个 2.6GHz 的单核,这是否意味着使用超线程时我的应用程序的单线程只有 1.3GHz,或者是否仅在我使用时才按需提供(假设我的应用程序是计算机上唯一运行的东西...为了避免没有操作系统运行的情况)
单线程单核无HT:线程运行在2.6GHz 单线程单核带HT:线程运行在1.3GHz?
如果速度不是一半,假设我只运行一个线程,那么开启超线程后性能会下降多少?10%?否则呢?
答案1
不,不是这样的。每个任务都可以在单个线程上以全核心速度运行。当其中一个线程被阻塞时(例如,在等待主内存中相对较慢的 IO 时),另一个线程可以以全核心速度运行。
请注意,在单核双线程设置下,您只能同时使用一个线程中的部分资源。例如,如果您有两个线程想要运行,并且都需要从主内存读取数据,那么只有一个线程可以执行此操作。另一个线程必须等待。如果您有两个线程,其中一个线程正在执行纯粹的片上操作(例如使用 ALU),而另一个线程正在从主内存读取数据,那么两个线程都可以同时运行。
想象一下,一家商店有两名员工,但只有一台收银机。如果两人都需要使用收银机,那么其中一人必须等待(什么也不做)。或者幸运的是,只有一个人需要使用收银机,而另一个人正忙着与下一位顾客交谈,而第一个人则操作收银机。(因此同时做两件事)。
如果速度不是一半,假设我只运行一个线程,那么开启超线程后性能会下降多少?10%?否则呢?
这取决于每个程序。我听到的最坏的现场情况是总速度减慢 30% *2(即在启用 HT 的情况下实际上速度变慢)。最好的理论情况是速度几乎提高 100%。在实践中,与不使用 HT 相比,它似乎平均速度提高了 30%。
*2:30% 的减速发生在网络蜘蛛的实际生产代码中。但更糟糕的情况也可能发生。例如,数据库只允许在 2 核、4 线程 CPU 上运行两个线程,并且调度程序会在同一物理核心上持续调度这两个线程。
答案2
不,时钟速度不是那样的。核心中的执行单元以相同的速度运行,无论它们代表哪个线程运行,也无论物理核心是否启用或禁用 HT。