有类似于我将要询问的问题,但我觉得它们都没有涉及到我真正寻找的核心。我现在拥有一个需要将两个数组定义到共享内存中的CUDA方法。现在,数组的大小由一个在程序执行开始后读入程序的变量给出。因此,我不能使用该变量来定义数组的大小,因为定义共享数组的大小需要在编译时知道值。我不想像这样做 __shared__ double arr1[1000]
,因为手动输入大小对我而言是无用的,因为它将根据输入而改变。同样地,我也不能使用 #define
来创建一个常量大小。
现在,我可以遵循类似于manual中的示例。
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];
}
但是这仍然存在一个问题。根据我所读的,定义共享数组总是使内存地址成为第一个元素。这意味着我需要使我的第二个数组向右移动第一个数组的大小,就像在这个例子中所做的那样。但是第一个数组的大小取决于用户输入。
另一个问题(Cuda Shared Memory array variable)有类似的问题,他们被告知创建一个单一的数组,作为两个数组的数组,并简单地调整索引以正确匹配数组。虽然这似乎可以实现我想要的效果,但看起来非常混乱。有没有办法解决这个问题,以便我仍然可以维护两个独立的数组,每个数组的大小都由用户输入定义?
char *my_cdata = (char*)&my_ddata[arr1_sz];
,它仍然有效吗? - zephyr