什么是用于NVIDIA的maxwell GPU的L1缓存?

时间:2015-03-06 08:47:22

标签: caching cuda

NVIDIA推出了一段时间的maxwell GPU,但在阅读“Maxwell Tuning Guide”时,我对L1缓存的功能感到困惑。在开普勒时代,全局内存访问仅缓存在L2中,而L1用于缓存本地内存访问,这是由寄存器溢出引起的。从阅读NVIDIA的文档来看,这个本地内存缓存是我所知道的唯一可以从L1缓存中受益的东西。但是,在“Maxwell Tuning Guide”的1.4.2.1节中,NVIDIA说:

  

与Kepler一样,第一代Maxwell中的全局负载仅缓存在L2中......本地负载也仅缓存在L2中

CUDA 6.0添加了两个新的设备属性 globalL1CacheSupported localL1CacheSupported 来检查设备是否支持全局内存L1缓存和本地内存L1缓存,所以我对这些进行了测试GTX 780和GTX 980卡上的两个属性,结果让我更加困惑:

        globalL1CacheSupported    localL1CacheSupported

GTX780            1                         1

GTX980            0                         0

GTX 980的结果验证了“Maxwell Tuning Guide”中的声明,这让我很困惑,因为如果是这样的话,那么L1缓存用于什么?另一件我无法理解的是GTX 780是GK110卡,来自GK110白皮书,Keper也只在L2中缓存其全局内存访问,因此对于我来说,globalL1CacheSupported为GTX 780卡返回1是没有意义的。希望有人能澄清我的难题。

1 个答案:

答案 0 :(得分:7)

On Maxwell,L1功能已与纹理缓存结合​​使用。这也在tuning guide中引用。

Fermi设备引入了L1,用于全局和本地加载缓存。 L1是一个直写缓存,因此对全球和本地商店的影响相对较小。

使用Kepler时,L1已针对全局负载禁用,但仍对本地负载有效。

  

那么L1缓存用于什么?

对于Maxwell,L1的默认行为与全局负载相同 - 它们不会被缓存。 然而,您可以选择加入"将全局加载缓存在L1中,如您所提及的Maxwell tuning guide中所述:

  

"以类似于Kepler GK110B的方式,GM204默认保留此行为,但也允许应用程序选择加入其统一的L1 / Texture缓存中的全局负载缓存。选择加入机制与GK110B相同:在编译时将-Xptxas -dlcm=ca标志传递给nvcc。"

GK110B是GK110的变体,出现在K40设备中。在K20 / K20x上,L1行为不可修改(全局负载关闭)。在K40上,L1的默认行为与K20 / K20x相同。但是可以覆盖默认行为以打开L1以进行全局加载。