我正在大学做一个并行计算课程,显然我们需要了解程序员级别的架构。谁能说出开发多核处理器的动机是什么?为什么多线程处理器不够用?为什么我们需要在多个内核上分配管道而不是将它们放在一个大型内核上?
答案 0 :(得分:3)
多线程处理器实际上无法同时执行代码。他们唯一要做的就是虚拟化处理器,以便在操作系统中看起来像两个物理内核,这具有轻微的速度优势。
没有超线程的单核处理器有时会浪费时间等待指令完成,因为它需要获取数据,或者它具有缓存未命中或可能是错误的分支预测。虽然乱序执行可以解决其中的一些问题,但添加另一个可以接管并使用CPU资源一段时间而另一个被阻塞的线程可以提高性能。
然而,这个具有超线程的单核仍然只有一个FPU,一个ALU,一个控制单元,一个存储器接口等。由于这个限制,真正的同时线程执行需要复制这些组件。复制核心并指定它们之间的接口比设计更简单,这种设计涉及尝试平衡多个ALU或FPU,在单个核心中具有多个线程。
答案 1 :(得分:0)
增加单个磁芯的宽度会增加硅面积和功耗的几何成本。
制作合理大小的核心的多个副本具有线性成本(+互连/一致性的开销很小)。
制作一个超宽的CPU只是为了让你可以用SMT(也就是超线程)来破坏它是疯了。如果你需要怪物单线程性能,你就可以这样做,并且可以以某种方式冷却芯片,使其能够以接近狭窄设计所能管理的时钟速度运行。 (你不能。)
在大多数代码中没有足够的指令级并行性来提供足够大的改进来证明更广泛的设计。你在IPC中获得的任何东西(每个时钟的insns),你的时钟速度都会因为没有过热而无法快速运行而丢失。
例如,在20年内,英特尔已经从3宽的发行宽度(PPro中的原始P6到Pentium-M),到4宽的发行宽度(Core2到Skylake)。 x86难以解码,但具有uop-cache的SnB系列设计可以轻松拥有比解码器吞吐量更宽的OOO流水线。
增长的更多是执行端口的数量,以及每个端口上的执行单元数量。在最近的英特尔设计中,相同的指令可以并行运行在不同的数据上。例如Haswell以及之后每个时钟可以执行两次FP乘法。 IvB和更早版本每个时钟只有一个FP mul的吞吐量,因为只有一个FP mul执行单元(在port1上)。
较旧的设计(如PIII)只有两个ALU执行端口,因此每个时钟可以管理的三个指令中的一个必须是内存操作(加载或存储)。 Haswell有四个ALU端口(其中三个可以处理向量指令)。因此,无论指令组合如何,最近的CPU都很有可能并行完成。
让很多模具区域在很多时候没有做任何事情的“低效率”不是问题。它的力量是真正的限制因素,而不是死亡区域。这就是现代CPU具有无法一次使用的执行能力的原因。
请注意,超线程实际上可以减慢代码,如果它可以使HT在内核之间共享的执行资源饱和。或者更糟糕的是,如果来自竞争共享L1 / L2缓存的额外缓存压力导致每个线程中更多缓存未命中。
当一个或两个线程为每个时钟(IPC)提供一个完整的核心时,HT是一个很大的胜利。用于隐藏内存延迟的两个无序窗口是好的,它对于分支误预测非常有用。两个线程在不同的执行单元上存在瓶颈,这是一个小胜利。 (例如port5上的shuffle unit与port0 / 1上的add / mul相比)。