cpu - 超线程与超标量执行

标签 cpu hyperthreading superscalar

想象一个超标量(多个执行单元)并且还具有超线程 (SMT) 支持的 CPU(或内核)。

为什么 CPU 可以真正并行执行的软件线程数量通常由它拥有的逻辑内核(即所谓的硬件线程)数量决定,而不是它拥有的执行单元总数?
如果我的理解是正确的,SMT 实际上并没有实现真正的并行执行,它只是通过复制 CPU 的某些部分(那些存储架构状态,但不是主要执行资源的部分)来使上下文切换更快/更有效。另一方面,超标量架构允许每个时钟周期真正同时执行多条指令,因为 CPU 具有多个执行单元,即多个并行流水线,每个流水线都可以以真正的并行方式处理单独的线程。

那么举个例子,如果一个CPU有2个内核,每个内核有2个执行单元,那么它的硬件并发(真正可以并行执行的线程数)不应该是4吗?为什么它的硬件并发性而不是由逻辑内核的数量给出,而 SMT 实际上并没有启用真正的并行执行?

最佳答案

您不能只是将指令插入执行单元。
如果您想要两个 2 路 SMT,您需要保持两个架构状态并获取两个指令流。

如果一个公司有 100 个开发人员,但只有两个项目经理,它只能并行开发两个项目(但如果让 PM 每天左右切换项目,它可以 concurrently 开发更多)。

如果 CPU 只能从两个指令流中获取数据(仅保留两个线程上下文),则您只能为其分配两个线程来并行执行。
但是,您可以进行时分并同时执行更多线程。

软件无法访问执行单元,这将产生循环参数(软件需要 EU 来执行,但 EU 需要软件来执行)。
CPU 将尝试使用尽可能多的 EU,利用乱序并推测任何可能的东西。
实际上,超线程只是一种让所有资源保持忙碌的方式(例如,当他们无事可做时,与另一个 PM 共享一个开发人员)。

但是,如果一切都失败了并且没有使用欧盟,那么这个可能的工作单元就白费了。

关于cpu - 超线程与超标量执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55636494/

相关文章:

Python子进程通信,顶部显示CPU使用率低

multicore - 多CPU、多核和超线程有什么区别?

macos - 关闭 6 核 Intel Xeon 中的超线程

c++ - 多线程程序中映射模式的性能低于预期(4 倍加速比 8 倍)

assembly - 预测现代超标量处理器上的操作的延迟需要考虑哪些因素,我如何手动计算它们?

linux - Linux 中的非零 CPU%

c# 仍然返回错误的核心数

java - jar 作为 ubuntu 上的守护进程使用 100% cpu