cuda - L2 事务如何映射到 GPU 中的 DRAM?
问题描述
在 GPU 中,L2 缓存的事务大小可以是 32B、64B 或 128B(读取和写入)。此类事务的总数可以使用 gst_transactions 和 gld_transactions 等 nvprof 指标来衡量。但是,我找不到任何详细说明这些事务如何映射以进行 DRAM 访问的材料,即这些事务如何由通常具有不同总线宽度的 DRAM 处理?例如,TitanXp GPU 具有 384 位全局内存总线,而 P100 具有 3072 位内存总线。那么 32B、64B 或 128B 指令是如何映射到这些内存总线的。我如何测量 DRAM 控制器生成的事务数量?
PS: dram_read_transactions 指标似乎没有这样做。我之所以这么说,是因为我在 TitanXp 和 P100(即使在顺序访问期间)上获得了相同的 dram_read_transactions 值,尽管两者的总线宽度差异很大。
解决方案
尽管 GPU DRAM 在不同的 GPU 类型上可能具有不同的(硬件)总线宽度,但总线始终由一组分区组成,每个分区的有效宽度为 32 字节。从分析器的角度来看,DRAM 事务实际上由这些 32 字节事务之一组成,而不是完整“总线宽度”的事务。
因此,到 L2 的(单个)32 字节事务如果在 L2 中未命中,将转换为单个 32 字节 DRAM 事务。更高粒度的事务(例如 64 字节或 128 字节)将转换为所需数量的 32 字节 DRAM 事务。这可以使用任何 CUDA 分析器发现。
请注意,上面使用的 32 字节的“有效宽度”并不一定意味着事务需要 32 字节 * 8 位/字节 = 256 位宽的接口。DRAM 总线可以是“双泵”或“四泵”,这意味着一个事务可能由接口的每条“线”传输的多个位组成。因此,您会发现 GPU 与 GPU DRAM 的接口只有 128 位宽(甚至 64 位宽),但这些总线上的“事务”仍将包含 32 字节,这将需要传输多个位(可能在多个 DRAM 总线时钟周期中)每个接口的“线”。
推荐阅读
- java - 如何使用 2 个按钮使多线程摇摆 gui 应用程序启动/停止线程
- java - Android Java App 在最小化/制表时兑现
- r - 通过运行 chisq.test 或任何其他统计格式,我如何将结果提取到数据框中?
- json - 当模型与Django中的默认用户模型具有外键关系时如何序列化模型
- python - 如何使用函数 plt.savefig() 将许多图形保存在循环中或 while 中?
- javascript - 警告:validateDOMNesting(...): 不能作为子级出现.我该如何解决这个问题?
- kubernetes - 从 kubernetes 部署中读取 karate-config.js 中的环境变量
- kotlin - Kotlin 类层次结构和(协)方差
- php - 每封电子邮件中的 WooCommerce WPGens 推荐
- python - PyQt5图表实时绘图