2017-04-20 74 views
0

我想使用静态分配矩阵的常量内存。我宣布常数矩阵如下:静态矩阵传递给cudaMemCpyToSymbol

#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

+1

您的链接已删除。另外,请发布代码的[最小,完整且可验证的示例](https://stackoverflow.com/help/mcve)。就目前而言,很难理解为什么你的结果可能与你期望的结果不符。 –

+0

我添加了源代码,如果我在宿主代码中声明并初始化常量内存,它会很好地工作,所以问题出在cudaMemCpy中,当我将它传递给h_M矩阵时会失败。 – sgira

+0

“cudaMemcpyToSymbol”链接不起作用 – Toby

回答

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。这可能不适用于其他稍有不同的情况。

+0

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

0

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

M个阵列具有尺寸:MAX_MASK_WIDTH * MAX_MASK_WIDTH,代替h_M阵列具有尺寸:MASK_WIDTH * MASK_WIDTH。因此,当我调用cudaMemCpyToSymbol函数时,它会将原始主布局顺序中的h_M矩阵复制到M矩阵中。 一个可以解决以不同的方式问题:声明相同的尺寸

  • 声明M和h_M matricies(在这种情况下),为一维 矢量具有不同尺寸的,因为它是最初的矩阵

    1. ,但使用 M[i * MASK_WIDTH + j]进入内核代码。