Printf внутри CUDA __global__ функция
В настоящее время я пишу умножение матрицы на GPU и хотел бы отлаживать мой код, но поскольку я не могу использовать printf внутри функции устройства, есть ли что-то еще, что я могу сделать, чтобы увидеть, что происходит внутри этой функции. Это моя текущая функция:
__global__ void MatrixMulKernel(Matrix Ad, Matrix Bd, Matrix Xd){
int tx = threadIdx.x;
int ty = threadIdx.y;
int bx = blockIdx.x;
int by = blockIdx.y;
float sum = 0;
for( int k = 0; k < Ad.width ; ++k){
float Melement = Ad.elements[ty * Ad.width + k];
float Nelement = Bd.elements[k * Bd.width + tx];
sum += Melement * Nelement;
}
Xd.elements[ty * Xd.width + tx] = sum;
}
Мне бы хотелось знать, есть ли Ad и Bd то, что я думаю, и посмотреть, действительно ли эта функция вызывается.
Ответы
Ответ 1
ИЗМЕНИТЬ
Чтобы не вводить в заблуждение людей, как указывает М. Тиббитс, printf доступен на любом графическом процессоре с возможностью вычисления 2.0 и выше.
КОНЕЦ РЕДАКТИРОВАНИЯ
У вас есть выбор:
- Используйте отладчик GPU, т.е. cuda-gdb для Linux или Nexus в Windows.
- Используйте cuprintf, который доступен для зарегистрированных разработчиков (зарегистрируйтесь здесь)
- Вручную скопируйте данные, которые вы хотите просмотреть, затем удалите этот буфер на хосте после завершения ядра (не забудьте синхронизировать)
Что касается фрагмента кода:
- Рассмотрите возможность передачи структур
Matrix
через указатель (т.е. cudaMemcpy
их на устройство, затем передайте указатель устройства), прямо сейчас у вас не будет проблем, но если подпись функции будет очень большой, тогда вы можете нажать ограничение на 256 байт
- У вас есть неэффективные чтения из Ad, у вас будет 32-байтная транзакция в память для каждого чтения в Melement - рассмотрите возможность использования разделяемой памяти в качестве промежуточной области (c.f. transposeNew sample в SDK)
Ответ 2
Теперь CUDA поддерживает printf
непосредственно в ядре. Для формального описания см. Приложение B.16 Руководство по программированию CUDA C.
Ответ 3
кстати..
Ответ 4
См. раздел "Отформатированный вывод" (в настоящее время B.17) в Руководстве по программированию CUDA C.
http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html