【发布时间】:2015-05-04 03:04:59
【问题描述】:
给出了一个如何在 CUDA 中使用动态分配和外部 shared 内存的示例:Use dynamic shared memory allocation for two different vectors
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];
}
但是当我必须手动将其分配给变量时,为什么还要使用 extern 动态分配的共享内存呢?
我认为以下解决方案没有任何缺点:
__device__ void func() // __device__ or __global__ function
{
__shared__ float array[MAXIMALLY_NEEDED_SIZE];
short* array0 = (short*)array;
float* array1 = (float*)&array0[128];
int* array2 = (int*)&array1[64];
}
显然,使用第一个解决方案,我可以节省一些共享内存。但这对我有什么帮助?
(我怀疑动态分配内存有充分的理由,但我没有看到,所以我可能缺乏理解。这就是我问的原因。)
【问题讨论】:
-
在第一个代码示例中,
extern关键字意味着array指的是在别处声明的共享内存。在第二个代码示例中,缺少extern关键字意味着此时正在声明所有对array的引用的共享内存。我相信你必须使用这两种声明:在一个地方你不使用extern,而在所有其他地方你使用你使用的共享内存。 -
另外,请参阅this link,了解为什么动态内存总是声明为
extern。简而言之,这是因为内存是在内核启动时分配给线程块的。 IE。它是extern对你所有的代码,因为它在内核分配的线程块共享内存中。