Parece que printf no funciona en el interior del Núcleo de un código cuda

#include "Common.h"
#include<cuda.h>
#include <stdio.h>

__device__ __global__ void Kernel(float *a_d , float *b_d ,int size)
{
    int idx = threadIdx.x ;
    int idy = threadIdx.y ;
    //Allocating memory in the share memory of the device
    __shared__ float temp[16][16];

    //Copying the data to the shared memory
    temp[idy][idx] = a_d[(idy * (size+1)) + idx] ;


    printf("idx=%d, idy=%d, size=%d\n", idx, idy, size);


    for(int i =1 ; i<size ;i++) {
            if((idy + i) < size) { //NO Thread divergence here
                    float var1 =(-1)*( temp[i-1][i-1]/temp[i+idy][i-1]);
                    temp[i+idy][idx] = temp[i-1][idx] +((var1) * (temp[i+idy ][idx]));
            }
            __syncthreads(); //Synchronizing all threads before Next iterat ion
    }
    b_d[idy*(size+1) + idx] = temp[idy][idx];
}

al compilar, dice:

 error: calling a host function("printf") from a __device__/__global__ function("Kernel") is not allowed

La versión cuda es de 4

  • No he entendido bien usted está tratando de imprimir el texto de una GPU? No estoy sorprendido de que no es compatible.
  • sí. Quiero ver a algunas de las variables
  • Me temo que esto no va a hacer. Usted puede tener éxito con un emulador pero no creo que esto sea posible con el dispositivo real.
  • Usted sabe, el código de la GPU puede ejecutar varias veces en paralelo, la GPU en el autobús no es realmente diseñado para transferir el control de la GPU, … . Tal vez la escritura a un búfer de lectura y el búfer de la CPU?
  • ¿Cómo puedo depurar?
  • Escribir en un buffer fuera de pantalla (cada función a su propio píxel de la memoria intermedia) y la impresión de la CPU?
  • printf de los núcleos se admite en CC 2.0 y superior. Si usted tiene un cc 2.0 o más reciente GPU, compilar con -arch=sm_20 y el error debe desaparecer
  • Como una adición a lo que Robert dijo: lado del dispositivo printf requiere el uso de la ABI, así que el código contiene printf() no puede ser compilado con-abi=no. También, se debe incluir el archivo de cabecera stdio.

InformationsquelleAutor mahmood | 2012-11-09

2 Comentarios

  1. 7

    Citando la Guía de Programación de CUDA «Formato de salida que sólo es compatible con dispositivos de capacidad de cálculo 2.x y superior«. Ver la guía de programación para obtener información adicional.

    Dispositivos de capacidad de cálculo < 2.x puede utilizar cuPrintf.

    Si usted está en un 2.x y por encima de dispositivo y usted está tratando de usar printf asegúrese de que ha especificado arco=sm_20 (o superior). El valor predeterminado es sm_10 que no tiene suficientes características para el soporte de printf.

    NVIDIA ofrece tres nivel de la fuente de depuradores para CUDA. Usted puede encontrar estos más útil que printf para la inspección de las variables.
    – Nsight de Edición de Visual Studio CUDA Depurador
    – Nsight Eclipse Edición CUDA Depurador
    – cuda-gdb

    • puesto que usted está aquí, esto es realmente estúpido que no se puede depurar en el mismo dispositivo en el que xorg usa. acaba de decir – sin ánimo de ofender (EDIT: ok no estúpido, pero molesto)
  2. 4

    Necesita utilizar cuPrintf, como en este ejemplo. Tenga en cuenta que printf es una muy limitada de la depuración, la Nsight o Nsight eclipse edición de los IDEs son mucho más agradables.

    • El enlace está roto.
    • Lo siento – cualquiera de un número de cuPrintf() ejemplos de trabajo, por ejemplo, code.google.com/p/stanford-cs193g-sp2010/wiki/… , aunque ahora los dispositivos de capacidad de cálculo 1.x son cada vez más difíciles de encontrar.

Dejar respuesta

Please enter your comment!
Please enter your name here