2013-05-11 2 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 'нужна строка для имени символа назначения? –

+1

@PaulR: Это было устарело в CUDA 4 и удалено в CUDA 5. Теперь символ передается напрямую (что работает, потому что CUDA использует собственные заголовки ELF и компоновщик внутри). – talonmies

+0

@talonmies: спасибо, что подтвердили, что я вне пределов досягаемости. ;-) –

ответ

8

Если символ объявлен как это:

__constant__ int c_rows; 

тогда правильный вызов cudaMemcpyToSymbol просто

int rows = 5; 
cudaMemcpyToSymbol(c_rows, &rows, sizeof(int))); 
Смежные вопросы