私はオブジェクトの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バックグラウンドの痕跡はありません。
私は最小限の例が非常に役に立つと思います。
おそらく私はそれを逃しましたが、あなたは実際にどこかで質問をしましたか? – talonmies
まあ...私はそれをどうすればいいのか尋ねます。さらに、おそらく最小の例がこの質問に最もよく答えるだろうと私は言う。 – Michael
CUDAに同梱されているThrustライブラリには、ユーザーが提供する関数や関数を使ってGPUメモリ内の反復可能なシーケンスで動作する 'std :: for_each'の実装が既にあります。それは助けになるだろうか? – talonmies