【问题标题】:Static matrix passed to cudaMemCpyToSymbol传递给 cudaMemCpyToSymbol 的静态矩阵
【发布时间】:2017-09-17 07:41:30
【问题描述】:

我想将常量内存与静态分配的矩阵一起使用。我将常量矩阵声明如下:

 #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

【问题讨论】:

  • 您的链接已失效。另外,请发布您的代码的minimal, complete and verifiable example。就目前而言,很难解释为什么您的结果可能与您的预期不同。
  • 我添加了源代码,如果我声明并初始化我在主机代码中创建的常量内存,它会完美运行,所以问题出在当我将 h_M 矩阵传递给它时失败的 cudaMemCpy。
  • cudaMemcpyToSymbol 的链接失效

标签: pointers matrix cuda


【解决方案1】:

像这样:

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 的具体定义。在其他稍有不同的情况下,这可能不起作用。

【讨论】:

  • 对不起,这只是剪切和粘贴的错误原因...我解决了我的问题,很快我会发布答案!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2018-01-27
    • 2019-08-24
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多