Подтвердить что ты не робот

CUDA и классы

Я искал всю информацию о том, как именно использовать классы с CUDA, и хотя существует общее мнение, что это можно сделать и, по-видимому, делают люди, мне было трудно узнать как это сделать на самом деле.

У меня есть класс, который реализует базовый битсет с перегрузкой оператора и тому подобное. Мне нужно иметь возможность создавать объекты этого класса как на хосте, так и на устройстве, копировать между ними и т.д. Я определяю этот класс в .cu? Если да, то каким образом я могу использовать его в своем коде на С++ на стороне хоста? Функции класса не нуждаются в доступе к специальным переменным CUDA, таким как threadId; он просто должен быть способен использовать хост и устройство.

Спасибо за любую помощь, и если я подхожу к этому совершенно неправильно, я бы хотел услышать альтернативы.

4b9b3361

Ответ 1

Определите класс в заголовке, который вы #include, как в С++.

Любой метод, который должен вызываться из кода устройства, должен быть определен как с __device__, так и __host__ declspecs, включая конструктор и деструктор, если вы планируете использовать new/delete на устройстве (примечание new/delete требуется CUDA 4.0 и вычислительная способность 2.0 или выше GPU).

Вероятно, вы хотите определить макрос, например

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

Затем используйте этот макрос для своих функций-членов

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

Причиной этого является то, что только компилятор CUDA знает __device__ и __host__ - ваш компилятор хоста С++ вызовет ошибку.

Изменить: Примечание __CUDACC__ определяется NVCC при компиляции файлов CUDA. Это может быть либо при компиляции файла .cu с помощью NVCC, либо при компиляции любого файла с опцией командной строки -x cu.

Ответ 2

Другим хорошим ресурсом для этого вопроса являются некоторые примеры кода, поставляемые с инструментарием CUDA. В рамках этих образцов кода вы можете найти примеры практически любой вещи, которую вы могли бы себе представить. Один из вопросов, относящихся к вашему вопросу, - файл quadtree.cu. Удачи.