我正在实验一个简单的矩阵乘法CUDA程序。我发现,如果矩阵大小较小(512*512或更小),则L2缓存命中率始终为100%。剖析的DRAM读取事务不稳定,有时值甚至为0。这个是可能的吗?因为L2缓存中总是会有一些冷缺失,然后L2从DRAM中获取这些数据。因此,DRAM读取事务不应为0,L2命中率应小于100%。
FYI:我在使用开普勒40架构的Quadro K6000 GPU上测试了程序。无论打开或关闭L1缓存,度量值都是相同的。我使用的指标包括l2_l1_read_hit_rate和dram_read_transactions。
发布于 2015-11-30 19:17:33
这个是可能的吗?
是的,有可能。
请注意,所有的 DRAM活动都通过L2缓存进行,这是不能禁用的(DRAM是一个特例,但这里可能没有)。这也包括cudaMemcpy
流量。
因此,如果我将一个完全适合于L2缓存的“小”数据集从主机传输到设备,然后启动一个读取该数据集的内核,那么它很可能已经驻留在L2中,读取的事务将在L2中“命中”,可能不会生成任何实际的DRAM活动。
(对于启用L1的设备,有许多流量类型不通过L1,包括cudaMemcpy
流量。因此,启用/禁用L1通常不会对我在这里概述的假设情况产生任何影响。在L1中,初始内核读取的所有内容都“错过”,而在L2中“命中”)。
https://stackoverflow.com/questions/34005844
复制相似问题