CUDA之L1、L2总结

问:L1 cache只能用来缓存global memory,L2 cache即能用来缓存local也能用来缓存global memory是吧?如果是这样的话,我在进行global memory访问时,假设

L1 cache,L2 cache都默认开启,我如何知道访问的数据是被缓存在L1中还是L2中,或者两者都有?

答:所有的计算能力(不算1.x), L1都能缓冲local memory的,而不是global memory.实际上恰恰相反,一些计算能力版本默认将不使用L1缓冲global memory.L2是

万能的Cache, 将服务内存,显存的数据(这两者共同构成了global memory),也将缓冲指令和数据内容。如果在确定L1和L2都被当前硬件上当前指令下启用缓存,

那么数据是否只被L1或者只被L2缓存,这个要看硬件的缓存安排,是否是inclusive的(数据可以通过存在于2级缓存中,具有2个副本),还是exclusive的(数据被载

入L1后将被从L2驱逐)。我记忆里数据可能同时存在于这两级的,但是NV的文档从来没声明这一点。以及,L1有效的话,一次miss将首先从L2载入L1的,此时如果

你是很分散的读取(例如A[id * 8888]), 可能会导致过量的L2传输(4B  of 128B, 3%有效数据), 您此时可以考虑bypass L1(手册有如何bypas的教程),来考虑抑制

过量传输(4B of 32B, 12.5%有效数据)。


问:以及,L1有效的话,一次miss将首先从L2载入L1的,此时如果你是很分散的读取(例如A[id * 8888]), 可能会导致过量的L2传输(4B  of 128B, 3%有效数据), 您

此时可以考虑bypass L1(手册有如何bypas的教程),来考虑抑制过量传输(4B of 32B, 12.5%有效数据)。这段话的意思是如果数据很分散的话,是应该优先考

虑使用L1缓存是吧?这样命中率会更高

答:不是的。数据很分散建议从L2 load, bypass掉L1. 因为L2可以一次只传32B,然后你的线程取其中的需要的4B.而L1有效的时候,L1首先会自我从L2填充128B

的(4个32B), 然后你依然只是需要里面的4B的。其他的传输过来的数据都是多余的,浪费掉了。maxwell比较奇葩,L1不能服务local traffic. 特别声明一下。



  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值