2011-02-04 6 views
10

El Apéndice D de la versión 3.2 de la documentación de CUDA se refiere a la compatibilidad con C++ en el código de dispositivo CUDA.
Se menciona claramente que CUDA admite "Clases para dispositivos de capacidad informática 2.x". Sin embargo, estoy trabajando con dispositivos de capacidad informática 1.1 y 1.3 y puedo usar esta función.¿Cuáles son las construcciones de lenguaje C++ reales compatibles con el código de dispositivo CUDA?

Por ejemplo, este código funciona:

// class definition voluntary simplified 
class Foo { 
    private: 
    int x_; 

    public: 
    __device__ Foo() { x_ = 42; } 
    __device__ void bar() { return x_; } 
}; 


//kernel using the previous class 
__global__ void testKernel(uint32_t* ddata) { 
    Foo f; 
    ddata[threadIdx.x] = f.bar(); 
} 

también soy capaz de utilizar las bibliotecas extensas tales como empuje :: clases de generación aleatoria al azar. Mi única conjetura es que puedo hacerlo gracias a la función de marcado automático de la función marcada __device__, pero esto no explica el manejo de las variables miembro.

¿Alguna vez ha utilizado estas características en las mismas condiciones, o puede explicarme por qué mi código CUDA se comporta de esta manera? ¿Hay algo mal en la guía de referencia?

Respuesta

11

Oficialmente, CUDA no tiene soporte para clases en dispositivos anteriores a 2.0.

Prácticamente, desde mi experiencia, puede usar todas las características de C++ en todos los dispositivos, siempre que la funcionalidad se pueda resolver en tiempo de compilación. Los dispositivos anteriores a 2.0 no admiten llamadas a funciones (todas las funciones están en línea) y ningún programa salta a una dirección de variable (solo salta en una dirección constante).

Esto significa, puede utilizar el siguiente C++ construye:

  • Visibilidad (público/protected/privado)
  • no virtual herencia
  • toda la programación de la plantilla y metaprogramming (hasta que Stuble en NVCC errores, hay bastantes de ellos a partir de la versión 3.2)
  • constructores (excepto cuando el objeto se declara en __ memoria compartida __)
  • espacios de nombres

no puede utilizar los siguientes:

  • nueva & eliminar los operadores (Creo dispositivos> = 2.0 puede hacer eso)
  • métodos virtuales (requiere saltos en dirección de la variable)
  • función de recursividad (requiere llamadas de función)
  • excepciones

En realidad, todas las ejemplos en el capítulo D.6 de la Guía de programación de CUDA pueden compilarse para dispositivos < 2.0

+0

Tu respuesta trae puntos interesantes sobre las limitaciones. La necesidad de tiempo de compilación parece ser el punto a tener en cuenta cuando se trabaja con dispositivos de capacidad informática <2.X. – jopasserat

+0

Después de haber investigado el problema, no puedo (y probablemente no encuentre) encontrar una respuesta mejor que la tuya. Por lo tanto, confío en tu experiencia :) De todos modos, ahora tengo un C2050 \ o/así que puedo comparar mis ejecuciones para asegurarme de que mi código siga siendo portátil. Gracias por tu respuesta @ CygnusX1 – jopasserat

0

Algunas funcionalidades de la clase C++ funcionarán, sin embargo, la Guía de programación básicamente dice que no es totalmente compatible y, por lo tanto, no La funcionalidad de la clase C++ funcionará. ¡Si puedes hacer lo que estás buscando hacer, entonces debes seguir adelante!

+0

Bien, pero necesito saber exactamente qué funcionará. Tengo la intención de utilizar estas características en una biblioteca, así que no puedo confiar en ellas si no son seguras. Fácilmente podríamos imaginar que este código causaría estragos en algunas circunstancias. Lo que realmente necesito es la frontera exacta entre lo que debería hacer o no. – jopasserat

Cuestiones relacionadas