Как отлаживать ядра, вызываемые программой Java(jcuda)
Есть ли способ отладки функций cuda, вызываемых java (jcuda)?
Моя программа запускает это исключение:
Exception in thread "main" jcuda.CudaException:CUDA_ERROR_ILLEGAL_ADDRESS
at jcuda.driver.JCudaDriver.checkResult(JCudaDriver.java:288)
at jcuda.driver.JCudaDriver.cuCtxSynchronize(JCudaDriver.java:1852)
at CalculateurGPU.updateAndCompute(rGPUcalculator.java:129)
at Test.main(Test.java:90)
У меня очень длинный код cuda, и я не могу найти в нем никакой информации, чтобы помочь мне найти, где находится ошибка.
Другой вопрос: когда я нажимаю "JCudaDriver.java:288", у меня нет доступа к нему, он говорит "источник не найден". Как я могу прикрепить эти источники к моему проекту?
заранее спасибо
1 ответ
Лучший способ отладить мой исполняемый код JCuda - это везде помещать операторы printf. Очевидно, удалите их после того, как вы закончите, но вы должны начать где-нибудь.
Добавьте следующее в ваш код.java, который вызывает код вашего ядра.
JCudaDriver.cuCtxSetLimit (CUlimit.CU_LIMIT_PRINTF_FIFO_SIZE, 4096);
Затем внутри вашего ядра CUDA используйте printf(""); операторы в вашем коде ядра CUDA, чтобы определить, где существует проблема. Если бы у меня было предположение, это было бы из-за того, что вы получили доступ к части памяти, которой вы не должны быть.
Я бы также предложил обернуть printf с помощью if(gtid == 0){printf("hello\n");} в противном случае каждый поток будет пытаться выполнить printf.
РЕДАКТИРОВАТЬ:
Я хотел бы добавить, что на сайте JCuda был добавлен раздел отладки. Он предлагает использовать инструмент под названием "cuda-memcheck", чтобы помочь в отладке ваших приложений CUDA.