繁体   English   中英

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

[英]declaring shared memory variables in a kernel

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM