multithreading - 同时多线程是否利用交错/临时多线程?

标签 multithreading cpu cpu-architecture simultaneous hyperthreading

我正在尝试了解同时多线程 (SMT),但我刚刚遇到了问题。

这是我到目前为止所想到的
SMT需要超标量处理器才能工作。超标量和 SMT 两种技术都允许同时执行多条指令。虽然“简单”超标量处理器要求一个周期内执行/发出的所有指令都是单个线程的一部分,但 SMT 允许同时执行不同线程的指令。 SMT 比超标量处理器更有优势,因为单个线程的指令通常具有依赖性,这意味着我们无法同时执行所有指令。不同线程的指令没有这些依赖关系,允许我们同时执行更多的指令。

我希望到目前为止我做对了。

这是我遇到的问题

SMT 据说是超标量处理器和交错/临时多线程的混合体。就我个人而言,我看不出 SMT 中如何涉及交错多线程。

交错多线程比没有多线程好。这是因为交错多线程允许在发生高延迟事件(例如缓存未命中)时进行上下文切换。当信息加载到缓存中时,处理器可以继续执行不同的线程,从而提高性能。

我想知道SMT是否也使用交错多线程。或者换句话来说,当 SMT 架构中发生高延迟事件时会发生什么?

我的想法的示例

假设我们有一个 4 路超标量 SMT 处理器,并且有 5 个不同的线程等待执行。我们还假设每个线程的指令都依赖于前一个指令,每次只需要执行每个线程的一条指令。

如果没有任何高延迟事件,我认为指令的执行可能看起来像这样(每个数字和颜色对应一个线程。):

Without cache miss

理想情况下,我们只需使用处理器顺序执行前 4 个线程。线程 5 只需要等待另一个线程完成即可。

我真正想弄清楚的是,如果发生高延迟事件会发生什么。我们假设情况相同,但这次线程一在第一条指令处遇到高速缓存未命中。发生的事情可能看起来像这样:

Cache miss without multithreading

我们必须等待内存中的信息被加载。除非我们另外使用交错多线程,例如带有高速缓存未命中切换的 block 交错。那么它可能看起来像以下之一:

Cache miss with multithreading

我只找到了可能表明 SMT 使用某种细粒度多线程的图片,但我找不到任何信息来真正证实这一点。

如果有人能帮助我理解 SMT 的这一部分是如何工作的,我将非常感激。这个细节让我发疯!

最佳答案

术语 SMT 通常指的是无序 (OoO) 处理器。 OoO 处理器已经拥有所有这些用于处理指令之间依赖关系的机制、比架构寄存器文件大得多的物理寄存器文件等等。在这样的处理器中添加SMT相对简单,本质上处理器只需要支持额外的每线程架构状态,然后标记每条指令以指定它属于哪个硬件线程,之后OoO执行机器处理所有排队的指令就像从前一样。因此,OoO 机器像往常一样处理指令之间的依赖关系,处理正在等待的指令,例如来自不同或相同线程的指令可以在任何空闲且能够执行指令的执行管道上自由执行,无论它属于哪个线程,只要满足所有依赖性即可。是的,来自多个线程的指令可以在超标量核心上同时执行。

交错多线程OTOH是您在有序处理器中会发现的。这些处理器缺乏所有复杂的(并且耗电的!)OoO 逻辑,因此它们必须做一些更简单的事情,除非它们想转变为 OoO 处理器并承担所有费用。因此,他们选择了一种更简单的多线程形式,其中处理器在每个时间点仅执行来自单个线程的指令。因此,即使处理器是超标量处理器,在每个时间点它也只能执行属于单个线程的指令。一段时间后(在某些处理器中短至每个周期),处理器切换到另一个线程。如果线程被阻塞,例如等待缓存未命中得到解决,然后处理器绕过该线程并运行其他线程。从操作系统的角度来看,所有线程都是同时运行的,但这种情况发生的粒度比操作系统线程更细。

关于multithreading - 同时多线程是否利用交错/临时多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76464294/

相关文章:

java - 我怎么知道哪个线程调用了我的 Log 方法?

java - 可重入锁在 Java 中工作正常,但在 Scala 中导致 IllegalMonitorException

caching - L1、L2 和 L3 缓存如何与多个并发运行的进程配合使用?

c++ - 不完全从 double 转换为 int - 似乎问题出在 CPU 指令中

cpu-architecture - 目标文件体系结构是否独立?

python - 在 Windows 上测量每个线程的 CPU 时间

c - Windows 条件变量与事件

cpu - 循环精确仿真

python - 为什么 Python 多处理没有将 4 核 CPU 上的处理时间减少到 1/4

assembly - 正在运行时中断汇编指令