LINUX.ORG.RU

Отладка кода для CUDA

 , , , ,


0

1

Добрый день,

Не так давно я начал изучать программирование под CUDA, и столкнулся с проблемой отладки кода для устройства (не для хоста). Проблема состоит в том, что отладчик не входит в функцию, помеченную как __device__ или как __global__. В интернете я прочитал, что такое возможно если не сгенерировать отладочные символы: nvcc -g -G test.cu -o test Но всё равно даже cuda-gdb ругается на то, что отладочные символы не были загружены. У меня подозрение, что nvcc их не генерирует. Ну или генерирует, но тогда не читает.

Понимаю, что могу шокировать :) но у меня optimus ноут, работающий на bumblebee. Любое CUDA приложение через optirun выдаёт «правдивые» результаты. Например, я пытаюсь отладить приложение через optirun cuga-gdb test, и оно запускается, выполняется, но к сожалению отладчик не заходит внутрь CUDA кода.

В Windows такие же проблемы, и в VS 2010 я не могу зайти внутрь функций. Перерыв пол интернета, у меня сложилось впечатление, что либо люди отлаживают код при наличии 2-х видеокарт (у меня как бы Intel и NVIDIA 540m, но я думаю, что Intel не канает и мне нужны две видеокарты), либо в эмуляции (которой уже нет в 5-ой CUDA).

Подскажите, как у вас работает отладка, всё ли я делаю правильно или я что-то упустил. Ну и вообще будет супер, если кто имел опыт с CUDA разработкой при наличии ноута и Optimus видюхи.

Спасибо заранее.


Я забил на cuda-gdb. Он постоянно откалывает такие фокусы, а код с thrust им вообще не отладишь.

В ядрах можно вызывать printf, мне этого достаточно.

anonymous ()
Ответ на: комментарий от anonymous

P.S. Разрабатываю, кстати, на оптимусе.

anonymous ()

Отладка кода не нужна. Почитай что про нее пишут керниган и ричи. Я за ссю жизнь не пользовался отладчиком ни разу. А лет мне 23. Так что просто забей на отладчик.

anonymous ()
Ответ на: комментарий от anonymous

Спасибо, я понимаю, что он «чмо» :) Возможно я также с printf и поступлю. Потому как читал отзывы, что народ сидит и гипнотизирует код в поисках ошибок. А технически, вообще отладчик работает на optimus картах без дополнительного GPU? У вас получалось хоть с помощью студии, хоть CUDA 5 (Eclipse) зайти в код устройства?

Кстати, имеет ли смысл посмотреть в сторону OpenCL? Или всё равно и OpenCL отлаживать придётся через printf :)

Vest ()
Ответ на: комментарий от Vest

Кстати, имеет ли смысл посмотреть в сторону OpenCL?

Ну смотри, в моём институтике даже самые упоротые в прошлом фанаты OpenCL сейчас пишут на CUDA. Очевидцы говорят, что там объёмы кода в разы больше. Я даже не смотрел, поскольку нет templates => сразу в сад.

anonymous ()

$CUDATOOLKIT/doc/cuda-gdb.pdf не помогло?

d_a ★★★★★ ()
Ответ на: комментарий от d_a

нет. Есть ещё с пяток PDFок, объясняющих как дебажить. Максимум, о чем полезном они говорят - это о ключах -g -G, но меня интересует не теория из книг, а реально опыт человека, разрабатывающего на CUDA. Ещё раз повторюсь - отладчик ругается, что компилятор не создал символы для девайса, а в интернете пишут, что отладка возможна на двух GPU онли.

Vest ()
Ответ на: комментарий от anonymous

Я даже не смотрел, поскольку нет templates => сразу в сад.

В OpenCL 1.2 есть вроде.

tailgunner ★★★★★ ()
Ответ на: комментарий от Vest

что народ сидит и гипнотизирует код в поисках ошибок.

занимается reasoning на основе операционной семантики, да, программисты такое умеют.

dimon555 ★★★★★ ()

Я использую cuda-memcheck -l ./program <program arguments>.
Этого достаточно для устранения ошибок с кривым доступом к глобальной памяти.
Если непонятно почему алгоритм не работает, то пишу тестовый CPU код с 5 вложенными циклами for :-)

blinkenlichten ()
Ответ на: комментарий от blinkenlichten

Скажите, а сам отладчик пробовали запускать через cuda-gdb, или родной Eclipse? И я так понимаю, визуальной отладкой потоков вы не пользуетесь...

Vest ()
Ответ на: комментарий от blinkenlichten

Понятно. Видимо и у вас отладчик не работает. Что ж, кроме printf ничего хорошего не вижу, пока :)

Vest ()
Ответ на: комментарий от Vest

Да, наверное когда-то раз запустил, ничего не смог делать и забыл об этом.
Покамест самый действенный метод printf & cpu pseudo-cuda code, второе особенно помогает избежать ошибки «out of range shared or loca address»,
несколько раз такое возникало, это нечто более мерзкое чем «out of bounds in global memory», ибо не так очевидно где ошибка :)

blinkenlichten ()
Ответ на: комментарий от Vest

Вот собственно наброски некого враппера части CUDA-API, которые работают на CPU: cuda_wrapper.h, cuda_wrapper.cpp
Оно очень даже может быть глючное, использовал когда было мало опыта работы с cuda.

blinkenlichten ()
Ответ на: комментарий от blinkenlichten

Спасибо. Не стирайте, пожалуйста, думаю всем пригодятся.

Vest ()

Если кого интересует этот мёртвый тред, то попробуйте поставить CUDA 5.5 RC (тестировал пока под Windows). Там реализована отладка кода устройства с помощью CUDA Debugger и какого-то отдельного приложения типа Monitor.

Глупо звучит, но реально в функцию заходит и все watch работают :)

Vest ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.