programming for example dummies c++ c cuda gpu-programming

c++ - for - printf dentro de la función__global__ CUDA



cuda reference (4)

Actualmente estoy escribiendo una multiplicación matricial en una GPU y me gustaría depurar mi código, pero como no puedo usar printf dentro de una función de dispositivo, hay algo más que pueda hacer para ver qué sucede dentro de esa función. Esta es mi función actual:

__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; }

Me encantaría saber si Ad y Bd es lo que creo que es, y ver si esa función realmente está siendo llamada.


CUDA ahora soporta printf s directamente en el kernel. Para una descripción formal, consulte el Apéndice B.16 de la Guía de programación CUDA C.



EDITAR

Para evitar engañar a la gente, como M. Tibbits señala que printf está disponible en cualquier GPU con capacidad informática 2.0 y superior.

Fin de edición

Usted tiene opciones:

  • Utilice un depurador de GPU, es decir, cuda-gdb en Linux o Nexus en Windows
  • Use cuprintf, que está disponible para desarrolladores registrados (regístrese here )
  • Copie manualmente los datos que desea ver, luego descargue ese búfer en el host una vez que su kernel se haya completado (recuerde sincronizar)

Con respecto a su fragmento de código:

  • Considere pasar las estructuras Matrix a través del puntero (es decir, cudaMemcpy al dispositivo, luego pase el puntero del dispositivo), ahora no tendrá ningún problema, pero si la firma de la función es muy grande, puede alcanzar el límite de 256 bytes.
  • Tiene lecturas ineficientes del anuncio, tendrá una transacción de 32 bytes en la memoria para cada lectura en Melement; considere usar la memoria compartida como un área de almacenamiento (consulte la muestra de transposiciónNuevo en el SDK)