GPU(例如 GTX 1080)中的寄存器文件大小为何大于 L2 缓存大小?

Kou*_*ubh 1 memory-management gpu cpu-registers cpu-cache

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

Jan*_*cas 5

在 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 个寄存器,则每个线程需要更多的内存请求。

If GPUs would use smaller register files, they could not use the full bandwidth of their memory. They would send out some work to memory interface and then all threads would be waiting for answers from the memory interface and no new work could be submitted to the memory interface. The huge registers are required to have enough threads available. Careful coding is still required to really get the maximum power of the GPU.