Yo no creo que yo era un completo novato con Cuda, pero al parecer, yo soy.

Recientemente he actualizado mi cuda dispositivo capaz de la capacidad de 1.3 a 2.1 (Geforce GT 630). Pensé que hacer una actualización completa para Cuda toolkit 5.0.

Puedo compilar general de los núcleos cuda, pero printf no está funcionando incluso con -arch=sm_20 conjunto.

Código:

#include <stdio.h>
#include <assert.h>
#include <cuda.h>
#include <cuda_runtime.h>

__global__ void test(){

    printf("Hi Cuda World");
}

int main( int argc, char** argv )
{

    test<<<1,1>>>();
        return 0;
}

Compilador:

Error   2   error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_20,compute_10\" --use-local-env --cl-version 2010 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include"  -G   --keep-dir "Debug" -maxrregcount=0  --machine 32 --compile -arch=sm_20  -g   -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o "Debug\main.cu.obj" "d:\userstore\documents\visual studio 2010\Projects\testCuda\testCuda\main.cu"" exited with code 2.  C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 5.0.targets  592 10  testCuda
Error   1   error : calling a __host__ function("printf") from a __global__ function("test") is not allowed d:\userstore\documents\visual studio 2010\Projects\testCuda\testCuda\main.cu    9   1   testCuda

Estoy a punto de hacer con la vida, porque de este problema…hecho hecho hecho. Por favor hable de mí hacia abajo desde las alturas con una respuesta.

  • Tienes un confuso conjunto de interruptores que se pasa a nvcc: -gencode=arch=compute_10,code=\"sm_20,compute_10\" y -arch=sm_20. El primer conjunto puede estar en conflicto con el segundo set. ¿Cómo especificar (en la configuración del proyecto) para compilar para arco sm_20 ? Y si se compila para sm_10/compute_10 a todos (incluso si usted también ha especificado sm_20), usted va a conseguir que el mensaje de error. Así que en la configuración del proyecto, es probable que desee para eliminar sm_10/compute_10 la generación de código.
  • El proyecto está tratando de compilar para compute_10 y compute_20. No compilar para compute_10 objetivos, no el soporte en el kernel printf.
  • Sólo pensé que esto fuera así. Mi tarjeta de video tiene la capacidad de 2.1, así que pensé en poner compute_21,sm_21. Cuando eso falló, pensé que los valores eran totalmente independiente, así que me dejó en compute_10. Además, no veo compute_20 mencionado en anteriores debates de utilizar printf u otros sm_20 que requieren funciones.
  • Alguien siéntase libre de responder por lo que puede escoger su respuesta.
InformationsquelleAutor PaulD | 2013-03-27

2 Comentarios

  1. 7

    En el kernel printf sólo se admite en la capacidad de cálculo 2 o superior de hardware. Porque su proyecto es la construcción de tanto capacidad de cálculo 1.0 y calcular 2.1, nvcc compila el código varias veces y construye un multi-arquitectura fatbinary objeto. Es durante el transcurso de la capacidad de cálculo 1.0 compilación ciclo que el error se genera, debido a la printf llamada no es compatible para que la arquitectura.

    Si se quita la capacidad de cálculo 1.0 build objetivo de su proyecto, el error desaparecerá.

    También, escriba el kernel como este:

    __global__ void test()
    {
    #if __CUDA_ARCH__ >= 200
        printf("Hi Cuda World");
    #endif
    }

    [descargo de responsabilidad: escrito en el navegador, nunca compilado, utilice a su propio riesgo]

    La __CUDA_ARCH__ símbolo sólo será >= 200 durante la construcción para calcular la capacidad de 2.0 o el listón alto y esto le permitirá compilar este código para calcular la capacidad de 1.x dispositivos sin encontrar un error de sintaxis.

  2. 18

    Si usted está usando printf en el kernel, debe utilizar cudaDeviceSynchronize():

    #include <stdio.h>
    #include <assert.h>
    #include <cuda.h>
    #include <cuda_runtime.h>
    
    __global__ void test(){
        printf("Hi Cuda World");
    }
    
    int main( int argc, char** argv )
    {
        test<<<1,1>>>();
        cudaDeviceSynchronize();
        return 0;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here