无法分配CUDA共享内存

时间:2014-02-14 03:46:53

标签: memory cuda

我正在编写使用共享内存的CUDA内核代码,但无法声明 共享内存变量。

当我尝试静态分配多个共享内存时会发生这种情况。

__global__
void kernel_func(float *global_matrix) {
    __shared__ float sm_mat1[4][4];
    __shared__ float sm_mat2[6][6];
    __shared__ float sm_mat3[3][3][3];

    if ( blockIdx.x==0 && blockIdx.y==0 && theradIdx.x==0 && threadIdx.y==0 )
        printf("sizeof(sm_mat1)=%d, sizeof(sm_mat2)=%d, sizeof(sm_mat3)=%d.\n",
                    sizeof(sm_mat1), sizeof(sm_mat2), sizeof(sm_mat3));

    ...
}

但是,当我执行时,它会输出如下的奇怪信息。     sizeof(sm_mat1)= 64,sizeof(sm_mat2)= 0,sizeof(sm_mat3)= 128

似乎没有分配第二矩阵,第三矩阵被分配为第二。 实际上,访问第二个矩阵不能正常工作。 (无法读/写数据)。

我正在使用GTX 480和cuda2.0。 (我正在使用编译选项-arch = sm_20打印消息。)

有没有人有任何想法?

1 个答案:

答案 0 :(得分:5)

运营商sizeof不返回int,而是std::size_t。 因此,当您将结果发送到sizeof(size_t) == 8sizeof(int) == 4的系统上的printf并尝试使用%d打印时,sizeof的一个结果将被分成两半,即由连续的%d说明符打印。零放置而不是第二个说明符是第一个sizeof运算符结果的上半部分。

要更正输出值,您可以将sizeof结果明确地转换为int或尝试%ld%lld说明符。

但我也无法使用不正确的第二个数组大小重现错误。