如何使用NVIDIA Visual Profiler测量每个扭曲的组冲突



我正在进行详细的代码分析,我想测量每个扭曲的银行冲突总数。

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也有一些示例。我对这个库不是很熟悉,但看起来你可以编写自己的探查器,测量你想要的东西,或者收集你感兴趣的指标。这将是一个低级别的,但这是你需要得到精确答案的地方。

相关内容

  • 没有找到相关文章

最新更新