Это чаще всего связано с тем, что ядро не запускается на устройстве. Убедитесь, что вы проверяете все коды ошибок (и попробуйте добавить cudaDeviceSynchronize после вызова ядра и также проверьте его код ошибки). Общая ошибка заключается в компиляции ядра для неправильной версии SM. Также попробуйте распечатать доступные устройства CUDA из вашего приложения.
Обратите внимание, что у вас также есть проблема с настройкой - например, убедитесь, что драйвер Nouveau должным образом занесен в черный список. В некоторых случаях X может использовать ваше устройство, даже если дисплей не подключен - попробуйте явно установить PCI ID в xorg.conf.
Чтобы указать адаптер, PCI ID:
Получить список идентификаторов устройств вы, выполнив "Утилита lspci | Grep Nvi" из вашей оболочки. Это то, что я получаю в моей системе:
03:00.0 VGA compatible controller: NVIDIA Corporation Device 103b (rev a1)
03:00.1 Audio device: NVIDIA Corporation Device 0e1a (rev a1)
05:00.0 VGA compatible controller: NVIDIA Corporation G98 [Quadro NVS 295] (rev a1)
Чтобы использовать Quadro для отображения добавить BusID к моему /etc/X11/xorg.conf. Это то, что я имею в моей системе:
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 280"
BusID "PCI:5:0:0"
#BusID "PCI:3:0:0"
EndSection
Обратите внимание, что Струны Identifier и BoardName являются просто UI этикетки - все, что нужно сделать, чтобы переключаться между устройствами с различными версиями SM является отключение рабочего стола (для Ubuntu GNOME - остановка службы Lightdm), отправьте комментарий, запустите DM (запуск службы Lightdm).
Также убедитесь, что у вас есть только один раздел устройств в вашем xorg.conf
Вы используете cuda-gdb? Или Nsight EE? Вы компилируете с помощью переключателя -G? Попробуйте положить точку останова при входе в ядро (т.выдайте команду 'break mykernel' или независимо от вашего имени ядра), а затем посмотрите, удалили ли после этой точки останова точки останова в коде ядра. В руководстве cuda-gdb также есть примеры упражнений, которые вы можете попробовать. –
Использование cuda-gdb как в настройках по умолчанию для Nsight. Я также попытался отлаживать его на терминале напрямую с cuda-gdb, но все еще та же проблема. – erogol
Я не могу сказать из вашего ответа, если вы попробовали мое предложение. Пробовали ли вы установить точку останова на имя ядра, затем запустить до тех пор, пока эта точка останова не будет удалена, а затем установите точки останова в ядре? Я бы рекомендовал сделать это на графическом процессоре, который не управляет дисплеем, и настроить этот графический процессор так, чтобы X его не использовал (т. Е. Он не отображается в вашем файле 'xorg.conf'). –