2015-08-07 3 views
1

Постоянная память CUDA во всех опубликованных примерах кода представляется массивами, но я не мог найти это в качестве требования в документации. Так почему же cudaMemcpyToSymbol в следующем завершаться cudaErrorInvalidSymbol:cudaMemcpyToSymbol терпит неудачу, когда константа не является массивом

__constant__ int dev; 

int main() 
{ 
    int host = 2; 
    cudaError_t error = cudaMemcpyToSymbol(&dev, &host, sizeof(host)); 
    printf(cudaGetErrorString(error)); 
} 

в то время как следующий преуспевает?

__constant__ int dev[1]; 

int main() 
{ 
    int host = 2; 
    cudaError_t error = cudaMemcpyToSymbol(dev, &host, sizeof(host)); 
    printf(cudaGetErrorString(error)); 
} 

ответ

3

Символ устройства не похож на обычный переменный или адрес C-кода хоста-кода. Вы используете имя символа, является ли это «обычной» переменной устройства или массивом.

ли это вместо:

__constant__ int dev; 

int main() 
{ 
    int host = 2; 
    cudaError_t error = cudaMemcpyToSymbol(dev, &host, sizeof(host)); 
    printf(cudaGetErrorString(error)); 
} 

Все, что я делал, было удалить амперсанд перед dev

+0

Я нахожу это немного сбивает с толку, потому что документация отмечает первый параметр функции как 'сопзЬ пустота * 'Я делал то же самое, пока не нашел этот пост. Не могли бы вы подробнее рассказать о том, почему имя постоянной переменной в cuda относится к ее адресу? – BRabbit27

+1

Не уверен, что я могу многое изложить. Символ ** ** ** не совпадает с обычным адресом хоста, который адресуется в главном коде. Прежде всего, это местоположение устройства, а во-вторых, оно ссылается под капотом через поиск таблицы символов, а не на обычный механизм адресации указателей на C/C++. Функции 'cudaMemcpy ... Symbol' выполняют этот поиск таблицы символов устройства, а затем обнаруживают адрес устройства во время выполнения. Принятие адреса ('&') символа устройства в этом контексте неразумно. –

Смежные вопросы