CUDA константа памяти недопустимый символ - PullRequest
0 голосов
/ 08 октября 2010
struct d_struct {
// stuff
};

__device__ __constant__ d_struct structs[SIZE];

Когда я звоню

cudaMemcpyToSymbol("structs", &h_struct, sizeof(d_struct), index * sizeof(d_struct), cudaMemcpyHostToDevice)

на d_struct "h_struct" в памяти хоста, я получаю invalid device symbol ошибку cuda. ​​

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Если вы можете предоставить более подробную информацию, это поможет, например, на какой платформе вы работаете и на какой версии хост-компилятора? Какая версия инструментария CUDA? Какое устройство?

А пока есть несколько предложений:

  • Убедитесь, что вы используете новейший инструментарий CUDA. В настоящее время версия 3.1 является текущей, а версия 3.2 - кандидатом на выпуск
  • Если вы работаете в Windows с помощью мастера CUDA, попробуйте переключиться на стандартные файлы правил, предоставляемые NVIDIA
  • Вы строите для правильной вычислительной способности? Просто убедитесь, что вы не компилируете для sm_13 и не запускаете на sm_12, например
  • Вы звоните cudaMemcpyToSymbol() из того же файла, где объявлена ​​ константа ? Если нет, то он все равно должен работать, поскольку поиск выполняется по имени, а не по символу, но убедитесь, что вы не объявили его как extern "C" и что вы звоните из C ++
  • Учитывая, что вы пропустили много кода, лучше проверить - d_struct не является шаблоном, не так ли?
0 голосов
/ 17 июля 2012

In Руководство по программированию CUDA v4.2 D.2.2.1, там написано, что

Определители __device__, __shared__ и __constant__ не разрешены для:

  • class, struct и union члены данных,
  • формальные параметры,
  • локальные переменные внутри функции, выполняемой на хосте.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...