Подтвердить что ты не робот

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 то, что я думаю, и посмотреть, действительно ли эта функция вызывается.

4b9b3361

Ответ 1

ИЗМЕНИТЬ

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

КОНЕЦ РЕДАКТИРОВАНИЯ

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

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

Что касается фрагмента кода:

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