如何使用NVIDIA Visual Profiler测量每次扭曲的银行冲突?

时间:2016-06-06 05:39:44

标签: cuda gpu nvidia bank-conflict nvvp

我正在进行详细的代码分析,我想测量每次经线的银行冲突总数。

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。

即使我可以测量每块而不是每次经线的银行冲突数量,也足够了。之后,我可以进行必要的计算,以获得每个经线的值。

1 个答案:

答案 0 :(得分:1)

我认为您应该查看CUPTI(Cuda性能分析工具界面)文档。您的CUDA SDK在/extras/CUPTI目录中也很少有示例。我对这个库并不是很熟悉,但看起来你可以编写自己的探查器,测量你想要的东西,或收集你感兴趣的指标。它会是低级的,但这就是你需要得到准确的答案。