如何测量CUDA中特定指令或代码行的内存带宽?

如何测量CUDA中特定指令或代码行的内存带宽?,cuda,gpgpu,memory-bandwidth,Cuda,Gpgpu,Memory Bandwidth,有没有办法测量CUDA中特定内存指令或代码行的内存带宽?(nvprof可以输出整个内核的内存带宽。)如果clock()函数是唯一的方法,那么计算带宽的公式是什么?(#每个{指令或代码行}的合并地址除以时钟()差?) 我想看看某条指令或代码行是否超过/低于内存带宽。(例如,MSHR.) 我在x86_64位linux系统上有两个设备,GTX980(Maxwell,sm_52)和P100(Pascal,sm_60)。一个可以提供一些见解的工具是nsight工具中的指令级评测。当SM“暂停”(无法发出任

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

我想看看某条指令或代码行是否超过/低于内存带宽。(例如,MSHR.)


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

一个可以提供一些见解的工具是nsight工具中的指令级评测。当SM“暂停”(无法发出任何指令)时,它可以让您知道该怪哪一行。由于LD/ST指令不会阻止执行,因此通常会在数据获取之后立即看到暂停


这里有一个关于这个主题的NVIDIA devlog

nsight工具中的指令级评测是一个可以提供一些见解的工具。当SM“暂停”(无法发出任何指令)时,它可以让您知道该怪哪一行。由于LD/ST指令不会阻止执行,因此通常会在数据获取之后立即看到暂停


这里有一个关于这个主题的NVIDIA devlog

使用nvidia的可视探查器。或多或少,它会告诉您所有可能知道的有关cuda代码性能的信息


如果使用-lineinfo编译代码,探查器可以告诉您内核中每一行的统计信息。运行代码时,切换到非导向分析(默认布局中的左下角)。让它生成时间线,单击时间线中所需的内核,然后单击左下面板中全局内存访问模式的播放按钮。它将列出每行的全局内存负载列表,以及事务/访问,并告诉您理想的数量。双击其中一行将带您进入源代码中的行,并向您显示匹配的汇编说明。

使用nvidia的visual profiler。或多或少,它会告诉您所有可能知道的有关cuda代码性能的信息


如果使用-lineinfo编译代码,探查器可以告诉您内核中每一行的统计信息。运行代码时,切换到非导向分析(默认布局中的左下角)。让它生成时间线,单击时间线中所需的内核,然后单击左下面板中全局内存访问模式的播放按钮。它将列出每行的全局内存负载列表,以及事务/访问,并告诉您理想的数量。双击其中一行将带您进入源代码中的那一行,并向您显示匹配的汇编指令。

出于许多原因,我不确定这是否有意义。也许最重要的一点是LD(SASS)指令是一个fire-and-forget指令。这意味着它仅被发送到LD/ST单元,并且稍后可能会因此触发内存事务。如果您只是测量了LD指令的“持续时间”,那么您只是在测量向LD/ST单元发出该指令所需的时间——这应该很短,如果您能够准确地测量它的话,只需要几个周期。它实际上并不代表检索数据所需的时间,也不存在指令或代码行(特别是LD/ST指令)的内存带宽。它按顺序执行,并与其他指令并行执行。还有,@RobertCrovella说了什么,所以你不能从使用
clock()
中得到你需要的东西。也许你可以用这个值来解释你想回答的问题?我不确定这有多大意义,原因有很多。也许最重要的一点是LD(SASS)指令是一个fire-and-forget指令。这意味着它仅被发送到LD/ST单元,并且稍后可能会因此触发内存事务。如果您只是测量了LD指令的“持续时间”,那么您只是在测量向LD/ST单元发出该指令所需的时间——这应该很短,如果您能够准确地测量它的话,只需要几个周期。它实际上并不代表检索数据所需的时间,也不存在指令或代码行(特别是LD/ST指令)的内存带宽。它按顺序执行,并与其他指令并行执行。还有,@RobertCrovella说了什么,所以你不能从使用
clock()
中得到你需要的东西。也许你可以用这个值来解释你想回答的问题?