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

时间:2013-02-14 10:19:48

标签: cuda shared-memory

我对共享变量的工作原理有疑问。

当我在这样的内核中声明共享变量时 __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;

那么所有活动块会立即在自己的共享内存中分配该值吗?

1 个答案:

答案 0 :(得分:3)

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

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

N * sizeof(int)的最大值取决于卡的Compute Capaibity和L1-cache配置。它可以在:8KB,16KB,32KB和48KB之间变化。

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