lenguaje historia ejemplos descargar comandos caracteristicas basicos c++ class cuda gpu gpgpu

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