CUDA y Clases


He buscado por todas partes alguna idea sobre cómo usar exactamente las clases con CUDA, y aunque hay un consenso general de que se puede hacer y al parecer se está haciendo por la gente, he tenido dificultades para averiguar cómo hacerlo realmente.

Tengo una clase que implementa un bitset básico con sobrecarga de operadores y similares. Necesito poder crear instancias de 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 CUDA especiales como threadId; solo necesita ser capaz de ser utilizado host y lado del dispositivo.

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

Author: secshunayt, 2011-08-08

2 answers

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

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

Probablemente quieras definir una macro como

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

Luego use esta macro en su miembro funciones

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 sabe __device__ y __host__ your su compilador C++ de host generará un error.

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

 51
Author: harrism,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 04:08:54

Otro buen recurso para esta pregunta son algunos de los ejemplos de código que vienen con el kit de herramientas 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 quadtree.cu archivo. Mucha suerte.

 3
Author: t. fochtman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-13 22:21:40