2016-04-25 4 views
1

私はオブジェクトの1つまたはいくつかのコンテナを表すクラスを持っています。クラスは、各要素のコールバックを実行する関数を提供します。CUDAでexecute-function-on-each-elementを正しく実装する方法は?

struct MyData{ 
    Foo* foo; 
    void doForAllFoo(std::function<void(Foo)> fct){ 
     for(/* all indices i in foo */){ 
     fct(f[i]); 
     } 
    } 
} 

ドライビングコード:単純な実装は、次のようになり

MyData d = MyData(...); 
TypeX param1 = create_some_param(); 
TypeY param2 = create_some_more_param(); 
d.doForAll([&](Foo f) {my_function(f, param1, param2);}); 

私は、これはコンテナの柔軟なコールバックの良い解決策だと思います。

これをCUDAと並列化したいと思います。私はCUDAでラムダに許可されていることについてはあまりよく分かりません。また、__device____host__のコンパイルについてもわかりません。

MyDataを変更できますが、CUDAのアクセス可能な方法でメモリを割り当てる必要があることを除けば、運転コードのCUDAバックグラウンドの痕跡はありません。

私は最小限の例が非常に役に立つと思います。

+0

おそらく私はそれを逃しましたが、あなたは実際にどこかで質問をしましたか? – talonmies

+0

まあ...私はそれをどうすればいいのか尋ねます。さらに、おそらく最小の例がこの質問に最もよく答えるだろうと私は言う。 – Michael

+1

CUDAに同梱されているThrustライブラリには、ユーザーが提供する関数や関数を使ってGPUメモリ内の反復可能なシーケンスで動作する 'std :: for_each'の実装が既にあります。それは助けになるだろうか? – talonmies

答えて

1

CスタイルのCUDAカーネル関数を書き始める前に、Thrustライブラリをチェックすることができます。これはCUDAの一部であり、シンプルなGPUアルゴリズム開発のためのハイレベル抽象化を提供します。

ここでは、推力を伴う関数オブジェクトとラムダ式の使用を示すコード例を示します。でも推力と

https://github.com/thrust/thrust/blob/master/examples/lambda.cu

、あなたはまだあなたのためのデバイスコードとホストコードを生成するコンパイラを依頼する__device____host__を使用する必要があります。標準的なC++のlamda式に置く場所がないので、おそらく長いコードを書く必要があります。

関連する問題