我正在进行详细的代码分析,我想测量每个扭曲的银行冲突总数。
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
或设计一些其他方法来测量银行冲突的数量。
我知道这个值是所有正在执行的扭曲的"平均值"。如果我必须测量每个扭曲的组冲突总数,有没有方法使用nvprof
结果来实现这一点?
我想到的可能方法:
- 通过使用
shared_replay_overhead
结果并在公式中使用它们来计算银行冲突的数量。我想我必须应用某种公式,比如shared_replay_overhead * Total number of warps launched
,我事先知道Total number of warps launched
,但我不知道是什么 - 通过首先检测到它是四路组冲突、八路组冲突等,然后将
4
/8
乘以共享内存操作发生的次数(如何测量?)
这可能还需要对GPU架构有相当好的技术知识,此外还有nvprof
的结果,我认为我还没有。记录在案,我的GPU是开普勒体系结构,SM 3.5。
即使我可以测量每个块而不是每个扭曲的组冲突的数量,这也足够了。之后,我可以进行必要的计算,以获得每个翘曲的值。
我认为您应该查看CUPTI(Cuda Profileing Tools Interface)文档。/extras/CUPTI
目录中的CUDA SDK也有一些示例。我对这个库不是很熟悉,但看起来你可以编写自己的探查器,测量你想要的东西,或者收集你感兴趣的指标。这将是一个低级别的,但这是你需要得到精确答案的地方。