Memory management 为什么在GPU';s(如GTX 1080)大于二级缓存大小?

Memory management 为什么在GPU';s(如GTX 1080)大于二级缓存大小?,memory-management,gpu,cpu-registers,cpu-cache,Memory Management,Gpu,Cpu Registers,Cpu Cache,看到这个事实,我开始想知道寄存器在GPU中是如何工作的?在了解这一点之前,我认为在分层内存阶梯上越走越高,大小会不断减小(这是直观的(延迟减小,大小减小))。GPU中寄存器的用途是什么?为什么它们的大小大于二级/一级缓存? 谢谢。在CPU缓存中有两个基本用途: 它们支持对已经从DRAM获取的数据进行时间和空间重用。这降低了DRAM所需的带宽 CPU缓存大大减少了延迟,这对于单线程性能非常重要 GPU并不关注单线程性能,而是关注吞吐量。大多数情况下,它们还处理太大而无法放入任何大小合理的缓存的工作

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

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

  • 它们支持对已经从DRAM获取的数据进行时间和空间重用。这降低了DRAM所需的带宽

  • CPU缓存大大减少了延迟,这对于单线程性能非常重要

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

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

    我前面提到CPU使用缓存来减少内存延迟,但GPU也必须以某种方式处理内存延迟。他们只是切换到另一个线程,而一个线程正在等待来自内存的答案。延迟和吞吐量与线程之间的关系符合利特尔定律:

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

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


    如果GPU使用较小的寄存器文件,它们就不能使用内存的全部带宽。他们将向内存接口发送一些工作,然后所有线程都将等待内存接口的回答,并且不能向内存接口提交新工作。庞大的寄存器需要有足够的线程可用。要真正获得GPU的最大功率,仍然需要仔细编码。

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

  • 它们支持对已经从DRAM获取的数据进行时间和空间重用。这降低了DRAM所需的带宽

  • CPU缓存大大减少了延迟,这对于单线程性能非常重要

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

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

    我前面提到CPU使用缓存来减少内存延迟,但GPU也必须以某种方式处理内存延迟。他们只是切换到另一个线程,而一个线程正在等待来自内存的答案。延迟和吞吐量与线程之间的关系符合利特尔定律:

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

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


    如果GPU使用较小的寄存器文件,它们就不能使用内存的全部带宽。他们将向内存接口发送一些工作,然后所有线程都将等待内存接口的回答,并且不能向内存接口提交新工作。庞大的寄存器需要有足够的线程可用。要真正获得GPU的最大功率,仍然需要仔细的编码。

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

    太多核,太多