无法分配CUDA共享内存

Yos*_*oto 1 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));

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

有没有人有任何想法?

Ste*_*ven 5

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

要更正输出值,可以显式地将sizeof结果转换为int或try %ld%lld说明符.

但我也无法重现错误的第二个数组大小的错误.