Что на самом деле делает pycuda.debug? - PullRequest
1 голос
/ 25 апреля 2011

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

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

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

Что на самом деле делает Pycuda, чтобы я знал, что искать в коде моего ядра?

1 Ответ

1 голос
/ 25 апреля 2011

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

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

...