1

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

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

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

4

1 回答 1

3

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

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

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

要回答您的最后一个问题 - 每个共享数组对属于相应块的所有线程都是可见的。在您的情况下,相应的 22x22 线程将可以看到每个共享数组。

于 2013-02-14T14:35:16.990 回答