historia - ¿Cuáles son las construcciones de lenguaje C++ reales compatibles con el código del dispositivo CUDA?
historia de c++ (2)
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 funcionarán todas las funciones de la clase C ++. ¡Si puedes hacer lo que estás buscando hacer, entonces debes seguir adelante!
El Apéndice D de la versión 3.2 de la documentación de CUDA se refiere al soporte de C ++ en el código del 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.
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 puedo usar bibliotecas generalizadas como Thrust :: clases aleatorias de generación aleatoria. Mi única conjetura es que puedo hacerlo gracias a la __device__
automática de la función __device__
marcado, pero esto no explica el manejo de las variables miembro con esto.
¿Alguna vez ha usado 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?
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 que puede usar los siguientes constructos de C ++:
- Visibilidad (público / protegido / privado)
- herencia no virtual
- programación y metaprogramación de plantillas completas (hasta que descubras errores nvcc; 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 puedes usar lo siguiente:
- operadores nuevos y eliminados (creo que los dispositivos> = 2.0 pueden hacerlo)
- métodos virtuales (requiere saltos en la dirección variable)
- recursión de función (requiere llamadas de función)
- excepciones
En realidad, todos los ejemplos del capítulo D.6 de la Guía de programación CUDA pueden compilarse para dispositivos <2.0