Kepler架构中的L2缓存

11
L2缓存在Kepler架构的GPU中如何处理引用局部性?例如,如果线程访问全局内存中的一个地址,假设该地址的值不在L2缓存中,那么该值如何被缓存?它是临时的吗?还是该地址附近的其他值也会被带到L2缓存中(空间)?
下面的图片来自NVIDIA白皮书。

1
L2缓存是在计算能力2.0及更高版本中引入的,并且在Kepler架构上继续得到支持。所使用的缓存策略是LRU(最近最少使用),其主要目的是避免全局内存带宽瓶颈。我从《Cuda应用程序设计与开发》一书中读到了这些内容。不确定是否回答了您的问题。 - Sagar Masuti
4
L1高速缓存具有128字节的缓存行大小。L2高速缓存具有32字节的缓存行大小。因此,L2缺失会触发32字节的加载。在Kepler架构中,普通全局加载通常不会启用L1高速缓存。 - Robert Crovella
1个回答

10

统一的L2高速缓存是从计算能力2.0及更高版本引入并继续在Kepler架构上得到支持。所采用的缓存策略是LRU(最近最少使用),其主要目的是避免全局内存带宽瓶颈。GPU应用程序可以表现出两种类型的局部性(时间和空间)。

每当尝试读取特定内存时,它会在高速缓存L1和L2中查找,如果未找到,则会从缓存行中加载128字节。这是默认模式。下图说明了为什么128位访问模式会得到良好结果。

enter image description here


2
以上帖子的第一段回答了问题。至于这个答案的第二段,我认为只有在(默认模式下)设备架构是Fermi时才是正确的。正如@Robert Crovella在评论中提到的,在Kepler中,L2缓存未命中会导致32字节的加载。此外,我认为这张图表是误导性的。当SM被低数量的线程利用不足时,更宽的全局内存请求可以饱和全局内存带宽。当SM变得更加/完全被更多的线程占用时,即使是4字节的加载也可能会饱和全局内存带宽。 - Farzad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接