同步多线程(超线程)是“真正的”多核处理吗?
Posted
技术标签:
【中文标题】同步多线程(超线程)是“真正的”多核处理吗?【英文标题】:Is Simultaneous Multithreading (Hyperthreading) "true" multicore processing? 【发布时间】:2021-11-02 07:07:40 【问题描述】:所以我所知道的是,同步多线程(例如英特尔的超线程)使单个 CPU 内核能够一次有效地管理多个线程。我发现的大多数解释是,这就像您拥有多个核心可供使用。但我想知道的是,这是否是低级别(机器级别)实际发生的事情?或者它更像是操作系统,它只是看起来像是在 2 个内核上运行,但最终同时多线程只是让它在两个(或更多)不同线程之间来回切换的效率更高,给人一种错觉拥有多个内核?
【问题讨论】:
很遗憾,您在错误的网站上发布了这个问题。 Stack Overflow 纯粹是针对编程问题。您应该考虑删除此内容并在 Super User 或 Computer Science 上重新发布,假设这些网站尚未涵盖该问题。 这也可能是许多hyperthreading tagged questions 的副本。 Peter Cordes' answer 可能是关于 SO 主题的更好答案之一。我在这里发布了一个答案,我相信它提供了一个不同的视角。 【参考方案1】:同时多线程在“同时多线程:最大化片上并行性”(Dean M. Tullsen 等人,1995,PDF)中定义为“一种允许多个独立线程向超标量的多个功能单元发出指令的技术在单个周期内”(“发出”表示执行的开始——该术语的另一种用法表示进入指令调度程序)。 “同时”是指同时来自不同线程的指令发出,将 SMT 与在执行线程之间快速切换(例如,选择每个周期执行哪个线程的指令)的细粒度多线程和 switch-on-event 多线程区分开来(更类似于操作系统级别的上下文切换)。
SMT 实施通常将指令提取、解码和提交交错进行,使这些流水线阶段看起来更像是细粒度多线程或非多线程内核的阶段。 SMT 利用已经在任意(在窗口内)指令之间动态选择的无序超标量,认识到通常执行资源没有完全使用。 (顺序SMT提供了相对更大的好处,因为顺序执行没有乱序执行的延迟隐藏,但是增加了流水线控制的复杂度。)
具有共享缓存的桶形处理器(纯循环、细粒度线程调度,为非就绪线程发出 nops)看起来更像是时钟频率为 1/thread_count 的单独内核(和共享缓存),因为这样缺乏执行资源的动态争用。也有争议的是,在处理器流水线中同时具有来自多个线程的指令代表并行指令处理;不同的线程可以同时处理指令(在不同的流水线阶段)。即使使用开启事件多线程,缓存未命中也可以与另一个线程的执行并行处理,即,可以在加载指令的“处理”期间处理来自另一个线程的多条指令。
如果 ISA 提供的指令不是中断原子的,则与操作系统级别的上下文切换的区别会更加模糊。例如,在 x86 上,定时器中断可以导致操作系统在字符串指令正在进行时执行上下文切换。从某种意义上说,在另一个线程的整个时间片中,字符串指令可能仍被认为是“正在执行”,因为它的操作还没有完成。通过硬件预取,在理论上,较早线程的某种程度的前向进程可能会继续超过另一个线程开始运行的时间,因此甚至可能满足多个线程中同时活动的要求。 (如果将长 x86 字符串指令的处理移交给加速器,则该指令可能会与在启动该指令的内核上运行的另一个线程完全并行运行。)
【讨论】:
以上是关于同步多线程(超线程)是“真正的”多核处理吗?的主要内容,如果未能解决你的问题,请参考以下文章