Динамическое распределение памяти внутри __device / global__ ядра CUDA - PullRequest
3 голосов
/ 04 августа 2011

Согласно руководству по программированию CUDA , стр. 122, можно динамически распределять память внутри функции device / global , если мы используем вычислительную архитектуру 2.x .

Моя проблема в том, что когда я пытаюсь это сделать, я получаю сообщение командной строки:

Команда "некоторая команда" -gencode = arch = compute_10, code = \ "sm_10, compute_10 \" -gencode = arch = compute_20, code = \ "sm_20, compute_20 \" etc ...

За этим следует ошибка, из-за которой нельзя вызвать функцию хоста (malloc) из функции device / global .

Приведенное выше сообщение показывает, что он пытается скомпилировать в соответствии с compute 1.x. Я использую VS2010, и для параметра «Генерация кода» установлено значение «compute_20, sm_20» на странице свойств «CUDA C / C ++», поэтому я не уверен, почему он все еще пытается скомпилировать при вычислении 1.x. Я определенно использую карту, которая поддерживает 2.x. Есть идеи?

1 Ответ

3 голосов
/ 04 августа 2011

Вы должны увидеть командную строку nvcc в выводе. На самом деле, я думаю, что этот бит вы вставили со всем -генкодом / и т.д. в нем является вашей командной строкой. Следовательно, это также является доказательством того, что вы компилируете код для sm_10 и sm_20, поэтому вы получаете сообщение об ошибке при вызове malloc.

Вы можете подтвердить, заключив вызов malloc в #if __CUDA_ARCH__ >= 200 и посмотреть, исчезнет ли ошибка.

Я предполагаю, что вы устанавливаете свойства для компиляции для sm_20 в свойствах по умолчанию для файлов .cu в вашем проекте, но после вы добавили файл .cu в проект. Когда файл был добавлен в проект, значения по умолчанию, вероятно, были установлены на sm_10 и sm_20 (это значение по умолчанию для файла .rules). Если вы щелкнете правой кнопкой мыши по самому файлу, вы увидите, что установлен флажок sm_20. Просто догадка.

...