CUDA静态共享内存释放

时间:2013-09-17 08:00:40

标签: cuda gpgpu

有没有办法解除分配在同一个CUDA内核中优先分配的共享内存? 例如,在内核中我已经定义了

__shared__ unsigned char flag;
__shared__ unsigned int values [ BLOCK_DIM ];

稍后在代码内部,我需要定义一个数组,考虑到先前定义的共享内存超过了为块设置的共享内存限制。如果没有重复使用先前定义的共享内存的脏工作,我该怎么做?或者NVCC足够聪明,可以识别内核跟踪中的依赖关系,并在使用共享变量时解除分配? 我的设备是GeForce GTX 780(CC = 3.5)。

1 个答案:

答案 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];
}

通过相同的概念,您可以动态更改正在处理的数组的大小。