CUDA: отладка с помощью -deviceemu и gdb - PullRequest
1 голос
/ 27 октября 2010

Я написал приложение CUDA, в котором есть некоторые жестко закодированные параметры (через #define s). Казалось, все работает правильно, поэтому я попробовал некоторые другие параметры. Теперь программа больше не работает правильно.

Итак, я хочу отладить его. Я компилирую приложение с параметрами -deviceemu -g -O0, потому что я прочитал, что затем могу использовать gdb для его отладки. В gdb я устанавливаю точку останова при запуске ядра, используя break kernelstart.

Тем не менее, gdb запускается при запуске моего ядра CUDA, но я не могу пройти через него, потому что он не позволяет мне проверять вещи внутри ядра. Я думаю, что было бы лучше, если бы я дал вывод GDB:

Breakpoint 1, kernelstart (__cuda_0=0x100000, __cuda_1=0x101000, __cuda_2=0x102000, __cuda_3=0x102100) at cudatest.cu:287
(gdb) s
__device_stub__Z12kernelstartPjS_S_S_ (__par0=0x100000, __par1=0x101000, __par2=0x102000, __par3=0x102100) at /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c:7
7   /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c: No such file or directory.
    in /tmp/tmpxft_000003c4_00000000-1_cudatest.cudafe1.stub.c
(gdb) s
cudaLaunch<char> (entry=0x804a98d "U\211\345\203\354\030\213E\024\211D$\f\213E\020\211D$\b\213E\f\211D$\004\213E\b\211\004$\350\r\377\377\377\311\303U\211\345\203\354\070\307\004$\340 \005\b\350\345\341\377\377\243P!\005\b\307\004$x\234\004\b\350\b\001") at /usr/local/cuda/bin/../include/cuda_runtime.h:773
(gdb) s
(gdb) s
cudatest (__cuda_0=0x100000, __cuda_1=0x101000, __cuda_2=0x102000, __cuda_3=0x102100) at cudatest.cu:354
(gdb) s

После этого он возвращается к моей main процедуре.

Я знаю, что мои спецификации более чем расплывчаты, но кто-нибудь может догадаться, в чем проблема? Можно ли проверять ядра с помощью gdb?

Ответы [ 2 ]

7 голосов
/ 28 октября 2010
  1. Используйте cuda-gdb
  2. Компиляция: nvcc -g -G filename.cu
  3. Вызовите cuda-gdb на вашем a.out
  4. Вы можете установить точку останова внутри функции ядра как обычно.
  5. Запустите программу, и она должна остановиться внутри вашей функции ядра.
  6. Вы даже можете получить информацию о текущем потоке, который выполняется с помощью таких команд, как cuda thread. Существуют другие команды, такие как cuda block.
  7. Для переключения между потоками произнесите cuda thread (x,y,z)

Подробнее см. В последней версии документации cuda-gdb. Если вы используете последнюю версию набора инструментов cuda (т.е. 3.2 на сегодняшний день), убедитесь, что вы просматриваете последнюю версию документации (поскольку параметры сильно изменились).

А также убедитесь, что вы запускаете cuda-gdb из консоли (за пределами X11), поскольку вы останавливаете свой графический процессор для отладки.

Надеюсь, это поможет.

1 голос
/ 03 марта 2011

Компиляция с:

nvcc -g -G --keep

исправил эту проблему для меня. Это гарантирует, что все промежуточные файлы, сгенерированные во время компиляции, не будут удалены, чтобы отладчик мог их найти.

...