2017-11-26 24 views
0

私は、主なコンポーネントがテンソルの計算を実行できる計算グラフのノードである単純な深い学習フレームワークの実用的な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.cuhstructを定義することでしたし、その後、前の関数がでミラーリングされます:問題があることのようです

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の統合に関する優れたプラクティスを追加したり、何かを明確にする貴重なものがあれば、躊躇しないでください!

答えて

1

'__'は実装のために予約されています。そのため、Nvidiaの実装では__device__を使用することができます。しかし、他の「通常の」C++実装には、独自の予約シンボルがあります。

ここで、Nvidiaはもっと良いソリューションを設計できたかもしれませんが、ここでは役に立たないでしょう。

+0

詳しいことを教えてください。実装の目的はどういう意味ですか?これらの属性は '.cu'ファイル内で使用できますが、他の場所では使用できません。私の推測は、それがnvccコンパイラに対してのみ有効な属性であるか、それとも完全に何か他のものでしょうか? – Addy

+0

これはnvccに対して有効です。私はPythonやjavaで何をするのか分かりません。それは文脈から取り除かれた言葉の問題です。そしてC++でさえ、文脈からはずれています - 明示的に – MSalters

関連する問題