3

私はCUDAで小さなC++プロジェクトを強化しようとしています。私のプロジェクトでは、たとえばカスタムライブラリのクラスや関数Matrix3d, Vector3d, Plane2dなどを使用しています。これらはほとんどが幾何学的なオブジェクトです。

デバイス(__host__ __device__関数またはカーネル)でコードを使用しようとすると、すべてのライブラリ関数/オブジェクトがホストコードと見なされ、たとえば複数の警告とエラーが発生しますerror: identifier "Plane3d::~Plane3d" is undefined in device code

デバイスでライブラリを使用する方法はありますか?それはどのように行われますか?私はCUDAとC++の経験がないので(クラスのない単純なCコードでのみCUDAを使用しました)、戦略をうまく理解できません。

ライブラリのソースコードを変更しないようにする方法はありますか?ライブラリのコードを変更することは可能ですが、それを避けることができればもっと良いでしょう。

どうもありがとう。

4

2 に答える 2

1

CUDAでC++クラスを使用することに特に問題はありません。オブジェクトモデルは、標準のC++とわずかに異なります。

構造体またはクラスデータメンバーは、クラスまたは構造体がインスタンス化されるメモリ空間(ホストまたはデバイス)で自動的に定義されます。自動ではないのは、クラスおよび構造体内の関数メンバーおよび演算子のコード生成です。プログラマーは、オブジェクトがインスタンス化されるメモリスペースに対して明示的に定義およびコンパイルする必要があります。この後者の要件は、オブジェクト内で呼び出す各関数の両方__device__と定義が必要であることを意味します。__host__これにはコンストラクタとデストラクタが含まれ、後者は質問で示すエラーです。

于 2012-12-04T18:33:52.437 に答える
0

ソースコードを変更する必要はありません。必要なのはアダプタを作成することです。

CUDAカーネルは、double *、double * 、double **またはfloat*、float * 、float **などの低レベル構造、および組み込みのCUDAタイプで動作します。

CUDAはとにかくCUDAの外部に割り当てられたメモリで直接動作することはできません(通常のRAMではなくグラフィックカードに割り当てられたメモリでのみ)。そのため、データをグラフィックメモリにコピーする必要があります。

タイプが使用するバッファにアクセスできるメソッドを提供する場合、タイプに連続メモリがある場合は継続的に、そうでない場合はチャンクで(CUDAメモリコピー機能を使用して)グラフィックカードにコピーできます。単純なインデックスを使用して、カーネルでそれらをdouble***として処理します。

于 2012-12-04T16:23:13.443 に答える