带宽的 nvprof 选项
Posted
技术标签:
【中文标题】带宽的 nvprof 选项【英文标题】:nvprof option for bandwidth 【发布时间】:2016-06-09 17:36:08 【问题描述】:从命令行使用 nvprof --metrics 测量带宽的正确选项是什么?我正在使用 flop_dp_efficiency 来获取峰值 FLOPS 的百分比,但是手册中似乎有很多带宽测量选项,我并不真正了解我在测量什么。例如dram_read、dram_write、gld_read、gld_write 在我看来都一样。另外,我是否应该通过假设两者同时发生来将带宽报告为读+写吞吐量的总和?
编辑:
根据图表的出色答案,从设备内存到内核的带宽是多少?我正在考虑在从内核到设备内存的路径上采用最小带宽(读+写),这可能是 dram 到 L2 缓存。
我正在尝试通过测量 FLOPS 和带宽来确定内核是否受计算或内存限制。
【问题讨论】:
docs.nvidia.com/cuda/profiler-users-guide/… 为什么全局内存(gld)和dram(设备内存)的带宽是分开报告的? 您可以将这些名称与 GUI 版本名称进行比较。似乎设备内存吞吐量是硬件视图。它不包括缓存命中,但包括 ECC 位。全局内存吞吐量是软件视图。这与计算代码中的吞吐量相同。 【参考方案1】:为了了解该领域的分析器指标,有必要了解 GPU 中的内存模型。我发现the diagram published in the Nsight Visual Studio edition documentation 很有用。我已经用编号箭头标记了图表,这些箭头指的是我在下面列出的编号指标(和传输方向):
请参阅CUDA profiler metrics reference 了解每个指标的说明:
-
dram_read_throughput、dram_read_transactions
dram_write_throughput、dram_write_transactions
sysmem_read_throughput、sysmem_read_transactions
sysmem_write_throughput、sysmem_write_transactions
l2_l1_read_transactions,l2_l1_read_throughput
l2_l1_write_transactions,l2_l1_write_throughput
l2_tex_read_transactions、l2_texture_read_throughput
纹理是只读的,此路径上不可能有事务
shared_load_throughput、shared_load_transactions
shared_store_throughput、shared_store_transactions
l1_cache_local_hit_rate
l1 是直写缓存,因此该路径没有(独立)指标 - 请参阅其他本地指标
l1_cache_global_hit_rate
见注释 12
gld_efficiency、gld_throughput、gld_transactions
gst_efficiency、gst_throughput、gst_transactions
注意事项:
-
从右到左的箭头表示读取活动。从左到右的箭头表示写活动。
“global”是一个逻辑空间。从程序员的角度来看,它指的是逻辑地址空间。指向“全局”空间的事务最终可能会出现在缓存之一、系统内存或设备内存(DRAM)中。另一方面,“DRAM”是一个物理实体(例如,L1 和 L2 缓存也是如此)。 “逻辑空间”都显示在图表的第一列中,紧邻“内核”列的右侧。右侧的其余列是物理实体或资源。
我没有尝试用图表上的位置标记每个可能的内存指标。如果您需要弄清楚其他图表,希望这张图表对您有所帮助。
通过以上描述,您的问题可能仍然没有得到回答。然后,您有必要澄清您的要求——“您想准确测量什么?”但是,根据您所写的问题,您可能想查看 dram_xxx 指标,如果您关心的是实际消耗的内存带宽。
另外,如果您只是想估计最大可用内存带宽,使用 CUDA 示例代码bandwidthTest
可能是获得代理测量的最简单方法。只需使用报告的设备到设备带宽数,作为代码可用的最大内存带宽的估计值。
结合上述想法,dram_utilization 指标给出了一个缩放结果,表示实际使用的总可用内存带宽的部分(从 0 到 10)。
【讨论】:
非常感谢您提供图表!我已经编辑了我的问题。 将 dram_read_transactions 添加到 dram_write_transactions,按 32 字节缩放,除以内核执行时间 如果您只想确定计算与内存的界限,只需将 dram_utilization 与 alu_fu_utilization 进行比较。 @RobertCrovella:alu_fu_utilization
在 CC>=5.0 后不可用。整数利用率没有任何相关指标。我只看到issue_slot_utilization
。有什么解决方法吗?其他指标的一种组合?我无法关联指标。
一种可能的方法是对每个计算 fu_utilization
指标进行一组比较,包括 double_precision_fu_utilization
、single_precision_fu_utilization
、half_precision_fu_utilization
。将其中的每一项单独与dram_utilization
进行比较。请注意,整数会根据架构与另一种类型(例如 single_precision)混为一谈。仔细研究上述每个指标的描述。在此答案的 cmets 空间中,我可能无法对此提供进一步的回应。以上是关于带宽的 nvprof 选项的主要内容,如果未能解决你的问题,请参考以下文章
ROS取数线程分析: 不带组装: socket选项SO_SNDBUF,SO_RCVBUF对带宽和CPU的影响
ROS取数线程分析: 不带组装: socket选项SO_SNDBUF,SO_RCVBUF对带宽和CPU的影响