Если это работает, это не должно. Это, вероятно, ошибка в компиляторе CUDA, и она может быть исправлена в будущем - поэтому не полагайтесь на нее.
Однако, если вы хотите, чтобы класс был видим для хоста (и компилятора, отличного от cuda), но у вас есть некоторые функции __device__
, которые вам не нужны на хосте, вы всегда можете инкапсулировать эти функции с #ifdef __CUDACC__
- #endif
. __CUDACC__
предопределено при компиляции с nvcc, в противном случае это не так. Таким образом, вы можете написать в своем заголовке что-то вроде:
class Foo{
public:
#ifdef __CUDACC__
inline __device__ int getInt();
#endif
};
Если вы боитесь иметь слишком много препроцессоров ifdefs, вы также можете сделать трюк следующим образом:
#ifdef __CUDACC__
#define HOST __host__
#define DEVICE __device__
#else
#define HOST
#define DEVICE
#endif
...
class Foo{
public:
inline HOST DEVICE int getInt();
};