在不同长度的共享内存中动态分配数组

时间:2013-06-25 14:23:49

标签: cuda

我必须在运行时在共享内存中分配2个数组,长度不同,如下所示:

__global__ kernel()
{
__shared__ int A[blockDim.x*6]; 
__shared__ int B[8][blockDim.x*3];
}

我如何确保在启动像kernel <<<b,t,s>>>这样的内核时,两者都会有不同的长度?

1 个答案:

答案 0 :(得分:2)

如果块大小是常量,则可以将其声明为常量并将其用于静态分配:

const int BLOCK_DIM_X = 512;
__global__ kernel()
{
    __shared__ int A[BLOCK_DIM_X*6]; 
    __shared__ int B[8][BLOCK_DIM_X*3];
}
kernel<<<grid, BLOCK_DIM_X>>>();

如果它不是常数,则可以使用动态共享内存分配:

__global__ kernel()
{
    extern __shared__ int smem[];
    int* A = smem;
    int* B = A + blockDim.x*6;
    // B[i][j] will be
    int t = B[i * (blockDim.x*3) + j];
}
size_t smem_size = (block.x*6 + 8 * block.x*3) * sizeof(int);
kernel<<<grid, block, smem_size>>>();