带宽的 nvprof 选项

nvprof option for bandwidth

从命令行使用 nvprof --metrics 测量带宽的正确选项是什么?我正在使用 flop_dp_efficiency 来获取峰值 FLOPS 的百分比,但是手册中似乎有很多带宽测量选项,我不太明白我在测量什么。例如dram_read、dram_write、gld_read、gld_write 在我看来都一样。另外,我是否应该通过假设两者同时发生来将 bandwdith 报告为读+写吞吐量的总和?

编辑:

根据图表的出色回答,从设备内存到内核的带宽是多少?我正在考虑在从内核到设备内存的路径上取最小的带宽(读+写),这可能是 dram 到 L2 缓存。

我正在尝试通过测量 FLOPS 和带宽来确定内核是否受计算限制或内存限制。

为了理解这方面的分析器指标,有必要了解 GPU 中的内存模型。我发现 the diagram published in the Nsight Visual Studio edition documentation 很有用。我用编号箭头标记了图表,这些箭头指的是我在下面列出的编号指标(和传输方向):

请参阅CUDA profiler metrics reference了解每个指标的说明:

  1. dram_read_throughput, dram_read_transactions
  2. dram_write_throughput、dram_write_transactions
  3. sysmem_read_throughput、sysmem_read_transactions
  4. sysmem_write_throughput、sysmem_write_transactions
  5. l2_l1_read_transactions、l2_l1_read_throughput
  6. l2_l1_write_transactions, l2_l1_write_throughput
  7. l2_tex_read_transactions、l2_texture_read_throughput
  8. 纹理是只读的,此路径上没有可能的事务
  9. shared_load_throughput、shared_load_transactions
  10. shared_store_throughput,shared_store_transactions
  11. l1_cache_local_hit_rate
  12. l1 是直写式缓存,因此此路径没有(独立)指标 - 请参考其他本地指标
  13. l1_cache_global_hit_rate
  14. 参见 12 的注释
  15. gld_efficiency、gld_throughput、gld_transactions
  16. gst_efficiency、gst_throughput、gst_transactions

备注:

  1. 从右到左的箭头表示阅读 activity。从左到右的箭头表示 write activity.
  2. "global" 是一个 合乎逻辑的 space。从程序员的角度来看,它指的是逻辑地址space。定向到 "global" space 的事务可能会在其中一个缓存、系统内存或设备内存 (dram) 中结束。另一方面,"dram" 是一个物理实体(例如,L1 和 L2 缓存也是如此)。 "logical spaces" 全部显示在图表的第一列中,紧邻 "kernel" 列的右侧。右边的其余列是物理实体或资源。
  3. 我没有尝试在图表上标记每个可能的内存指标。如果您需要了解其他图表,希望这张图表对您有所帮助。

根据以上描述,您的问题可能还是没有得到解答。那么您有必要澄清您的请求 - "what do you want to measure exactly?" 但是根据您所写的问题,如果您关心的是实际消耗的内存带宽,您可能想查看 dram_xxx 指标.

此外,如果您只是想估计最大可用内存带宽,使用 CUDA 示例代码 bandwidthTest 可能是获得该指标的代理测量值的最简单方法。只需使用报告的设备到设备带宽编号,作为代码可用的最大内存带宽的估计值。

结合上述想法,dram_utilization 指标给出了一个缩放结果,表示实际使用的总可用内存带宽的部分(从 0 到 10)。