传递给cudaMemCpyToSymbol的静态矩阵

时间:2017-04-20 15:12:01

标签: 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 },
    { 3, 4, 5, 4, 3 },
    { 2, 3, 4, 3, 2 },
    { 1, 2, 3, 2, 1 }
};

我必须将h_M矩阵传递给跟随函数:

    cudaMemcpyToSymbol(M, h_M, sizeof(h_M));

cudaMemCpyToSymbol

中定义

我怎样才能正确地做到这一点?考虑到我必须使用特定值初始化矩阵,所以我认为我不能声明它并动态分配。 问题是cudaMemCopytosymbol在复制M中的所有值都为零后无效。

如果您需要完整的源代码,请访问以下链接:cached_convolution_2D_basic

2 个答案:

答案 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_WidthMASK_WIDTH*MASK_WIDTH*sizeof(float)相同,这是您需要传输的实际正确字节数。

我认为在你的情况下sizeof(h_M)也会起作用,但对于未来的读者来说,这取决于h_M的具体定义。这可能不适用于其他略有不同的情况。

答案 1 :(得分:0)

问题[已解决] 问题是我认为是矩阵布局而不是原始主要布局。 见下图: enter image description here

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

  1. 声明相同尺寸的矩阵
  2. 将M和h_M matricies(在本例中)声明为一维的 最初使用不同尺寸的矢量,但使用     M[i * MASK_WIDTH + j]进入内核代码。