2013-05-11 84 views
4

我在图像处理中有几个应用程序文件。由于图像的行数和列数不会在更改图像处理算法时发生变化,因此我试图将这些值放入常量内存中。我的应用程序是这样的:复制到CUDA常量内存时无效的设备符号

Imageproc.cuh

... 
... 
__constant__ int c_rows; 
__constant__ int c_cols; 

#ifdef __cplusplus 
    extern "C" 
    { 
#endif 
    ... 
    ... 
#ifdef __cplusplus 
    } 
#endif 

Imageproc.cu

... 
... 

int algorithm(float *a, const int rows, const int cols){ 
    ... 
    ... 
    checkCudaError(cudaMemcpyToSymbol(&c_rows, &rows, sizeof(int))); 
    checkCudaError(cudaMemcpyToSymbol(&c_cols, &cols, sizeof(int))); 

    dim3 block(T, T); 
    dim3 grid(cols/T+1, rows/T+1); 

    kernel<<<grid, block>>>(...); 
    ... 
    ... 

} 

它编译良好,但试图运行该程序时,我得到invalid device symbol cudaMemcpyToSymbol(&c_rows, &rows, sizeof(int))

我不能将这些变量放在常量内存中,或者我错过了什么?

+0

也许我失去联系的CUDA这些天,但我认为,那'cudaMemcpyToSymbol '需要一个字符串作为目标符号名称? – 2013-05-11 15:34:53

+1

@PaulR:在CUDA 4中弃用并在CUDA 5中删除。现在,符号直接传递(这是因为CUDA在内部使用适当的ELF标头和链接程序而起作用)。 – talonmies 2013-05-11 15:39:29

+0

@talonmies:谢谢你确认我没有联系。 ;-) – 2013-05-11 17:46:46

回答

8

如果你的符号声明如下:

__constant__ int c_rows; 

然后cudaMemcpyToSymbol正确的调用只是

int rows = 5; 
cudaMemcpyToSymbol(c_rows, &rows, sizeof(int)));