Actualmente estoy escribiendo una multiplicación de la matriz en una GPU y desea depurar mi código, pero ya no la puedo usar printf dentro de una función de dispositivo, hay algo más que pueda hacer para ver lo que está pasando 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 gustaría saber si Ad y Bd es lo que creo que es, y ver que si la función es en realidad se llama.

  • ¿Por qué no usar cuda-gdb?
InformationsquelleAutor Jose Vega | 2010-01-31

4 Comentarios

  1. 16

    EDITAR

    Para evitar la confusión de la gente, como M. Tibbits señala printf está disponible en cualquier GPU de la capacidad de cálculo 2.0 y superior.

    FINAL DE EDITAR

    Tiene varias opciones:

    • Uso de una GPU depurador, es decir, cuda-gdb en Linux o Nexus en Windows
    • Uso cuprintf, que está disponible para desarrolladores registrados (sign up aquí)
    • Copiar manualmente los datos que desea ver, luego el volcado de que el búfer en el host después de su núcleo ha terminado (recuerde que para sincronizar)

    Sobre el fragmento de código:

    • Considerar pasar el Matrix estructuras en la vía puntero (es decir, cudaMemcpy en el dispositivo, a continuación, pasar en el dispositivo de puntero), ahora usted no tendrá ningún problema, pero si la función de la firma es muy grande, puede llegar a los 256 bytes límite
    • Tiene ineficiente lee de un Anuncio, usted tendrá un 32 bytes de la transacción a la memoria, para cada lectura en Melement – considerar el uso de memoria compartida como un área de ensayo (c.f. el transposeNew muestra en el SDK)
  2. 71

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

    • Eso es muy dulce.
    • Creo que el enlace no está apuntando al lugar correcto ya. Aquí está un enlace alternativo: docs.nvidia.com/cuda/cuda-c-programming-guide/…
    • Nota: «ahora» significa capacidad de cálculo 2.x o superior.
    • y por lo tanto, necesita pasar un argumento -arch sm_20 o similar a nvcc, de lo contrario no va a compilar en un __global__ función.
    • La sección pertinente B. 17 ahora, no B. 14.
    • …y la sección pertinente ahora es B. 16
    • B. 19 y contando 😀

Dejar respuesta

Please enter your comment!
Please enter your name here