c++ - CUDA y Clases




class (3)

He buscado información sobre cómo usar exactamente las clases con CUDA, y si bien existe un consenso general de que se puede hacer y aparentemente está siendo realizado por personas, he tenido dificultades para descubrir cómo hacerlo. hazlo.

Tengo una clase que implementa un conjunto de bits básico con sobrecarga del operador y similares. Necesito poder instanciar objetos de esta clase tanto en el host como en el dispositivo, copiar entre los dos, etc. ¿Defino esta clase en un .cu? Si es así, ¿cómo lo uso en mi código C ++ del lado del host? Las funciones de la clase no necesitan acceder a variables especiales de CUDA como threadId; solo necesita poder ser usado por el host y el dispositivo.

Gracias por cualquier ayuda, y si me estoy acercando a esto de una manera completamente incorrecta, me encantaría escuchar alternativas.


Answers

Otro buen recurso para esta pregunta son algunos de los ejemplos de código que vienen con el kit de herramientas de CUDA. Dentro de estas muestras de código puedes encontrar ejemplos de casi cualquier cosa que puedas imaginar. Uno que es pertinente a su pregunta es el archivo quadtree.cu. La mejor de las suertes.


Defina la clase en un encabezado que # incluya, al igual que en C ++.

Cualquier método que deba __device__ desde el código del dispositivo se debe definir con __device__ y __host__ declspecs, incluido el constructor y el destructor si planea usar new / delete en el dispositivo (note new / delete requiere CUDA 4.0 y una capacidad de cálculo 2.0 o superior GPU).

Probablemente quiera definir una macro como

#ifdef __CUDACC__
#define CUDA_CALLABLE_MEMBER __host__ __device__
#else
#define CUDA_CALLABLE_MEMBER
#endif 

Luego usa esta macro en tus funciones miembro

class Foo {
public:
    CUDA_CALLABLE_MEMBER Foo() {}
    CUDA_CALLABLE_MEMBER ~Foo() {}
    CUDA_CALLABLE_MEMBER void aMethod() {}
};

La razón de esto es que solo el compilador CUDA conoce __device__ y __host__ - el compilador de C ++ del host generará un error.

Editar: Nota __CUDACC__ está definido por NVCC cuando está compilando archivos CUDA . Esto puede ser al compilar un archivo .cu con NVCC o al compilar cualquier archivo con la opción de línea de comando -x cu .


En mi caso, recibí el error porque había mezclado los nombres de paquetes en mayúsculas y minúsculas en un sistema Windows 7. Cambiar los nombres de los paquetes a minúsculas resolvió el problema. Tenga en cuenta también que en este escenario no obtuve ningún error al compilar el archivo .java en un archivo .class; simplemente no se ejecutaría desde el mismo directorio (sub-sub-sub- sub).





c++ class cuda