0

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

我想查看某个指令或代码行是否过度/未充分利用内存带宽。(例如,MSHR ..)

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

4

2 回答 2

3

可以提供一些洞察力的工具是 nsight 工具中的指令级分析。它可以让您了解当 SM “停止”(未能发出任何指令)时应该归咎于哪条线路。因为 LD/ST 指令不会阻塞执行,所以您经常会在数据获取后立即看到停顿

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

于 2017-07-12T02:27:11.717 回答
2

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

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

于 2017-07-12T13:26:33.763 回答