我编写了一些简单的基准测试,执行一系列全局内存访问。当我测量L1和L2缓存统计信息时,我发现(在具有16个SM的GTX580中):
total L1 cache misses * 16 != total L2 cache queries
实际上,右侧比左侧高得多(大约是左侧的五倍)。我听说有些寄存器溢出也可以放入L2中。但我的内核只有不到28个寄存器,没有那么多。我想知道这种差异的来源是什么?或者我是否误解了这些性能计数器的含义?
谢谢
我编写了一些简单的基准测试,执行一系列全局内存访问。当我测量L1和L2缓存统计信息时,我发现(在具有16个SM的GTX580中):
total L1 cache misses * 16 != total L2 cache queries
实际上,右侧比左侧高得多(大约是左侧的五倍)。我听说有些寄存器溢出也可以放入L2中。但我的内核只有不到28个寄存器,没有那么多。我想知道这种差异的来源是什么?或者我是否误解了这些性能计数器的含义?
谢谢
CUDA编程指南 G.4.2节:
全局内存访问是有缓存的。使用-dlcm编译标志,可以在编译时将其配置为缓存在L1和L2中(-Xptxas -dlcm=ca)(这是默认设置),或仅缓存在L2中(-Xptxas -dlcm=cg)。 缓存行大小为128字节,并映射到设备内存中的128字节对齐段。在L1和L2中都被缓存的内存访问使用128字节的内存事务进行服务,而仅在L2中缓存的内存访问则使用32字节的内存事务进行服务。仅在L2中进行缓存可以因此减少过度获取,例如,在散乱内存访问的情况下。
这可能是因为从L1读取的数据长度为128字节,而从L2读取的数据长度为32字节。