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

Posted

技术标签:

【中文标题】如何使用 NVIDIA Visual Profiler 测量每个扭曲的银行冲突?【英文标题】:How to measure bank conflicts per warp using NVIDIA Visual Profiler? 【发布时间】:2016-10-05 15:14:39 【问题描述】:

我正在做一个详细的代码分析,我想测量每个 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 的“平均值”。如果我必须测量每个 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】:

我认为您应该查看CUPTI(Cuda Profiling Tools Interface)文档。在/extras/CUPTI 目录中也有一些与您的 CUDA SDK 相关的示例。我对这个库不是很熟悉,但看起来你可以编写自己的分析器,测量你想要的,或者收集你感兴趣的指标。这将是低级的,但这是你需要得到的准确的答案。

【讨论】:

感谢您的回答,我查看了 CUPTI 文档,但还没有找到任何有用的信息。

以上是关于如何使用 NVIDIA Visual Profiler 测量每个扭曲的银行冲突?的主要内容,如果未能解决你的问题,请参考以下文章

NSight (NVIDIA) 无法在 Visual Studio 中使用“暂停和捕获帧”功能正常工作

使用 Visual Studio 2010 在 Nvidia GEFORCE 上的 OpenCL 代码

有啥方法可以在 NVIDIA 显卡上的 Visual Studio 中运行程序调试?

如何在 Visual Studio / OpenGL 中设置 GPU [重复]

win10 visual studio 2017环境中安装CUDA8

如何在 Visual Studio 中将 common/inc 文件夹添加到 CUDA 项目?