问: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. 特别声明一下。