我正在做一个详细的代码分析,我想测量每个 warp 的银行冲突总数。
nvvp
文档列出了这个指标,这是我能找到的唯一一个与银行冲突相关的指标:
shared_replay_overhead:每条执行指令因共享内存冲突而重播的平均次数
当我使用nvprof
(或nvvp
)分析指标时,我得到如下结果:
Invocations Metric Name Metric Description Min Max Avg
Device "Tesla K20m (0)"
Kernel: void matrixMulCUDA<int=32>(float*, float*, float*, int, int)
301 shared_replay_overhead Shared Memory Replay Overhead 0.089730 0.089730 0.089730
我需要利用这个值0.089730
或设计一些其他方法来衡量银行冲突的数量。
我知道这个值是所有正在执行的经纱的“平均值”。如果我必须测量每个 warp 的银行冲突总数,有没有办法使用nvprof
结果来做到这一点?
我想到的可能的方法:
- 通过使用
shared_replay_overhead
结果并在公式中使用它们来计算银行冲突的数量。我猜我必须应用某种公式,比如shared_replay_overhead * Total number of warps launched
我事先知道的地方Total number of warps launched
,但我不知道是什么。 - 通过首先检测它是四路存储库冲突、八路存储库冲突等,然后将
4
/乘以8
共享内存操作发生的次数(如何测量?)。
除了nvprof
结果之外,这可能还需要相当好的关于 GPU 架构的技术知识,我认为我还没有。作为记录,我的 GPU 是 Kepler 架构,SM 3.5。
即使我可以测量每个块而不是每个扭曲的银行冲突数量,也足够了。之后,我可以进行必要的计算以获取每个经线的值。