Ответ 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
.