我想在CUDA的共享内存中分配一个2d数组。 我知道要分配1d共享内存数组,你必须将每个块的大小作为参数传递给内核。
我也知道在共享内存中动态创建一个实际的2d数组是不可能的。
然而,我想知道如果其中一个维度已知,是否可以这样做。
GridControl
可以这样做吗?如果是这样,我如何传递第二维的大小?
答案 0 :(得分:1)
完全如此,首先使用已知维度(最高顺序 - 第一个方括号条目)是不可能的,因为编译器可能无法正确实现寻址。
但是,可以这样做只在编译时设置第二个参数。这是一个示例代码:
extern __shared__ int shared2Darray[][17] ;
__global__ void kernel(int* output)
{
shared2Darray[threadIdx.y][threadIdx.x] = threadIdx.x + 2*threadIdx.y ;
__syncthreads();
output [threadIdx.y * blockDim.x + threadIdx.x] = shared2Darray[threadIdx.y][threadIdx.x] ;
__syncthreads();
}
int main()
{
int* h_output, *d_output ;
cudaMalloc(&d_output, 16*16*sizeof(int));
kernel<<<1, dim3(16,16,1), 16*17*sizeof(int)>>> (d_output) ;
h_output = new int[16*16] ;
cudaMemcpy (h_output, d_output, 16*16*sizeof(int), cudaMemcpyDeviceToHost) ;
cudaDeviceReset();
for (int x = 0 ; x < 16 ; ++x)
{
for (int y = 0 ; y < 16 ; ++y)
{
if (h_output[y*16+x] != x+2*y)
printf ("ERROR\n");
}
}
printf ("DONE\n");
delete[] h_output ;
return 0 ;
}
数组的大小由三角形括号表示法中的共享内存参数定义。因此,通过将共享内存大小(以字节为单位)除以单个条目的字节大小来推断第二维的大小。