为了获得尽可能快的速度,我应该对 CUDA 中的矩阵使用什么步幅?

mei*_*sel 2 cuda memory-alignment stride

我正在处理大小范围从 2,000x2,000 到 5,000x5,000 的矩阵,执行乘法和 QR 分解等运算。例如,我很好奇是否应该将所有矩阵的步长对齐 64,以获得最佳性能。另外,由于缓存关联性,我是否应该避免步幅为某些页面大小的倍数,或者这不适用于 GPU 内存?

Hom*_*512 6

我想大多数人都会信任cudaMallocPitchcudaMalloc3D提供适当的调整,因为这是他们既定的目的。虽然运行时文档中没有明确说明,但它们与cudaDeviceProp::textureAlignment(当前硬件上的 512 字节)一致。还有NPP 的分配器函数,它们似乎具有不同的对齐策略(或者至少在过去是这样做的)。请参阅CUDA 的 nppiMalloc... 函数如何保证对齐?对此进行一些讨论。

流排序内存分配器缺乏倾斜的分配器函数,这表明对齐在今天可能不再那么重要。或者这可能是 API 中的疏忽,谁知道呢?

我们从编程指南的不同部分确实知道的是

最佳实践指南仅建议 32 字节对齐的内存事务。

我不知道每一代的缓存参数列表。Turing 的 L2 是 4 MiB 16 路集合,与 64 字节线关联,内存页为 2 MiB。如果我计算正确的话,这意味着 256 kiB 的对齐将是病态的。有了这些数字,我想您可以开始看到 16 kiB 对齐或更多的效果,但我不知道有关该主题的任何官方指导。

就我个人而言,我坚持使用倾斜分配器,当我不使用它们时,我使用纹理对齐,除了较小的线条尺寸,我只使用 2 的下一个幂,以免浪费太多内存,除非我打算使用纹理绑定。