在CUDA探查器中dram_read_transactions和gld_transactions有什么区别?

时间:2014-12-08 20:31:49

标签: cuda

在CUDA探查器中,有两个名为dram_read_transactions和gld_transactions的指标。 cuda profiler用户指南说“gld_transactions”表示全局内存加载事务的数量,而“dram_read_transactions”表示设备内存读取事务。我无法区分这些描述,因为读取数据意味着加载数据和全局内存很大。但这两个指标的分析结果是不同的。我用一个内核测试过。对于具有不同线程设置的相同内核,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不稳定?
  4. 我认为一旦我们知道问题(1)的答案,就可以很容易地解释问题(2)和(3)。所以有人能解释一下吗?提前谢谢。

1 个答案:

答案 0 :(得分:5)

全局加载是指逻辑内存空间。 dram read是指物理资源上的事务。您的陈述:

  

读取数据意味着加载数据和全局内存很大。

不正确或掩盖重要细节。

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

此外,全局内存空间不是唯一的内存空间。还有其他内存空间,例如local。对“本地”存储器的事务最终也可以以各种方式提供服务,其中一种方式实际上会触发读取。此类交易不会显示在任何“全局”指标中,但会显示在dram读取交易指标中。

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

GPU logical/physical memory diagram showing two different transaction types

This answer为相关指标提供了上述图表的更详细解码。