printf внутри функции CUDA __global__ - PullRequest
23 голосов
/ 01 февраля 2010

В настоящее время я пишу матричное умножение на графическом процессоре и хотел бы отладить свой код, но поскольку я не могу использовать 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 ]

71 голосов
/ 05 июля 2011

CUDA теперь поддерживает printf s непосредственно в ядре. Формальное описание см. В Приложении B.16 .

Руководства по программированию CUDA C.
16 голосов
/ 01 февраля 2010

EDIT

Чтобы не вводить людей в заблуждение, как указывает М. Тиббитс, printf доступен в любом графическом процессоре с вычислительной способностью 2.0 и выше.

Конец редактирования

У вас есть выбор:

  • Используйте отладчик графического процессора, то есть cuda-gdb в Linux или Nexus в Windows
  • Используйте cuprintf, который доступен для зарегистрированных разработчиков (регистрация здесь )
  • Вручную скопируйте данные, которые вы хотите увидеть, затем сбросьте этот буфер на хост после завершения работы вашего ядра (не забудьте синхронизировать)

Относительно вашего кода:

  • Рассмотрите возможность передачи структур Matrix через указатель (т. Е. cudaMemcpy их на устройство, затем передайте указатель на устройство), сейчас у вас не возникнет проблем, но если сигнатура функции станет очень большой, вы можете нажать ограничение в 256 байт
  • У вас неэффективные чтения из Ad, у вас будет 32-байтовая транзакция в памяти для каждого чтения в Melement - рассмотрите возможность использования общей памяти в качестве промежуточной области (см. Пример transposeNew в SDK)
4 голосов
/ 09 февраля 2010

кстати ..

2 голосов
/ 29 октября 2013

См. Раздел «Форматированный вывод» (в настоящее время B.17) в Руководстве по программированию CUDA C.

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

...