【问题标题】:What is the difference between dram_read_transactions and gld_transactions in CUDA profiler?CUDA 探查器中的 dram_read_transactions 和 gld_transactions 有什么区别?
【发布时间】:2014-12-08 20:31:48
【问题描述】:

在 CUDA 分析器中,有两个指标称为 dram_read_transactions 和 gld_transactions。 cuda profiler 用户指南说“gld_transactions”表示全局内存加载事务的数量,而“dram_read_transactions”表示设备内存读取事务。我无法分辨这些描述之间的区别,因为读取数据意味着加载数据,而全局内存是 DRAM 的。但是这两个指标的分析结果是不同的。我用一个内核进行了测试。对于同一个内核,不同线程设置,gld_transactions 总是相同的值 33554432。并且这个值是稳定的。但是对于 dram_read_transactions,两个不同的线程设置会导致不同的值,它们大致是 4486636 和 4197096。对于“大致”这个词,我的意思是这些值并不稳定,因为它们从一个执行到另一个执行略有变化。我们还可以看到 dram_transactions 比 gld_transactions 少得多。所以我的问题可以总结在这里:

  1. gld_transactions 和 dram_read_transactions 之间的真正区别是什么?
  2. 为什么 dram_read_transactions 比 gld_transactions 小很多?
  3. 对于不同的线程设置,为什么gld_transactions值稳定而dram_read_transactions不稳定?

我认为一旦我们知道了问题 (1) 的答案,那么问题 (2) 和 (3) 就可以很容易地解释了。那么有人可以解释一下吗?提前致谢。

【问题讨论】:

  • gld_transactions 是 128 字节 L1 事务的数量(这包括未缓存的负载)。 dram_read_transactions 是实际设备内存的 32 字节数。如果您有 CC2.0 或更高版本,则 SM 和 DRAM 之间有两级缓存层次结构。 gld_transactions 更稳定,因为它可以在整个芯片上收集。 dram_read_transactions 只能从 pass 的 1/2 接口中收集,并且由于 L1 和 L2 的内容而存在可变性。

标签: cuda


【解决方案1】:

全局负载指的是一个逻辑内存空间。 DRAM 读取是指物理资源 上的事务。您的声明:

读取数据意味着加载数据,全局内存是DRAM。

要么不正确,要么掩盖了重要的细节。

从根本上说,全局负载是由 warp 执行的指令发出的。这些加载的初始目标将是 L1 或 L2 缓存(通常)。如果缓存内容满足全局负载,则永远不会成为 DRAM 读取事务。另一方面,如果全局加载的目标不在缓存中,那么它将成为 dram 读取事务(通常/通常)。

此外,全局内存空间并不是唯一的内存空间。还有其他的内存空间,比如local。到“本地”内存的事务最终也可以通过多种方式进行服务,其中一种方式实际上是触发 dram 读取。这样的事务不会出现在任何“全局”指标中,但会出现在 DRAM 读取事务指标中。

我在 nsight VSE 文档(和工具帮助)中找到了this diagram/chart,其中介绍了 GPU 上内存的逻辑和物理排列,有助于理解这一点。我在此处摘录了图表,并以红色突出显示了与您确定的指标相对应的“链接”:

This answer 对上图进行了更详细的解码,以获取相关指标。

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 2015-03-26
    • 2017-12-23
    • 2016-08-30
    • 2023-04-05
    • 2016-07-31
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多