我有一个代表一个或几个对象容器的类。该类提供了为每个元素运行回调的函数。一个简单的实现可能如下所示:
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中lambdas允许的内容,而且我也不确定__device__
和__host__
的编译。
我可以(并且可能必须)更改MyData
,但我想在驱动代码中没有CUDA背景的痕迹,除了我必须在CUDA中分配记忆 - 当然是可以接受的方式。
我认为一个最小的例子会非常有用。
答案 0 :(得分:1)
在开始编写C风格CUDA内核函数之前,您可以检查Thrust库。它是CUDA的一部分,为简单的GPU算法开发提供高级摘要。
这是一个代码示例,用于显示函数对象和带推力的lamda表达式。
https://github.com/thrust/thrust/blob/master/examples/lambda.cu
即使使用Thrust,您仍然需要使用__device__
和__host__
来请求编译器为您生成设备代码和主机代码。由于无法将它们放在标准C ++ lamda表达式中,因此您可能需要编写更长的代码。