He buscado por todas partes para alguna información sobre exactamente cómo utilizar las clases con CUDA, y aunque no hay un consenso general de que se puede hacer y, al parecer, se está haciendo por la gente, he tenido un tiempo difícil encontrar la manera de hacerlo realidad.

Tengo una clase que implementa un básico bitset con sobrecarga de operadores y similares. Tengo que ser capaz de instanciar los objetos de esta clase en el host y el dispositivo de copia entre los dos, etc. Puedo definir esta clase en una .cu? Si es así, ¿cómo puedo utilizar en mi host, el código de C++? Las funciones de la clase no necesitan tener acceso a especiales CUDA variables como el threadId; tan sólo debe ser capaz de ser utilizado host y el dispositivo de lado.

Gracias por la ayuda, y si me estoy acercando esta completamente equivocado, me encantaría escuchar alternativas.

InformationsquelleAutor secshunayt | 2011-08-08

2 Comentarios

  1. 53

    Definir la clase en un encabezado que #include, igual que en C++.

    Cualquier método que se debe llamar desde el código del dispositivo debe ser definido con tanto __device__ y __host__ declspecs, incluyendo el constructor y el destructor si usted planea usar new/delete en el dispositivo (nota new/delete requieren CUDA 4.0 y una capacidad de cálculo 2.0 o superior de la GPU).

    Usted probablemente desea definir una macro como

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

    A continuación, utilizar esta macro en sus funciones de miembro de

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

    La razón de esto es que sólo el CUDA compilador sabe __device__ y __host__ — su anfitrión C++ compilador generará un error.

    Editar:
    Nota __CUDACC__ se define por NVCC cuando es la compilación de archivos de CUDA. Esto puede ser o bien al compilar un .cu archivo con NVCC o cuando la compilación de cualquier archivo con la opción de línea de comandos -x cu.

    • Ahh, de modo que cuando se incluye a partir de una cpp, se compila sin el dispositivo especificadores, y cuando se incluya de una .cu, con. Supongo que mi primer temor era que esto podría causar algún tipo de disparidad al pasar desde el host al dispositivo, pero ahora veo cómo funciona. Muchas gracias!
    • Sólo para agregar una pequeña advertencia para Marcar la respuesta que atrapa a un montón de gente fuera de CUDA no admite la vinculación externa, por lo que la clase y todos sus métodos deben estar completamente definidos en la compilación ámbito de la unidad al momento de compilar la clase de la GPU.
    • Gracias @talonmies, eso es correcto. Un código de dispositivo enlazador es una característica para el futuro.
    • Wow , no me esperaba encontrar a @harrism aquí , vi tu foto en el cuda sitio web, no me esperaba que responder a preguntas sencillas.
    • Así es como me mantengo fuerte. 🙂
    • A @talonmies’ comentario, tenga en cuenta que CUDA 5 (ahora en la vista previa), se añade la vinculación de código de dispositivo.
    • Ahora me pregunto, ¿cómo le tratan de las funciones sólo se puede llamar desde el dispositivo? Sólo la creación de ellos __device__ y private?
    • Ellos no tienen que ser privado. Sólo asegúrese de que usted no llamarlos de no-código de dispositivo. código de dispositivo puede llamar a las o privado __device__ métodos.
    • No he tenido ningún éxito en la construcción de una simple clase que encapsula una CUDA núcleo de la llamada y contiene un __device__ miembro de la variable. Por desgracia, el SDK no contiene dicho ejemplo cualquiera. Puedes sugerir cómo llamar a un kernel CUDA dentro de su ejemplo? Mina compila bien (se muestra como un respuesta a continuación), pero no funciona (no sin errores). El mismo código sin la clase que encapsula funciona ok. He experimentado con __device__ __host__ y estoy compilando con compute_35 y sm_35 y se ejecuta en una GeForce 580. Alguna idea de por qué no funciona?
    • No veo una «respuesta» a continuación – ¿qué quieres decir? Creo que se debería publicar esto como un nuevo MODO de pregunta.
    • Hola @harrism , es posible disponer de función de host y el dispositivo de función como métodos en la misma clase?
    • Sí, usted puede hacer eso.
    • el comentario dado por usted ha sido beneficiosa como una simple explicación de esta respuesta. @harrism Muy bonita respuesta.Puede usted por favor, actualice su respuesta para explicar __CUDACC__ se definirá cuando ?
    • hecho.
    • Ahora sé que podemos usar -x cu como una compilación de bandera . Gran información.

  2. 3

    Otro buen recurso para esta pregunta son algunos de los ejemplos de código que viene con el CUDA toolkit. Dentro de estos ejemplos de código se pueden encontrar ejemplos de apenas alrededor de cualquier cosa que usted se pueda imaginar. Uno que es pertinente para la cuestión es el quadtree.cu archivo. La mejor de las suertes.

Dejar respuesta

Please enter your comment!
Please enter your name here