我想使用静态内存和静态分配的矩阵。我声明了常数矩阵如下:
#define MASK_WIDTH 5
#define MAX_MASK_WIDTH 10
__constant__ float M[MAX_MASK_WIDTH][MAX_MASK_WIDTH];
在main()
函数中有一个静态分配的矩阵,如下所示:
float h_M[MASK_WIDTH][MASK_WIDTH] = {
{ 1, 2, 3, 2, 1 },
{ 2, 3, 4, 3, 2 },
{ 3, 4, 5, 4, 3 },
{ 2, 3, 4, 3, 2 },
{ 1, 2, 3, 2, 1 }
};
我必须将h_M
矩阵传递给跟随函数:
cudaMemcpyToSymbol(M, h_M, sizeof(h_M));
中定义
我怎样才能正确地做到这一点?考虑到我必须使用特定值初始化矩阵,所以我认为我不能声明它并动态分配。
问题是cudaMemCopytosymbol
在复制M
中的所有值都为零后无效。
如果您需要完整的源代码,请访问以下链接:cached_convolution_2D_basic
答案 0 :(得分:2)
像这样:
cudaMemcpyToSymbol(M, h_M, MASK_WIDTH*MASK_WIDTH*sizeof(float));
你所拥有的是破碎的:
cudaMemcpyToSymbol(M, h_M, sizeof(sizeMask_Width));
sizeof(sizeMask_Width)
正在询问编译器“变量的大小是什么sizeMask_Width
?这是一个int
变量,所以答案是4
。所以这个调用会只传输4个字节。你应该这样做:
cudaMemcpyToSymbol(M, h_M, sizeMask_Width);
因为sizeMask_Width
与MASK_WIDTH*MASK_WIDTH*sizeof(float)
相同,这是您需要传输的实际正确字节数。
我认为在你的情况下sizeof(h_M)
也会起作用,但对于未来的读者来说,这取决于h_M
的具体定义。这可能不适用于其他略有不同的情况。
答案 1 :(得分:0)