我对共享变量的工作原理有疑问。
当我在这样的内核中声明共享变量时
__shared__ int array1[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。 这是我原来的问题,并得到了解答。
问:当我为array1
指定一个值时 array1[0]=1;
那么所有活动块会立即在自己的共享内存中分配该值吗?
答案 0 :(得分:3)
每个块将始终分配自己的共享内存阵列。因此,如果启动25x25块,最终将在共享内存中创建25x25阵列。
但是,并不意味着所有这些数组将同时存在,因为不能保证所有数据块同时存在。活动块的数量取决于正在运行的GPU的实际模型。 GPU驱动程序将尝试尽可能多地启动,并且额外的blocsk将在之前的工作结束之后运行。N * sizeof(int)的最大值取决于卡的Compute Capaibity和L1-cache配置。它可以在:8KB,16KB,32KB和48KB之间变化。
要回答您的上一个问题 - 属于相应块的所有线程都可以看到每个共享阵列。在您的情况下,相应的22x22线程将显示每个共享阵列。