Постоянная память 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));
}
Я нахожу это немного сбивает с толку, потому что документация отмечает первый параметр функции как 'сопзЬ пустота * 'Я делал то же самое, пока не нашел этот пост. Не могли бы вы подробнее рассказать о том, почему имя постоянной переменной в cuda относится к ее адресу? – BRabbit27
Не уверен, что я могу многое изложить. Символ ** ** ** не совпадает с обычным адресом хоста, который адресуется в главном коде. Прежде всего, это местоположение устройства, а во-вторых, оно ссылается под капотом через поиск таблицы символов, а не на обычный механизм адресации указателей на C/C++. Функции 'cudaMemcpy ... Symbol' выполняют этот поиск таблицы символов устройства, а затем обнаруживают адрес устройства во время выполнения. Принятие адреса ('&') символа устройства в этом контексте неразумно. –