在Nvidia GPU的寄存器中存储大小为64的数组是否合适? 为了说明这个问题,让我们考虑下面的例子。假设我有两个数组A[16][64]和B[16][N][64],我想计算ans[I][j][N]=f(A[I],B[j][N]),其中f是一个函数。我将编写一个cuda内核,在一个块中包含256个线程,每个线程计算一对(I,j)所有ans[I][j][k]s

在Nvidia GPU的寄存器中存储大小为64的数组是否合适? 为了说明这个问题,让我们考虑下面的例子。假设我有两个数组A[16][64]和B[16][N][64],我想计算ans[I][j][N]=f(A[I],B[j][N]),其中f是一个函数。我将编写一个cuda内核,在一个块中包含256个线程,每个线程计算一对(I,j)所有ans[I][j][k]s,cuda,Cuda,最经典的方法是首先将A加载到共享内存中。然而,我发现由于A将在一个线程中使用N次,在加载到共享内存后,我可以进一步将A[I]加载到寄存器中,以加速计算f(A[I],B[j][N])。寄存器比共享内存快是常识 我查阅了文档,发现每个线程最多可以有255个大于64的寄存器,所以可以使用64个寄存器。但我也听到一个叫做寄存器压力的术语,它说使用许多寄存器可能很慢。此外,我发现编译器经常限制寄存器的数量,如果寄存器的数量超过限制,编译器将使用本地内存 基于以上事实,我有很多困惑。例如,在这种情况下,我应

最经典的方法是首先将
A
加载到共享内存中。然而,我发现由于
A
将在一个线程中使用N次,在加载到共享内存后,我可以进一步将
A[I]
加载到寄存器中,以加速计算
f(A[I],B[j][N])
。寄存器比共享内存快是常识

我查阅了文档,发现每个线程最多可以有255个大于64的寄存器,所以可以使用64个寄存器。但我也听到一个叫做寄存器压力的术语,它说使用许多寄存器可能很慢。此外,我发现编译器经常限制寄存器的数量,如果寄存器的数量超过限制,编译器将使用本地内存

基于以上事实,我有很多困惑。例如,在这种情况下,我应该使用寄存器而不是共享内存吗?在这种情况下真的会出现注册压力吗?访问寄存器比共享内存快多少?谢谢大家!

。。。。在这种情况下,我应该使用寄存器而不是共享内存吗

没有办法“使用”寄存器。编译器使用大量复杂的代码分析和启发式方法确定如何分配寄存器。程序员对此没有控制权。编译器将根据需要溢出到本地内存

在这种情况下真的会出现注册压力吗

说不上来。显然,如果增加内核的寄存器占用空间,每个SM的最大线程数将在某个时候减少。这是否会影响性能取决于代码和设备,需要基准数据。你没有提供这三件事的细节

访问寄存器比共享内存快多少

几年前的一般规则(懒得查阅Vasily-Volkov分析)是寄存器带宽比共享内存高10倍左右