web-dev-qa-db-ja.com

CUDAとクラス

私はCUDAでクラスを正確に使用する方法についての洞察を求めてすべてを調査しましたが、それは実行可能であり、明らかに人々によって実行されているという一般的なコンセンサスはありますが、実際の方法を見つけるのに苦労しましたやれ。

演算子のオーバーロードなどで基本的なビットセットを実装するクラスがあります。ホストとデバイスの両方でこのクラスのオブジェクトをインスタンス化したり、2つの間でコピーしたりできるようにする必要があります。このクラスを.cuで定義できますか?もしそうなら、ホスト側のC++コードでそれをどのように使用しますか?クラスの関数は、threadIdのような特別なCUDA変数にアクセスする必要はありません。ホスト側とデバイス側で使用できる必要があるだけです。

助けてくれてありがとう、私がこれに完全に間違った方法でアプローチしているなら、私は代替案を聞きたいです。

37
secshunayt

C++と同様に、#includeするヘッダーでクラスを定義します。

デバイスコードから呼び出す必要のあるメソッドは、new/deleteを使用する予定の場合はコンストラクターとデストラクターを含め、__device____Host__ declspecの両方で定義する必要があります。デバイス上(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__を認識しているためです。ホストC++コンパイラはエラーを発生させます。

編集:注 __CUDACC__は、CUDAファイルのコンパイル時にNVCCによって定義されます 。これは、NVCCで.cuファイルをコンパイルするとき、またはコマンドラインオプション-x cuでファイルをコンパイルするときのいずれかです。

54
harrism

この質問のもう1つの優れたリソースは、CUDAツールキットに付属するいくつかのコード例です。これらのコードサンプルには、想像できるほとんどすべての例が含まれています。あなたの質問に関連するものはquadtree.cuファイルです。幸運を祈ります。

3
t. fochtman