我正在编写使用共享内存的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打印消息。)
有没有人有任何想法?
答案 0 :(得分:5)
运营商sizeof
不返回int
,而是std::size_t
。
因此,当您将结果发送到sizeof(size_t) == 8
和sizeof(int) == 4
的系统上的printf并尝试使用%d
打印时,sizeof
的一个结果将被分成两半,即由连续的%d
说明符打印。零放置而不是第二个说明符是第一个sizeof运算符结果的上半部分。
要更正输出值,您可以将sizeof
结果明确地转换为int或尝试%ld
或%lld
说明符。
但我也无法使用不正确的第二个数组大小重现错误。