CUDA 根据字长合并内存访问速度

CUDA coalesced memory access speed depending on word size

我有一个 CUDA 程序,其中一个 warp 需要访问(例如)96 字节的全局内存。

它正确对齐内存位置和通道索引,以便合并访问并在单个事务中完成。

该程序可以使用 12 个通道进行访问,每个通道访问一个 uint8_t。或者,它将使用 6 个通道访问 uint16_t,或使用 3 个通道访问 uint32_t。

这些替代方案之间是否存在性能差异,如果每个线程访问较小的内存量,访问速度是否更快?

当每个 warp 需要访问的内存量不同时,优化它以使线程尽可能访问更小的单元(16 位或 8 位)是否有好处?

如果不知道数据在寄存器中将如何使用,就很难说出最佳选择。对于几乎所有 GPU,这些选项之间的性能差异可能非常小。

NVIDIA GPU L1 支持返回 64 bytes/warp (CC5.,6.) 或 128 bytes/warp (CC3., CC7.) returns 来自 L1。只要每个线程的大小 <= 32 位,那么性能应该非常相似。

在 CC 5./6. 中,减少谓词真实线程的数量(更喜欢更大的数据)可能会带来很小的性能优势。 L1TEX 单元将全局访问分解为 4 x 8 线程请求。如果 8 个线程的完整组被断言,则 L1TEX 循环被保存。写回寄存器文件需要相同的周期数。线程的分组顺序未公开。

好的做法是编写微基准。 CUDA 分析器为 L1TEX 路径的不同部分提供了大量计数器,以帮助查看差异。