Использование постоянной памяти CUDA

У меня есть проект cuda, содержащий следующие файлы

Заголовочный файл:

 Declarations.h

Основной файл:

 main.cpp:
    #include "Declarations.h"

И файл ядра:

Kernel.cu:
    #include "Declarations.h"

В main.cpp у меня есть float K1[3*3], который я хочу скопировать в постоянную память GPU. Для этого я объявил __constant__ float K1_d[3*3];в Declarations.h, а в main.cpp я сделал

checkCudaErrors( cudaMemcpyToSymbol(&K1_d, &K1, 9*sizeof(float)) );

При запуске кода я получил следующую ошибку: CUDA error at c:\users\xxx\test.cpp:241 code=13(cudaErrorInvalidSymbol) "cudaMemcpyToSymbol(&K1, &K1_inv, 9*sizeof(float))"

Я попытался скопировать одну переменную, например, я объявил в заголовочном файле

__constant__ float N;

И сделал:checkCudaErrors( cudaMemcpyToSymbol(&N, &K1_inv[0], sizeof(float)) );

Я получил такое же сообщение об ошибке макроса chechCudaErrors.

Как перенести переменные в постоянную память в CUDA?`


person Didon    schedule 23.04.2015    source источник
comment
Таких вопросов много и два варианта. Двойной связанный ответ предлагает самый простой вариант - измените свой код так, чтобы объявление __constant__ и использование cudaMemcpyToSymbol находились в одном файле (модуль компиляции/перевода). Вы также можете работать с отдельной компиляцией, связыванием и использованием extern, чтобы избежать этого (например, обсуждалось здесь ). Вы найдете другие вопросы и ответы об этом, если будете искать здесь, на SO.   -  person Robert Crovella    schedule 23.04.2015