Как часть более крупного проекта, я столкнулся с странной последовательной ошибкой, с которой я не могу оторваться, но является архетипической ошибкой "черного ящика"; при работе с cuda-gdb python -m pycuda.debug prog.py -args
он работает нормально, но медленно. Если я сброшу pycuda.debug, он сломается. Последовательно, в точно такой же точке в многоядерном исполнении.
Объяснить; У меня есть (в настоящее время три) ядра, используемые в разных сетках и блочных устройствах для решения "срезов" большей проблемы оптимизации. Эти строго говоря должны либо работать, либо нет, поскольку самим функциям ничего не сказано, кроме "здесь некоторые дополнительные данные" и кроме содержимого данных, не знают ничего такого, как номер итерации, независимо от того, разделены ли их входные данные или нет, и до этой точки они прекрасно работают.
В принципе, я не вижу, что происходит без pycuda.debug, отображая символы отладки в GDB, но я также не вижу проблемы с pycuda.debug.
Что делает pycuda на самом деле, я знаю, что искать в моем коде ядра?
Почти ничего. Он в основном устанавливает флаги компилятора в модуле pycuda.driver, чтобы код CUDA скомпилировался с необходимыми отладочными символами и собирался в соответствии с требованиями CUDA-gdb. Остальное - крошечная обертка, которая красиво инкапсулирует библиотеки pycuda, так что все работает. Все это около 20 строк python, вы можете увидеть код в исходном дистрибутиве, если хотите.
Ключевым моментом здесь является то, что код, выполняемый в отладчике, разливает все: от регистра и общей памяти до локальной памяти, так что драйвер может считывать состояние локальной программы. Поэтому, если у вас есть код, который выполняется при построении для отладчика и не работает при построении в обычном режиме, обычно это означает, что существует переполнение буфера разделяемой памяти или ошибка указателя, которая вызывает эквивалент графического процессора segfault.