私は、主なコンポーネントがテンソルの計算を実行できる計算グラフのノードである単純な深い学習フレームワークの実用的なCPUベースの実装を持っています。CUDAを既存のクラス構造に統合する方法は?
私の実装をGPUに拡張する必要がありますが、既存のクラス構造を使用したいだけですが、その機能をGPUに拡張したいと思います。クラスのほとんど
は、次のようなテンソルの上で動作して返すメソッドを持っている:tensor_ptr
は私のテンソルクラスの単純
std::shared_ptr
ポインタである
tensor_ptr get_output();
。今私がしたいのは、そのようなメソッドごとにGPUバージョンを追加することです。私が念頭に置いていたアイデアは
struct cu_shape {
int n_dims;
int x,y,z;
int len;
};
struct cu_tensor {
__device__ float * array;
cu_shape shape;
};
を次のように別のファイルtensor_gpu.cuh
でstruct
を定義することでしたし、その後、前の関数がでミラーリングされます:問題があることのようです
cu_tensor cu_get_output();
.cuh
ファイルは、通常のヘッダファイルとして扱われますし、デフォルトのC++コンパイラによってコンパイルされ、与えエラー:目の
error: attribute "device" does not apply here
eの行は__device__ float * array
の定義と一致します。
私はあなたがCUDAと純粋なC++コードのように私は.h
ファイルで定義されるだろう.cu
ファイルにすべてのCUDAランタイムAPI関数を非表示にする計画を混在させないことを承知しています。問題は、クラス内にデバイスポインタを格納し、それらをCUDA呼び出し関数に渡したかったということです。
このようにして、私は既存のオブジェクト構造をすべて使用し、初期化と計算部分を変更することができます。
普通のC++クラスが__device__
フラグを持つものに触れることができない場合、CUDAコードをC++コードに統合する方法もありますか?
ファイルの中でCUDAランタイムコールとキーワードを文字通り使用できますか?
CUDAポインタを扱っているという事実をC++コンパイラから隠すためのスマートな方法はありますか?
洞察力は深く感謝しています!
編集:私のところには誤解があるようです。 には__device__
フラグを設定する必要はなく、それでもデバイスメモリへのポインタとして使用できます。 CUDAの統合に関する優れたプラクティスを追加したり、何かを明確にする貴重なものがあれば、躊躇しないでください!
詳しいことを教えてください。実装の目的はどういう意味ですか?これらの属性は '.cu'ファイル内で使用できますが、他の場所では使用できません。私の推測は、それがnvccコンパイラに対してのみ有効な属性であるか、それとも完全に何か他のものでしょうか? – Addy
これはnvccに対して有効です。私はPythonやjavaで何をするのか分かりません。それは文脈から取り除かれた言葉の問題です。そしてC++でさえ、文脈からはずれています - 明示的に – MSalters