我正在处理大小范围从 2,000x2,000 到 5,000x5,000 的矩阵,进行乘法和 QR 分解等运算。例如,我很好奇是否应该将所有矩阵的步长对齐 64,以获得最佳性能。另外,由于缓存关联性,我是否应该避免步幅为某些页面大小的倍数,或者这不适用于 GPU 内存?
cudaMallocPitch
或 cudaMalloc3D
可以提供正确的对齐方式,因为这是他们既定的目的。虽然运行时文档中没有明确说明,但我相信它们与 cudaDeviceProp::texturePitchAlignment
一致。我从未检查过 NPP 的分配器函数是否进行了不同的对齐,但我认为没有理由这样做。
缺乏流排序内存分配器的倾斜分配器函数表明对齐在今天可能不那么重要。或者这可能是 API 中的疏忽,谁知道呢?
我们从编程指南的不同部分确实知道的是
memcpy_async
需要 16 字节对齐以获得最佳性能最佳实践指南仅建议使用 32 字节对齐的内存事务。
我不知道每一代的缓存参数列表。 Turing 的 L2 是 4 MiB 16 路集合,与 64 字节线关联,内存页为 2 MiB。如果我计算正确的话,这意味着 256 kiB 的对齐将是病态的。有了这些数字,我想您可以开始看到 16 kiB 对齐或更多的效果,但我不知道有关该主题的任何官方指导。
就我个人而言,我坚持使用倾斜分配器,当我不使用它们时,我使用纹理对齐,除了较小的线条尺寸,我只使用 2 的下一个幂,以免浪费太多内存,除非我计划使用纹理绑定.