一个示例展示了如何在CUDA中使用动态分配的、因此是extern的
__shared__
内存:使用动态共享内存分配两个不同向量。 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
的信息,请参见此链接。简而言之,这是因为在启动内核时将内存分配给线程块。也就是说,它对于您的所有代码都是extern
,因为它位于内核分配的线程块共享内存中。 - Evil Dog Pie