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是没有意义的。希望有人能澄清我的难题。
答案 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以进行全局加载。