2013-04-28 3 views
1

У меня есть рабочий стол с двумя прилагаемыми картами cuda, и я пытаюсь отлаживать код cuda, просто помещая некоторые точки останова в строки ядра. Однако отладчик показывает только вход и конечную скобку функции ядра. Это не дает возможности наступить на тело функции ядра. Он просто игнорирует. Я прочитал, что для отладки ядра GPU вам нужно запустить код на графическую карту, не используемую системой в настоящее время. На этой основе я также попытался запустить отладчик, установив мой активный GPU на мой второй (не используемый системой), но все же отладчик игнорирует тело ядра. Как я могу решить эту проблему, имея отладчик CUDA? В противном случае так сложно кодировать сложные ядра cuda.Отладка кода ядра cuda на Ubuntu Nsight?

Может быть связано с текущей версией драйвера, которая сейчас находится на 304, на карте с шмелем optimus?

+0

Вы используете cuda-gdb? Или Nsight EE? Вы компилируете с помощью переключателя -G? Попробуйте положить точку останова при входе в ядро ​​(т.выдайте команду 'break mykernel' или независимо от вашего имени ядра), а затем посмотрите, удалили ли после этой точки останова точки останова в коде ядра. В руководстве cuda-gdb также есть примеры упражнений, которые вы можете попробовать. –

+0

Использование cuda-gdb как в настройках по умолчанию для Nsight. Я также попытался отлаживать его на терминале напрямую с cuda-gdb, но все еще та же проблема. – erogol

+0

Я не могу сказать из вашего ответа, если вы попробовали мое предложение. Пробовали ли вы установить точку останова на имя ядра, затем запустить до тех пор, пока эта точка останова не будет удалена, а затем установите точки останова в ядре? Я бы рекомендовал сделать это на графическом процессоре, который не управляет дисплеем, и настроить этот графический процессор так, чтобы X его не использовал (т. Е. Он не отображается в вашем файле 'xorg.conf'). –

ответ

1

это совершенно проблема с драйвером. Я обновился с 310.4 до 319.17, и теперь все в порядке.

+0

У меня такая же проблема, как и вы. Мой драйвер 304.108 и не может установить точку останова в коде устройства. Означает ли это, что ядро ​​не работает на gpu? или это проблема, связанная с отладчиком CUDA? – Madhatter

0

Это чаще всего связано с тем, что ядро ​​не запускается на устройстве. Убедитесь, что вы проверяете все коды ошибок (и попробуйте добавить cudaDeviceSynchronize после вызова ядра и также проверьте его код ошибки). Общая ошибка заключается в компиляции ядра для неправильной версии SM. Также попробуйте распечатать доступные устройства CUDA из вашего приложения.

Обратите внимание, что у вас также есть проблема с настройкой - например, убедитесь, что драйвер Nouveau должным образом занесен в черный список. В некоторых случаях X может использовать ваше устройство, даже если дисплей не подключен - попробуйте явно установить PCI ID в xorg.conf.

Чтобы указать адаптер, PCI ID:

  1. Получить список идентификаторов устройств вы, выполнив "Утилита 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) 
    
  2. Чтобы использовать 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

+0

как я могу сделать вторую половину предложений – erogol

+0

Я обновил свой ответ на указание PCI ID для X. – Eugene

0

Для того, чтобы ошибки отладки, которые могут возникнуть при запуске ядра можно определить следующим образом:

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); } 
__host__ inline void gpuAssert(cudaError_t code, char *file, int line, bool abort) 
{ 
    if (code != cudaSuccess) 
    { 
     fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line); 
     if (abort) exit(code); 
    } 
} 

и звоните ядра, как это:

kernel<<<...>>>(...); 
gpuErrchk(cudaPeekAtLastError()); 
gpuErrchk(cudaDeviceSynchronize()); 

в принципе вы можете обернуть каждую функцию с CUDA вызовов gpuErrchk. Надеюсь, что помогло немного.

+0

Это настоящий способ ... – erogol

Смежные вопросы