【问题标题】:How come register file size in GPU's (eg GTX 1080) bigger than L2 cache size?GPU(例如 GTX 1080)中的寄存器文件大小为何大于 L2 缓存大小?
【发布时间】:2016-05-24 09:03:57
【问题描述】:

看到这个事实,我开始想知道寄存器在 GPU 中是如何工作的?在知道这一点之前,我认为在分层内存阶梯之上越来越高,大小不断减小(这很直观(延迟减少,大小减小))。 GPU 中寄存器的用途是什么,为什么它们的大小大于 L2/L1 缓存? 谢谢。

【问题讨论】:

  • GPU 被称为“反向内存层次结构”,因为 GPU 寻求优化吞吐量而不是延迟。为了保持较小的延迟,GPU RF 使用操作数收集器和多个库。有关 GPU RF 架构、管理技术和(RF、L1 和 L2)尺寸趋势的更多详细信息,请参阅我的survey paper on GPU register file

标签: memory-management gpu cpu-registers cpu-cache


【解决方案1】:

在 CPU 中,缓存有两个基本用途:

  1. 它们可以对已从 DRAM 提取的数据进行时间和空间重用。这降低了 DRAM 所需的带宽。

  2. CPU 缓存可大幅减少延迟,这对于单线程性能极为重要。

GPU 不专注于单线程性能,而是专注于吞吐量。大多数时候,他们还处理太大而无法放入任何合理大小的缓存的工作集。小缓存在某些情况下会有所帮助,但整体缓存对 GPU 的重要性不如对 CPU 的重要性。

现在到问题的第二部分:为什么要使用庞大的寄存器文件? GPU 通过利用线程级并行性来达到其性能。许多线程需要同时处于活动状态才能达到高性能水平。但是每个线程都需要存储自己的一组寄存器。在 Maxwell GPU 和可能在 GP104/GTX1080 中,每个 SM 最多可以托管 2048 个线程。每个 SM 都有一个 256 KB 的寄存器文件,因此如果使用所有线程,则每个线程可以使用 32 个 32 位寄存器。

我之前提到 CPU 使用缓存来减少内存延迟,但 GPU 也必须以某种方式处理内存延迟。他们只是切换到不同的线程,而线程正在等待内存中的答案。延迟、吞吐量和线程通过利特尔定律联系起来:

(传输中的数据/线程)* 线程 = 延迟 x 吞吐量

内存延迟可能是几百纳秒到几千纳秒(让我们使用 1000 纳秒)。这里的吞吐量是内存带宽(320 GB/s)。为了充分利用我们在 (320 GB/s * 1000 ns=) 320 KB 运行中所需的可用内存带宽。 GTX1080 应该有 20 个 SM,所以每个 SM 需要有 16 KB 在运行中才能充分利用内存带宽。即使所有 2048 个线程一直用于内存访问,每个线程仍然需要有 8 个字节的未完成内存请求。如果某些线程忙于计算,无法发出新的内存请求,则剩余线程需要更多的内存请求。如果线程每个线程使用超过 32 个寄存器,则每个线程需要更多的内存请求。

如果 GPU 使用较小的寄存器文件,它们就无法使用其内存的全部带宽。他们会将一些工作发送到内存接口,然后所有线程将等待来自内存接口的答案,并且没有新的工作可以提交到内存接口。巨大的寄存器需要有足够的线程可用。仍然需要仔细编码才能真正发挥 GPU 的最大性能。

【讨论】:

  • 1.您能否详细说明“如果某些线程忙于计算而无法发出新的内存请求,则剩余线程需要更多的内存请求” 2.我知道这个大寄存器大小对于线程之间的切换很重要,但是在最后,这些寄存器由二级缓存提供,因此如果所有线程都需要内存访问,二级缓存将成为瓶颈。你怎么解释这个?
  • 1.这个简单的小定律模型假设所有线程都会在收到来自内存接口的最后一个请求的答案后立即发送新的内存请求。但对于实际的 GPU 应用程序,线程将首先对接收到的值进行一些计算。这些计算的持续时间甚至可以变化,因此只有一部分线程可用于隐藏内存延迟。即使当今的 GPU 支持大量线程,通常也需要巧妙的编程来避免因占用率过低而导致性能下降。
  • 2.许多线程会向二级缓存发出请求,二级缓存需要有高吞吐量来处理所有这些并发请求。但是高吞吐量缓存不一定要很大的内存大小。对于当前的 GPU 应用程序,更大的 L2 缓存不会显着提高命中率。只有当 L2 的吞吐量太低时,L2 才会成为瓶颈。典型的 CPU L2 缓存可能会成为 GPU 的真正瓶颈:虽然它更大的大小只会提供稍微更好的命中率,但它无法处理大量并发请求。
【解决方案2】:

GPU 专为 3D 和计算而构建,因此供应商将更多区域用于内核。更多的内核需要更多的数据来为它们提供数据,这就需要更多的 gpu 区域用于调度机制以保持尽可能高的占用。

内核太多、tmurop 等 3D 管道太多、调度部分太多以及 内存控制器 太宽而无法满足这些需求核心。

GPU 区域不足以满足所有需求。最不重要的似乎是缓存。甚至纹理记忆也比这更重要,而且速度也更快。

gpu 越大意味着生产的良率越低,也意味着利润越少。由于 gpu 供应商不是慈善组织,他们选择了最大利润、最佳性能和节能(最近)。 缓存很昂贵

GPU 中的计算单元每个线程可以拥有超过千字节的寄存器,因此不需要在长距离(例如缓存和内核)之间传输任何多次使用的数据并使其具有能源效率

您还可以通过具有良好的占用率来隐藏某些部分的延迟以进行足够大的计算; 本地共享内存(每个计算单元)和寄存器(每个线程)在实现这一目标方面发挥着更重要的作用。

虽然内存控制器,L1 和 L2 只能处理 100 GB/s、200 GB/s 和 300 GB/s;本地共享内存和 寄存器 可以高达 5 TB/s 和 15 TB/s 带宽,用于 gpu。

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多