看看这个事实,我开始想知道寄存器在GPU中是如何工作的?在了解这一点之前,我认为在分层记忆阶梯之上越来越高,大小不断减小(这是直观的(延迟减少,尺寸减小))。 GPU中寄存器的用途是什么?为什么它们的大小比L2 / L1缓存大? 感谢。
答案 0 :(得分:3)
在CPU中,缓存有两个基本用途:
它们可以对已从DRAM中提取的数据进行时间和空间重用。这减少了DRAM所需的带宽。
CPU缓存可大大减少延迟,这对单线程性能非常重要。
GPU并不专注于单线程性能,而是专注于吞吐量。大多数情况下,他们还处理的工作集太大而无法容纳任何合理大小的缓存。在某些情况下,小缓存有所帮助,但总体缓存对GPU而言并不像CPU那样重要。
现在问题的第二部分:为什么巨大的寄存器文件? GPU通过利用线程级并行性来实现其性能。许多线程需要同时处于活动状态才能达到高性能水平。但是每个线程都需要存储自己的寄存器集。在Maxwell GPU中,可能在GP104 / GTX1080中,每个SM可以容纳多达2048个线程。每个SM都有一个256 KB的寄存器文件,因此如果使用所有线程,则每个线程可以使用32x 32位寄存器。
我之前提到CPU使用缓存来减少内存延迟,但GPU也必须以某种方式处理内存延迟。他们只是切换到一个不同的线程,而一个线程正在等待内存的回答。延迟,吞吐量和线程由Little的法律连接:
(飞行/线程中的数据)* threads = latency x throughput
内存延迟可能是几百ns到几千ns(让我们使用1000ns)。这里的吞吐量是内存带宽(320 GB / s)。为了充分利用我们在飞行中所需的可用内存带宽(320 GB / s * 1000 ns =)320 KB。 GTX1080应该有20个SM,因此每个SM在飞行中需要有16 KB才能充分利用内存带宽。即使所有2048个线程始终用于内存访问,仍然需要每个线程在未完成的内存请求中有8个字节。如果某些线程忙于计算并且无法发送新的内存请求,则剩余线程需要更多的内存请求。如果线程每个线程使用超过32个寄存器,则每个线程需要更多的内存请求。
如果GPU使用较小的寄存器文件,则无法使用其内存的全部带宽。他们会向内存接口发送一些工作,然后所有线程都在等待来自内存接口的答案,并且没有新工作可以提交到内存接口。巨大的寄存器需要有足够的线程可用。仍然需要仔细编码才能真正获得GPU的最大功率。
答案 1 :(得分:0)
GPU专为3D和计算而构建,因此供应商专注于核心区域。更多核心需要更多数据来提供它们,并且需要更多的gpu区域来调度机制以尽可能保持占用。
太多的内核,太多的3D管道,例如 tmu 和 rop ,太多的调度部分和太宽的内存控制器来提供这些核心。
Gpu领域对于一切都是不够的。最重要的一个似乎是缓存。即使纹理记忆也比这更重要,而且速度也更快。
使gpu更大意味着降低生产产量,这意味着更少的利润。由于gpu供应商不是慈善组织,他们选择了最大利润,最佳性能和节能(截至最近)。 缓存很昂贵。
gpu中的计算单元每个线程可以超过千字节的寄存器,因此不需要在长距离(例如缓存和内核)之间传输任何多次使用的数据并使其具有能源效率。
此外,您可以通过为足够大的计算提供良好的占有率来隐藏某些部分的延迟; 本地共享内存(每个计算单元)和寄存器(每个线程)在实现这一目标方面发挥着更重要的作用。
内存控制器,L1和L2只能处理100 GB / s,200 GB / s和300 GB / s;本地共享内存和寄存器最高可达5 TB / s <对于gpu,强> 15 TB / s带宽。