Что на самом деле делает pycuda.debug?

1

Как часть более крупного проекта, я столкнулся с странной последовательной ошибкой, с которой я не могу оторваться, но является архетипической ошибкой "черного ящика"; при работе с cuda-gdb python -m pycuda.debug prog.py -args он работает нормально, но медленно. Если я сброшу pycuda.debug, он сломается. Последовательно, в точно такой же точке в многоядерном исполнении.

Объяснить; У меня есть (в настоящее время три) ядра, используемые в разных сетках и блочных устройствах для решения "срезов" большей проблемы оптимизации. Эти строго говоря должны либо работать, либо нет, поскольку самим функциям ничего не сказано, кроме "здесь некоторые дополнительные данные" и кроме содержимого данных, не знают ничего такого, как номер итерации, независимо от того, разделены ли их входные данные или нет, и до этой точки они прекрасно работают.

В принципе, я не вижу, что происходит без pycuda.debug, отображая символы отладки в GDB, но я также не вижу проблемы с pycuda.debug.

Что делает pycuda на самом деле, я знаю, что искать в моем коде ядра?

Теги:
debugging
cuda
pycuda
gpgpu

1 ответ

1
Лучший ответ

Почти ничего. Он в основном устанавливает флаги компилятора в модуле pycuda.driver, чтобы код CUDA скомпилировался с необходимыми отладочными символами и собирался в соответствии с требованиями CUDA-gdb. Остальное - крошечная обертка, которая красиво инкапсулирует библиотеки pycuda, так что все работает. Все это около 20 строк python, вы можете увидеть код в исходном дистрибутиве, если хотите.

Ключевым моментом здесь является то, что код, выполняемый в отладчике, разливает все: от регистра и общей памяти до локальной памяти, так что драйвер может считывать состояние локальной программы. Поэтому, если у вас есть код, который выполняется при построении для отладчика и не работает при построении в обычном режиме, обычно это означает, что существует переполнение буфера разделяемой памяти или ошибка указателя, которая вызывает эквивалент графического процессора segfault.

  • 0
    Как ни странно, в данный момент я не использую общую память! (Я был сожжен преждевременной оптимизацией раньше), но странно то, что в этой конкретной итерации данных нет ничего особенного по сравнению с другими тысячами или почти одинаковыми выполнениями ядра. В любом случае нужно больше расследований, спасибо.
  • 0
    @ Andrew Bolster: Если вы хотите где-нибудь сделать код доступным, я могу попробовать его протестировать. В настоящее время у меня есть ряд карт на основе GT200 и Fermi.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню