8

CUDA5.0とComputeCapability2.1カードを使用しています。

質問は非常に簡単です。カーネルをクラスの一部にすることはできますか?例えば:

class Foo
{
private:
 //...
public:
 __global__ void kernel();
};

__global__ void Foo::kernel()
{
 //implementation here
}

そうでない場合、解決策は、クラスのメンバーであり、カーネルを内部的に呼び出すラッパー関数を作成することです。

はいの場合、通常のプライベート関数としてプライベート属性にアクセスできますか?

(現在、プロジェクトに他のいくつかのエラーがあるため、試してみて何が起こるかを確認しているだけでなく、参考になる質問だと思います。C++でCUDAを使用するための参考資料を見つけるのは困難でした。基本的な機能の例は次のとおりです。構造化コードの戦略は見つかりましたが、戦略ではありません。)

4

1 に答える 1

5

cuda の動的並列処理については、ここでは触れません (つまり、計算能力 3.0 以前を想定しています)。

覚えている __ global__ は、ホストから(のみ)呼び出される(ただし、デバイス上で実行される)cuda関数に使用されます。このオブジェクトをデバイスでインスタンス化すると、機能しません。さらに、デバイスからアクセス可能なプライベート データをメンバー関数で使用できるようにするには、オブジェクトをデバイス上でインスタンス化する必要があります。

したがって、カーネル呼び出し(つまり、ホスト オブジェクト メンバー関数に埋め込まれます)を持つことができますmykernel<<<blocks,threads>>>(...);が、カーネル定義 (つまり、__ global__ デコレーターを使用した関数定義) は、通常、ソース コード内のオブジェクト定義よりも前になります。そして、既に述べたように、そのようなデバイス上でインスタンス化されたオブジェクトにメソッドを使用することはできません. また、オブジェクトの他の場所で定義された通常のプライベート データにアクセスすることもできません.グローバルメモリ内のポインターを使用してデバイスデータにアクセスできるようになりますが、そのようなスキームは一見すると非常に複雑に思えます)。

通常、デバイスで使用可能なメンバー関数の前には __ device__ デコレーターが付きます。この場合、デバイス メンバー関数内のすべてのコードは、それを呼び出したスレッド内から実行されます。

This questionは、ホストとデバイスの両方から呼び出し可能なメンバー関数を持つC ++オブジェクトの例を(私の編集した回答で)示し、ホストとデバイスオブジェクト間で適切なデータをコピーします。

于 2012-12-06T17:00:57.213 に答える