有没有办法解除分配在同一个CUDA内核中优先分配的共享内存? 例如,在内核中我已经定义了
__shared__ unsigned char flag;
__shared__ unsigned int values [ BLOCK_DIM ];
稍后在代码内部,我需要定义一个数组,考虑到先前定义的共享内存超过了为块设置的共享内存限制。如果没有重复使用先前定义的共享内存的脏工作,我该怎么做?或者NVCC足够聪明,可以识别内核跟踪中的依赖关系,并在使用共享变量时解除分配? 我的设备是GeForce GTX 780(CC = 3.5)。
答案 0 :(得分:4)
在C / C ++中,无法释放静态定义的数组。
您可能希望动态分配最坏情况所需的共享内存量,如下所示。添加
extern __shared__ float foo[];
在内核函数中并启动内核函数
myKernel<<<numBlocks, numThreads, sh_mem_size>>> (...);
请记住,您可以通过使用指针来管理多个阵列。有关详细信息,请查看CUDA C Programming Guide。例如,引用指南
extern __shared__ float array[];
__device__ void func() // __device__ or __global__ function
{
short* array0 = (short*)array;
float* array1 = (float*)&array0[128];
int* array2 = (int*)&array1[64];
}
通过相同的概念,您可以动态更改正在处理的数组的大小。