Динамическое выделение памяти внутри __device / global__ Ядро CUDA

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

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

Команда «some command» -gencode = arch = compute_10, code = \ “sm_10, compute_10 \” -gencode = arch = compute_20, code = \ “sm_20, compute_20 \” и т. Д. …

За этим следует сообщение о том, что вы не можете вызвать функцию хоста (malloc) из функции device / global .

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

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

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

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