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
Run Code Online (Sandbox Code Playgroud)
GTX 980的结果验证了"Maxwell Tuning Guide"中的声明,这让我很困惑,因为如果是这样的话,那么L1缓存用于什么?另一件我无法理解的是GTX 780是GK110卡,来自GK110白皮书,Keper也只在L2中缓存其全局内存访问,因此对于我来说,globalL1CacheSupported为GTX 780卡返回1是没有意义的.希望有人能澄清我的谜题.
在Maxwell上,L1功能已与纹理缓存结合使用.调谐指南中也提到了这一点.
Fermi器件引入了L1,用于全局和本地负载缓存.L1是一个直写缓存,因此它对全球和本地商店的影响相对较小.
对于Kepler,L1已针对全局负载禁用,但仍对本地负载有效.
那么L1缓存用于什么?
对于Maxwell,L1相对于全局负载的默认行为是相同的 - 它们不会被缓存. 但是,您可以"选择加入"将全局加载缓存在L1中,如您在上面提到的Maxwell调整指南中所述:
"以类似于Kepler GK110B的方式,GM204默认保留此行为,但也允许应用程序选择在其统一的L1/Texture缓存中选择加载全局负载.选择加入机制与GK110B相同:通过
-Xptxas -dlcm=ca在编译时标记为nvcc."
GK110B是GK110的变体,出现在K40设备中.在K20/K20x上,L1行为不可修改(全局负载关闭).在K40上,L1的默认行为与K20/K20x相同.但是可以重写默认行为以打开全局加载L1.
| 归档时间: |
|
| 查看次数: |
2122 次 |
| 最近记录: |