Почему работает определение заголовков классов без атрибута CUDA __device__?(C ++) - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть файл .h со следующими объявлениями:

class Foo{
public:
    inline int getInt();
};

, и мой файл .cu определяет следующее:

__device__ int Foo::getInt(){
   return 42;
}

Это довольно круто, потому что, хотя я не могуна самом деле вызовите getInt с хоста, я могу включить файл .h в файлы .cpp, чтобы у меня было объявление типа, видимое для хоста.Но для меня это не похоже, что это должно работать, так почему мне не нужно помещать атрибут __device__ в файл .h?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011

Если это работает, это не должно. Это, вероятно, ошибка в компиляторе 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();
};
0 голосов
/ 04 ноября 2011

Измените его на следующее:

__device__ int Foo::getInt(){
   return 42;
}

Проблема в типе возвращаемого значения функции. Это не void это int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...