请问一下profiler 4.0 user’s guide 中 L1 cache read throughput 的计算公式不太理解
描述:This gives the throughput achieved while accessing data from L1 cache. This is calculated as:
[(l1 global load hit + l1 local load hit) * 128 * #SM + l2 read requests * 32] / (gpu time * 1000)
(1)这里为什么有l1 global load hit 与 l1 local load hit呢?
(2)这里为什么要加上 l2 read requests * 32 我理解的是如果L1 cache没有命中,就会请求L2 chche 把数据从L2 cache中加载到L1 cache中,core 再从L1 cache中读取?
楼主您好,
您可以使用这个简化的模型:
在Fermi上,在正常的读取过程中,L1 data cache将为local memory和global memory服务。
一次L1 data cache hit后,交给寄存器的数据,将是128字节。
而如果发生一次L1 miss, 数据将分成连续4次从L2 unifed cache传输到L1 cache(因为fermi上L2到1个SM只有32B/cycle的带宽)。
而上文的式子中的L2 Read request可能是L2服务L1 data cache的传输请求次数,这样正好前者 * 128 + 后者 * 32是总请求的数据量(一次前者miss等于4次后者)。
以及,这个是profiler给出的式子,但很遗憾,很多式子所依赖的基础数据并没有给出具体解释。所以这也是我的猜测。(例如L2 unifed cache还为texture cache服务,这里的L2_read_request自然应该不算给Texture cache的,给它的应该叫另外一个名字)。
大致如此吧,建议不看具体公式而直接相信并使用数值,因为一些式子无法解释(无资料)。
以及,从CUDA 5.5开始,profiler的手册里去掉了具体的公式。这强迫我们简单的相信它报告的结果。
感谢深夜来访。
好的,谢谢版主深夜解答。