我正在使用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”更改为“字节”
答案 0 :(得分:3)
计算能力1.x设备上共享内存的大小为每SM 16384 字节,而不是千字节。
此外,每个块将消耗16个字节用于内部目的(存储块索引等),以及内核参数的额外存储。
很遗憾,您不能在一个块中使用完整的16kb共享内存。
对于更高的计算能力,这些数据将存储在别处(常量存储器和特殊寄存器),因此整个共享存储器都可用。