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

sil*_*amb 1 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不稳定?

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

Rob*_*lla 6

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

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

要么不正确,要么重视细节.

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

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

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

GPU逻辑/物理内存图显示两种不同的事务类型

对于相关指标,此答案为上图提供了更详细的解码.