【问题标题】:How many levels of pipelining can be acomplished with modern CPUs vs GPUs?现代 CPU 与 GPU 可以实现多少级流水线?
【发布时间】:2014-04-30 10:50:17
【问题描述】:

我在these slides 中表示,GPU 通常比 CPU 具有更深的流水线。

GPU 具有更深的管道(几千个阶段,而 10-20 个 CPU)

我想查找更多号码,但尝试使用谷歌搜索却找不到任何号码。我注意到wikipedia article 注意到 Pentium 4 prescott 已经深入流水线。

定性地说,流水线怎么可能有 3 个以上的层级?考虑到获取/解码/执行周期,这只有三件事?是不是有多个功能单元,例如有多个解码器,所以一次可以解码多个指令?怎么可能一次从记忆中变成红色的东西不止一件?

请记住在您的答案中包含有关流水线级别的数字。

【问题讨论】:

  • 很多指令需要一个以上的执行周期,而操作数获取本身可能需要几个步骤。
  • 早在 1971 年,我就在一个带有两个加法器和一个双端口寄存器组的 CPU 上工作。许多系统将加法器和移位器作为单独的单元,更不用说那些具有专用乘法/除法单元的系统了。
  • 管道长度是吞吐量与延迟的问题。

标签: assembly gpu cpu cpu-architecture


【解决方案1】:

好吧,让我们从头开始:

如何一次从内存中读取多于一件?

总是如此。具有 64 位数据总线的处理器不会一次从内存中读取一个字节,而是一次读取 8 个字节。此外,解码指令不仅限于一次内存读取。

是否有多个功能单元,例如有 多于 1 个解码器,因此可以一次解码多于 1 条指令 时间?

某些处理器可能为此进行了一些并行处理,但并非必须如此。处理器在内存读取之间的时间非常长,以至于它可以在这段时间内解码几条指令,直到可以完成下一次内存读取。

处理器中管道的限制因素实际上是执行在代码中来回跳转。如果代码总是按顺序运行,那么管道可能会很长。处理器试图预测执行将去哪里,但是任何错误的预测都会使管道中完成的其余工作变得无用。

图形处理器执行的代码更多的是数学运算,更少的跳转,因此它们可以使用更长的管道。

【讨论】:

  • "如果代码总是按顺序运行,那么管道可能会很长。"但是,为什么,我的意思是,如果管道只是 3 段,分支预测就没有问题(只需丢弃 2 段)。为什么需要更长的管道?
  • @Caramiriel:长管道允许处理器在每个时钟周期执行几条指令。不再局限于做一件事,然后等待下一个时钟周期开始做下一件事。这就是为什么当前的英特尔处理器比原来的 8086 处理器快 100.000 倍,尽管时钟速度甚至没有高出 1000 倍。
【解决方案2】:

我不知道 Crawfis 教授如何为 GPU 获得数千个流水线阶段。虽然 GPU 通常对相关操作有很高的延迟(大约 22 个周期),这部分是由于没有在计算结果后立即提供结果(即,没有结果转发),部分是因为处理一个块一系列子操作中的类似 SIMD 的操作(通常是四个子操作,因此每个子操作只需要四分之一宽)。不幸的是,很难找到有关 GPU 微架构的详细信息。

一个中等长度的流水线示例可能有助于阐明流水线如何比几个阶段更长。 MIPS R4000(在 1990 年代初推出)有一个用于简单整数运算的八级流水线:

  1. 指令(获取)第一阶段:开始访问指令缓存
  2. 指令(取指)第二阶段:完成对指令缓存的访问
  3. 寄存器文件访问:指令被解码,寄存器文件被读取,操作数可用性被确认,指令缓存命中被确认(这可能会延迟,因为指令缓存是直接映射的[只有一个选择]并且推测性地假设命中。在指令缓存未命中时,将刷新三个工作周期[类似于对分支预测错误的处理]。)
  4. 执行:计算内存访问的分支目标或地址,评估分支条件,或执行计算(或至少开始,乘法和除法需要多个周期;例如,10 个周期用于 32-位乘法)
  5. 数据(访问)第一阶段:开始访问数据缓存
  6. 数据(访问)第二阶段:访问数据缓存完成
  7. 标签检查:检查数据缓存标签以确认命中。 (因为数据缓存也是直接映射的,加载的值可以推测性地转发给执行,因此依赖操作只需要等待两个周期而不是三个周期。)
  8. 回写:将操作结果写入寄存器

理论上,就像流水线一样,每个工作单元都可以分成更小的工作单元。然而,就像在装配线上一样,即使工人数量增加,更精细的划分也会降低产量。 (想象一条装配线,其中每个阶段都会转动一圈螺丝。虽然这将允许许多螺丝刀工在单个螺丝上工作,但插入和移除螺丝刀的开销会使这非常低效。闩锁和其他开销有处理器流水线中的类似效果。)与传统的工业装配线不同,处理器流水线也必须处理变化,分支错误预测可能模糊地类似于装配过程中的变化,该变化未正确传达给工人;直到质量控制检查员发现问题并需要停止整个装配线,移除所有有缺陷的部分装配产品,并按照适当的程序重新启动生产线时,才能发现问题。

对于更现代的示例,请考虑以下内容:

  • AMD 的 Jaguar(在 Playstation 4 和 Xbox One 中)有 14 个阶段,从开始提取到写回用于简单的 ALU 操作:Fetch0、Fetch1、Fetch2、Decode0/Fetch3、Decode1/Fetch4、Decode2/Fetch5、iDecode、Pack 、FDecode、Dispatch、Schedule、RegisterRead、ALU、WriteBack(加载操作将 ALU 替换为 AGU 并添加 Data Cache1 和 Data Cache2 阶段;FP/SIMD 操作添加 Transit、FPDecode 和额外的 RegisterRead 阶段)(来自 David Kanter 的 Jaguar article )
  • Fujitsu 的 SPARC64 X 有 18 个内存操作阶段:4 个提取阶段; 4个解码和发布阶段; 5个调度、注册读取和执行阶段; L1 Dcache访问的3个阶段;和 2 个提交阶段(来自 2012 年 Hot Chips 演示文稿的第 11 页SPARC64 TM X: Fujitsu’s New Generation 16 Core Processor for the next generation UNIX servers
  • Intel 的 Poulson(安腾 9500 系列)有 11 个阶段用于简单的整数运算和加载(单周期 L1 高速缓存,具有直接寄存器寻址):指令指针生成、指令获取、前端解码、寄存器重命名、指令缓冲和分散,指令解码、寄存器访问、指令执行、检测异常、Writeback Commit、Writeback-2 Retire(来自Intel Itanium Processor 9500 Series Reference Manual: Software Development and Optimization Guide 中的图 2-4 后端流水线控制机制)
  • Intel 的 Silvermont(新 Atom)有 14 个阶段用于简单的整数运算:三个指令获取阶段、三个指令解码阶段、两个分配/重命名阶段、一个调度阶段、一个执行阶段、两个退休阶段和两个提交阶段(来自大卫坎特的Silvermont article)

请注意,所有这些现代微架构在某些阶段之间都有缓冲,因此指令不会像更简单的流水线设计那样简单地流过流水线或停止。此外,有些操作需要超过一个周期才能执行,有些操作可能没有完全流水线化。

【讨论】:

    【解决方案3】:

    从内存中提取需要更长的时间,reporting otherwise assumes access from core

    例如,NVIDIA CUDA (Tesla) GPU 数据是使用 32 个线程的进程,称为 warp,you will see that

    当 warp 中的线程发出设备内存操作时,由于内存延迟较长,该指令将花费很长时间,可能需要数百个时钟周期。

    因此,如果内存提取需要数百个周期,那么流水线可以让处理器忙于执行。

    【讨论】:

      猜你喜欢
      • 2017-02-19
      • 2017-02-18
      • 1970-01-01
      • 2021-09-16
      • 2020-04-28
      • 1970-01-01
      • 2019-11-07
      • 2018-11-08
      • 2017-03-11
      相关资源
      最近更新 更多