Hola, descubrimos la respuesta a lo que andabas buscando, desplázate y la obtendrás aquí.
Solución:
Si estas usando printf
en el kernel, debes usar cudaDeviceSynchronize()
:
#include
#include
#include
#include
__global__ void test()
printf("Hi Cuda World");
int main( int argc, char** argv )
test<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
En el kernel, printf solo se admite en hardware con capacidad de cómputo 2 o superior. Porque su proyecto está listo para construir ambos capacidad de cómputo 1.0 y cómputo 2.1, nvcc compila el código varias veces y construye un objeto fatbinary de arquitectura múltiple. Es durante el ciclo de compilación de la capacidad de cálculo 1.0 cuando se genera el error, porque printf
la llamada no es compatible por esa arquitectura.
Si elimina el destino de compilación de la capacidad de cálculo 1.0 de su proyecto, el error desaparecerá.
Alternativamente, podría escribir el kernel así:
__global__ void test()
#if __CUDA_ARCH__ >= 200
printf("Hi Cuda World");
#endif
El __CUDA_ARCH__
El símbolo solo será> = 200 cuando se compile para capacidad de cómputo 2.0 o objetivos altos y esto le permitiría compilar este código para dispositivos de capacidad de cómputo 1.x sin encontrar un error de sintaxis.
Al compilar para la arquitectura correcta y no obtener salida, también debe asegurarse de que el kernel finalice y el controlador vacíe el búfer de salida. Para hacer esto, agregue una llamada de sincronización después del lanzamiento del kernel en el código de host
por ejemplo:
int main( int argc, char** argv )
test<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
[disclaimer: all code written in browser, never compiled, use at own risk]
Si hace ambas cosas, debería poder compilar, ejecutar y ver el resultado.
Te invitamos a añadir valor a nuestra información aportando tu veteranía en las notas.