Pointers 传递给CUDAMEMCPITOSYMBOL的静态矩阵
我想使用静态分配矩阵的常量内存。我声明常数矩阵如下:Pointers 传递给CUDAMEMCPITOSYMBOL的静态矩阵,pointers,matrix,cuda,Pointers,Matrix,Cuda,我想使用静态分配矩阵的常量内存。我声明常数矩阵如下: #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 },
#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
中的所有值均为零
如果您需要完整的源代码,请访问以下链接:如下所示:
cudaMemcpyToSymbol(M, h_M, MASK_WIDTH*MASK_WIDTH*sizeof(float));
你的东西坏了:
cudaMemcpyToSymbol(M, h_M, sizeof(sizeMask_Width));
sizeof(sizeMask\u Width)
询问编译器“称为sizeMask\u Width
的变量的大小是多少?”这是一个int
变量,因此答案是4
。因此该调用只传输4个字节。您应该这样做:
cudaMemcpyToSymbol(M, h_M, sizeMask_Width);
因为sizeMask\u Width
与MASK\u Width*MASK\u Width*sizeof(float)
相同,后者是需要传输的实际正确字节数
我认为在你的例子中,sizeof(h_M)
也会起作用,但对于未来的读者来说,这取决于这里对h_M
的具体定义。这在其他稍有不同的情况下可能不起作用。像这样:
cudaMemcpyToSymbol(M, h_M, MASK_WIDTH*MASK_WIDTH*sizeof(float));
你的东西坏了:
cudaMemcpyToSymbol(M, h_M, sizeof(sizeMask_Width));
sizeof(sizeMask\u Width)
询问编译器“名为sizeMask\u Width
的变量的大小是多少?”?这是一个int
变量,因此答案是4
。因此,该调用只能传输4个字节。你应该这样做:
cudaMemcpyToSymbol(M, h_M, sizeMask_Width);
因为sizeMask\u Width
与MASK\u Width*MASK\u Width*sizeof(float)
相同,后者是需要传输的实际正确字节数
我认为在你的例子中,sizeof(h\M)
也会起作用,但对于未来的读者来说,这取决于这里对h\M
的具体定义。这在其他稍有不同的情况下可能不起作用。问题[已解决]
问题是,我认为这是一个矩阵布局,而不是原始的主要布局。
见下图:
M数组的大小为:MAX_MASK_WIDTH*MAX_MASK_WIDTH,而h_M数组的大小为:MASK_WIDTH*MASK_WIDTH。因此,当我调用cudaMemCpyToSymbol函数时,它会将原始主布局顺序中的h_M矩阵复制到M矩阵中。
人们可以用不同的方法解决这个问题:
M[i*屏蔽宽度+j]
到内核代码中M[i*屏蔽宽度+j]
到内核代码中你的链接已断开。另外,请张贴您的代码。就目前而言,很难解释为什么您的结果可能与预期不符。我添加了源代码,如果我像在宿主代码中那样声明并初始化常量内存,它将非常有效,因此,问题出在cudaMemCpy中,当我将h_M矩阵传递给它时,它会失败。指向
cudaMemcpyToSymbol
的链接无效。您的链接已失效。另外,请张贴您的代码。就目前而言,很难解释为什么您的结果可能与预期不符。我添加了源代码,如果我像在宿主代码中那样声明并初始化常量内存,它将非常有效,因此,问题出在cudaMemCpy中,当我将h_M矩阵传递给它时,它失败了。指向cudaMemcpyToSymbol
的链接不起作用,这只是剪切和粘贴的错误原因。。。我解决了我的问题,很快我会发布答案!抱歉,这只是剪切和粘贴的错误原因。。。我解决了我的问题,很快我会发布答案!