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和h_M矩阵(在本例中)都是一维的 与最初不同维度的向量,但使用
    M[i*屏蔽宽度+j]
    到内核代码中
  • 问题[已解决] 问题是,我认为这是一个矩阵布局,而不是原始的主要布局。 见下图:

    M数组的大小为:MAX_MASK_WIDTH*MAX_MASK_WIDTH,而h_M数组的大小为:MASK_WIDTH*MASK_WIDTH。因此,当我调用cudaMemCpyToSymbol函数时,它会将原始主布局顺序中的h_M矩阵复制到M矩阵中。 人们可以用不同的方法解决这个问题:

  • 声明相同维度的矩阵
  • 声明M和h_M矩阵(在本例中)都是一维的 与最初不同维度的向量,但使用
    M[i*屏蔽宽度+j]
    到内核代码中

  • 你的链接已断开。另外,请张贴您的代码。就目前而言,很难解释为什么您的结果可能与预期不符。我添加了源代码,如果我像在宿主代码中那样声明并初始化常量内存,它将非常有效,因此,问题出在cudaMemCpy中,当我将h_M矩阵传递给它时,它会失败。指向
    cudaMemcpyToSymbol
    的链接无效。您的链接已失效。另外,请张贴您的代码。就目前而言,很难解释为什么您的结果可能与预期不符。我添加了源代码,如果我像在宿主代码中那样声明并初始化常量内存,它将非常有效,因此,问题出在cudaMemCpy中,当我将h_M矩阵传递给它时,它失败了。指向
    cudaMemcpyToSymbol
    的链接不起作用,这只是剪切和粘贴的错误原因。。。我解决了我的问题,很快我会发布答案!抱歉,这只是剪切和粘贴的错误原因。。。我解决了我的问题,很快我会发布答案!