CUDA 块级共享寄存器

CUDA Block-level Shared Registers

有什么方法可以使用 registers 以便 warp/block 线程访问可见,就像 shared memory?

另一个假设是我已经有了每个 warp/block 的大小,例如,我需要 64xsizeof(float) 个寄存器。

主要原因是我发现在应用程序需要非合并访问的情况下,从 warp 到共享内存的随机访问非常慢。

一般不会。

  1. 您没有强制或指示编译器将项目放入寄存器的机制。例如 C++ register 关键字不会这样做。寄存器的使用由编译器控制。

  2. 即使可以,寄存器也不会像共享内存那样“共享”,对 warp/threadblock 中的多个线程可见。寄存器一旦分配给拥有它们的线程,就只有该线程可见。它们不能对 warp 或 threadblock 中的任何其他线程可见。

如果您只是需要每线程本地存储,不在线程之间共享,并且您的使用满足许多其他要求,您可以“哄骗”编译器将这些项目放在寄存器。 This forum thread 提供了一个示例,说明如何完成它以及它的外观。同样,一旦编译器清楚地看到这样做的方式,并决定有充分的理由这样做(即“相信”可能的性能改进),编译器将自动将项目放入寄存器中。您无法直接控制它。