2011-11-04 8 views
0

は、私は次の宣言と.hファイルがあります:CUDA __device__属性を使用せずにクラスヘッダを定義するのはなぜですか? (C++)

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

を、私の.cuファイルには、次のように定義しています

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

althoughtは私が実際に呼び出すことはできませんので、これは、すごいですホストからのgetInt、.hファイルを.cppファイルに含めることができるので、ホストに対してタイプ宣言が表示されます。しかし、私にとってはうまくいかないと思われるので、なぜ__device__属性を.hファイルに入れる必要はありませんか?次へ

答えて

3

正常に機能する場合は無効にしてください。これはおそらくCUDAコンパイラのバグであり、将来は修正される可能性があるので、それに頼らないでください。

しかし、ホスト(および非cudaコンパイラ)でクラスを表示したいが、ホスト上では不要な__device__の機能がある場合は、これらの機能を常に#ifdef __CUDACC__でカプセル化できます - #endif__CUDACC__はnvccでコンパイルするときにあらかじめ定義されています。あなたはあまりにも多くのプリプロセッサifdefsを持つのを恐れ​​ている場合は、次のように、あなたはまた、トリックを行うことができます

class Foo{ 
public: 
#ifdef __CUDACC__ 
    inline __device__ int getInt(); 
#endif 
}; 

:だからあなたはあなたのヘッダーでのようなものを書くことができます

#ifdef __CUDACC__ 
#define HOST __host__ 
#define DEVICE __device__ 
#else 
#define HOST 
#define DEVICE 
#endif 

... 

class Foo{ 
public: 
    inline HOST DEVICE int getInt(); 
}; 
+0

ありがとう、この '__CUDACC__'はこれと他のもののために非常に役に立ちます。 – Vik

+0

このテクニックを使用して属性を定義することは可能ですか? Foo内で '__device__ int test'を定義しようとすると、'属性 'デバイスが "ここには適用されません"というエラーが出るので、 – Vik

+0

いいえ、フィールドには '__device__'を書きません。フィールドは型を指定するだけであり、独自の変数ではありません。 '__device__ Foo var'と書くと、' var'のすべてのフィールドがデバイス上にあります。他のメモリ空間(共有、定数)も同様です。 – CygnusX1

0

変更は:

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

問題は、関数の戻り値の型です。 voidではなく、intです。

+0

申し訳ありませんが、それは私の、int型であります間違いはここに書いてください。このコードは機能します。私は、私が知りたいことを明確にするために質問を変更しました。 – Vik

関連する問題