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