关于CUDA共享内存的奇怪行为

时间:2013-04-09 17:10:28

标签: cuda shared-memory

我正在使用GTX9800,它将可用的共享内存报告为16384字节

给定以下内核代码,使用T = int(4字节)

运行
template <typename T>
__global__ void foo(unsigned n, T *x)
{
    unsigned idx    = blockIdx.x * blockDim.x + threadIdx.x;
    __shared__ T sx[4096];
    x[idx] = 0;
}

我得到了预期的结果,即最初非零的数组x将用零填充。

但是,添加一行代码无效:

template <typename T>
__global__ void foo(unsigned n, T *x)
{
    unsigned idx    = blockIdx.x * blockDim.x + threadIdx.x;
    __shared__ T sx[4096];
    sx[0] = 0;
    x[idx] = 0;
}

现在,在调用内核后,x根本不包含任何零!

但是,如果我将sx的大小更改为&lt; = 4088,我会再次得到预期的结果。

怎么回事?我很困惑。

编辑:

更正了拼写错误:将16384“KB”更改为“字节”

1 个答案:

答案 0 :(得分:3)

计算能力1.x设备上共享内存的大小为每SM 16384 字节,而不是千字节。

此外,每个块将消耗16个字节用于内部目的(存储块索引等),以及内核参数的额外存储。

很遗憾,您不能在一个块中使用完整的16kb共享内存。

对于更高的计算能力,这些数据将存储在别处(常量存储器和特殊寄存器),因此整个共享存储器都可用。