Cuda 在内核中声明共享内存变量

Cuda 在内核中声明共享内存变量,cuda,shared-memory,Cuda,Shared Memory,我有一个关于共享变量如何工作的问题 当我像这样在内核中声明一个共享变量时 \uuuuuu共享\uuuuuuuuuuu数组1[N] 每个活动块的每个唯一共享内存现在都有一个大小为N的array1实例。这意味着每个活动块的每个共享内存现在都分配了N*sizeof(int)字节。 对于计算能力为1.3的gpu,N*sizeof(int)必须最大为16KB 因此,假设上述情况正确,并使用在主机上分配的2D线程和2D块,如下所示: dim3 block_size(22,22); dim3 grid_siz

我有一个关于共享变量如何工作的问题

当我像这样在内核中声明一个共享变量时
\uuuuuu共享\uuuuuuuuuuu数组1[N]
每个活动块的每个唯一共享内存现在都有一个大小为N的array1实例。这意味着每个活动块的每个共享内存现在都分配了N*sizeof(int)字节。 对于计算能力为1.3的gpu,N*sizeof(int)必须最大为16KB

因此,假设上述情况正确,并使用在主机上分配的2D线程和2D块,如下所示:

dim3 block_size(22,22);
dim3 grid_size(25,25);
我会有25x25个array1实例,每个实例的大小为N*sizeof(int),可以访问块的每个共享内存的线程最多是22x22。 这是我最初的问题,得到了回答

问:当我给数组1赋值时

array1[0]=1


然后,所有活动块是否立即在其自己的共享内存中分配该值?

每个块将始终分配其自己的共享内存阵列。因此,如果启动25x25块,最终将在共享内存中创建25x25阵列

但是,这并不意味着所有这些数组都将同时存在,因为不能保证所有块都同时存在。活动块的数量取决于正在运行的GPU的实际型号。GPU驱动程序将尝试启动尽可能多的程序,额外的blocsk将在前一个程序结束工作后运行

N*sizeof(int)的最大值取决于卡的计算能力和一级缓存配置。它可以在8KB、16KB、32KB和48KB之间变化


回答上一个问题-每个共享数组都可以被属于相应块的所有线程看到。在您的情况下,每个共享阵列将由相应的22x22线程可见。

您的假设是正确的。但问题是什么呢?既然我确认了我的假设,我想问一下,当我使用主机上声明的2D线程和2D块时,就像这个dim3块大小(22,22);dim3网格尺寸(25,25);我有多少个array1到array1的实例。25还是25*25?每个线程可以访问多少个线程?谢谢这里将有(25 x 25)个块,因此每个块总共有625个单独的共享内存实例。块的共享内存只能由该块的线程访问。所以(22 x 22)=484个线程将能够访问每个共享内存实例。@sgar91:静态共享内存分配从来没有这么多单独的实例。在费米和开普勒上,如果调整L1/共享分割,每个SM的并发块数乘以运行内核的SM数,那么N*sizeof(int)可能会大于16KB。