CUDA动态共享内存分配2d数组

时间:2016-04-26 18:19:53

标签: c++ arrays cuda

我想在CUDA的共享内存中分配一个2d数组。 我知道要分配1d共享内存数组,你必须将每个块的大小作为参数传递给内核。

我也知道在共享内存中动态创建一个实际的2d数组是不可能的。

然而,我想知道如果其中一个维度已知,是否可以这样做。

GridControl

可以这样做吗?如果是这样,我如何传递第二维的大小?

1 个答案:

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

数组的大小由三角形括号表示法中的共享内存参数定义。因此,通过将共享内存大小(以字节为单位)除以单个条目的字节大小来推断第二维的大小。