GPU L1和L2缓存统计数据

6

我编写了一些简单的基准测试,执行一系列全局内存访问。当我测量L1和L2缓存统计信息时,我发现(在具有16个SM的GTX580中):

 total L1 cache misses * 16 != total L2 cache queries

实际上,右侧比左侧高得多(大约是左侧的五倍)。我听说有些寄存器溢出也可以放入L2中。但我的内核只有不到28个寄存器,没有那么多。我想知道这种差异的来源是什么?或者我是否误解了这些性能计数器的含义?

谢谢


你如何测量缓存统计信息?我想知道你的内核是否使用了16个SM的100%。28个寄存器可能会导致限制占用率。 - pQB
1
我想知道屏幕监视器是否也使用L2缓存。- thanhtuan 46分钟前 - Zk1001
你的内存访问模式是什么?一个单独的获取指令可能会分成多个内存事务。只要你的内核不使用本地内存,就不会有寄存器溢出。 - CygnusX1
@thanhtuan 我正在为此工作,但这取决于您用于测量的工具。 您是使用CUDA可视化分析器(或命令行分析器)还是Parallel NSight? - harrism
很奇怪,没有人能够给出一个令人满意的答案来回答这个有趣的问题。 - dalibocai
显示剩余3条评论
2个回答

2

CUDA编程指南 G.4.2节:

全局内存访问是有缓存的。使用-dlcm编译标志,可以在编译时将其配置为缓存在L1和L2中(-Xptxas -dlcm=ca)(这是默认设置),或仅缓存在L2中(-Xptxas -dlcm=cg)。 缓存行大小为128字节,并映射到设备内存中的128字节对齐段。在L1和L2中都被缓存的内存访问使用128字节的内存事务进行服务,而仅在L2中缓存的内存访问则使用32字节的内存事务进行服务。仅在L2中进行缓存可以因此减少过度获取,例如,在散乱内存访问的情况下。


1

这可能是因为从L1读取的数据长度为128字节,而从L2读取的数据长度为32字节。


L2缓存行长度的参考资料在哪里?我所拥有的所有文档都说Fermi的L1和L2缓存行长度为128字节。 - talonmies
1
@talonmies 我非常怀疑这一点。我认为L2高速缓存行是32字节,而L1高速缓存丢失将导致4个内存请求到L2或者其他什么的。或许我错了?如果您能指出一些可靠的文档,告诉这些数字就太好了。 - Zk1001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接