测量 CUDA 中某条指令或代码行的内存带宽的方法?

Way to measure the memory bandwidth for a certain instruction or code line in CUDA?

有没有办法测量CUDA中某个内存指令或代码行的内存带宽? (nvprof 可以输出整个内核的内存带宽。)如果 clock() 函数是唯一的方法,那么计算带宽的公式是什么? (每个{指令或代码行}的合并地址数除以时钟()差异?)

我想看看某条指令或代码行over/under-utilize内存带宽。 (例如,MSHR..)

我有两个设备,GTX980(Maxwell,sm_52)和 P100(Pascal,sm_60)在 x86_64 位 linux 系统上。

nsight 工具中的指令级分析是一种可以提供一些见解的工具。它可以让您了解当 SM "stalls"(未能发出任何指令)时应归咎于哪一行。因为 LD/ST 指令不会阻止执行,所以您经常会在 紧接着 数据获取后立即看到停顿。

这是一篇关于该主题的 NVIDIA 开发博客。 https://devblogs.nvidia.com/parallelforall/cuda-7-5-pinpoint-performance-problems-instruction-level-profiling/

使用 nvidia 的可视化分析器。或多或少,它会告诉你所有可能知道的关于你的cuda代码性能的信息。

如果您使用 -lineinfo 编译代码,探查器可以告诉您内核中每一行的统计信息。当您 运行 您的代码时,切换到非引导分析(默认布局的左下方)。让它生成时间线,在时间线中点击你想要的内核,然后点击左下方面板中全局内存访问模式的播放按钮。它将给出每行全局内存负载列表,其中 transactions/access 并告知您理想的数字是多少。双击这些行之一将带您到源代码中的行并显示匹配的汇编指令。