функции printf внутри глобальной функции и технологии CUDA
в настоящее время я пишу умножение матрицы на 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 тем, что я думаю, и посмотреть, действительно ли эта функция вызывается.
4 ответов
редактировать
чтобы не вводить в заблуждение людей, как указывает М. Тиббитс, printf доступен в любом GPU вычислительной способности 2.0 и выше.
КОНЕЦ РЕДАКТИРОВАНИЯ
у вас есть выбор:
- используйте отладчик GPU, т. е. cuda-gdb в Linux или Nexus в Windows
- используйте cuprintf, который доступен для зарегистрированных разработчиков (зарегистрируйтесь здесь)
- вручную скопируйте данные, которые вы хотите увидеть, а затем сбросить этот буфер на хост после завершения вашего ядра (не забудьте синхронизировать)
Что касается фрагмента кода:
- рассмотрите возможность передачи
Matrix
структуры через указатель (т. е.cudaMemcpy
их на устройство, затем передайте указатель устройства), прямо сейчас у вас не будет проблем, но если сигнатура функции станет очень большой, вы можете нажать 256-байтовый предел - у вас неэффективные чтения из объявления, вы будете имейте 32-байтовую транзакцию в память для каждого чтения в Melement-рассмотрите использование общей памяти в качестве промежуточной области (c.f. the transposeNew образец в SDK)
CUDA и поддерживает printf
s непосредственно в ядре. Официальное описание см. В приложении B. 16 руководство по программированию CUDA c.
- cuprintf
- попробуйте Nexus http://developer.nvidia.com/object/nexus.html
кстати..
- общая
- умножить вне цикла
- посмотрите на это:http://www.seas.upenn.edu / ~cis665/LECTURES/Lecture11.ppt
в разделе "форматированный вывод" (в настоящее время Б. 17 раздел Руководство по программированию на CUDA на C).
http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html