GPU L2 缓存命中率为 100%,DRAM 加载事务有时为 0

GPU L2 cache hit is 100% and DRAM load transactions sometimes is 0

我正在试验一个简单的矩阵乘法 CUDA 程序。我发现如果矩阵大小很小(512*512 或更小),L2 缓存命中率总是 100%。 profiled DRAM read transactions 不稳定,有时值甚至为0。这可能吗?因为 L2 缓存中应该总是有一些冷未命中,然后 L2 从 DRAM 中获取这些数据。因此 DRAM 读取事务永远不应为 0,L2 命中率应低于 100%。

仅供参考:我在使用 Kepler 40 架构的 Quadro K6000 GPU 上测试了该程序。无论 L1 缓存打开或关闭,指标值都是相同的。我使用的指标包括 l2_l1_read_hit_rate 和 dram_read_transactions.

Is this possible?

是的,这是可能的。

注意all DRAM activity流经L2缓存,无法禁用(原子是一个特例,但大概不在此处查看。)这个还包括 cudaMemcpy 流量。

因此,如果我从主机向设备传输完全适合 L2 缓存的 "small" 数据集,然后启动读取该数据集的内核,它可能已经驻留在 L2 中,并且读取事务将 "hit" 在 L2 中并且可能不会生成任何实际的 DRAM activity.

(对于启用了 L1 的设备,有许多流量类型不会流经 L1,包括 cudaMemcpy 流量。因此 L1 enabled/disabled 通常应该对我在这里概述的假设情况没有影响。初始内核读取在 L1 中全部为 "miss",但在 L2 中为 "hit")。