我有一个CUDA程序,其中一个warp需要访问(例如)96字节的全局内存。
它正确地对齐内存位置和通道索引,以便在单个事务中合并和完成访问。
该程序可以使用12个通道访问uint8_t进行访问。或者,它将使用6个通道访问uint16_t,或使用3个通道访问uint32_t。
这些替代方案之间是否存在性能差异,如果每个线程访问较少量的内存,访问速度会更快吗?
当每个warp需要访问的内存量不同时,优化它是否有好处,以便在可能的情况下使线程访问较小的单元(16位或8位)?
如果不知道数据将如何在寄存器中使用一次,则很难说明最佳选项。对于几乎所有GPU,这些选项之间的性能差异可能非常小。
NVIDIA GPU L1支持从L1返回64字节/ warp(CC5。,6。)或128字节/ warp(CC3。,CC7。)返回。只要每个线程的大小<= 32位,那么性能应该非常相似。
在CC 5./6。减少谓词真实线程的数量可能会有一个小的性能优势(更喜欢更大的数据)。 L1TEX单元将全局访问分解为4 x 8个线程请求。如果断开8个线程的完整组,则保存L1TEX循环。写回寄存器文件需要相同的周期数。没有公开线程的分组顺序。
好的做法是写一个微基准。 CUDA分析器有许多计数器,用于L1TEX路径的不同部分,以帮助查看差异。