L2 事务如何映射到 GPU 中的 DRAM?
How are L2 transactions mapped to DRAM in GPUs?
在 GPU 中,L2 缓存的事务大小可以是 32B、64B 或 128B(读和写)。此类交易的总数可以使用 gst_transactions 和 gld_transactions 等 nvprof 指标来衡量。但是,我找不到任何 material 详细说明这些事务是如何映射到 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 字节事务之一组成,而不是完整的事务 "bus width".
因此,如果在 L2 中未命中,到 L2 的(单个)32 字节事务将转换为单个 32 字节 DRAM 事务。更高粒度的事务,例如 64 字节或 128 字节,将转换为所需数量的 32 字节 DRAM 事务。这可以使用任何 CUDA 分析器发现。
这些相关问题 here and 可能也很有趣。
请注意,如上所述,32 字节的 "effective width" 并不一定意味着事务需要 32 字节 * 8 位/字节 = 256 位宽接口。 DRAM 总线可以是 "double-pumped" 或 "quad-pumped",这意味着事务可能包含每个 "wire" 接口传输的多个位。因此,您会发现 GPU 只有 128 位宽(甚至 64 位宽)的 GPU DRAM 接口,但这些总线上的 [=24=] 仍将包含 32 字节,这将需要多个位来每个 "wire" 接口传输(可能在多个 DRAM 总线时钟周期内)。
在 GPU 中,L2 缓存的事务大小可以是 32B、64B 或 128B(读和写)。此类交易的总数可以使用 gst_transactions 和 gld_transactions 等 nvprof 指标来衡量。但是,我找不到任何 material 详细说明这些事务是如何映射到 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 字节事务之一组成,而不是完整的事务 "bus width".
因此,如果在 L2 中未命中,到 L2 的(单个)32 字节事务将转换为单个 32 字节 DRAM 事务。更高粒度的事务,例如 64 字节或 128 字节,将转换为所需数量的 32 字节 DRAM 事务。这可以使用任何 CUDA 分析器发现。
这些相关问题 here and
请注意,如上所述,32 字节的 "effective width" 并不一定意味着事务需要 32 字节 * 8 位/字节 = 256 位宽接口。 DRAM 总线可以是 "double-pumped" 或 "quad-pumped",这意味着事务可能包含每个 "wire" 接口传输的多个位。因此,您会发现 GPU 只有 128 位宽(甚至 64 位宽)的 GPU DRAM 接口,但这些总线上的 [=24=] 仍将包含 32 字节,这将需要多个位来每个 "wire" 接口传输(可能在多个 DRAM 总线时钟周期内)。