如何使用CUDA正确实现每个元素的执行函数?

时间:2016-04-25 10:33:58

标签: c++ c++11 cuda

我有一个代表一个或几个对象容器的类。该类提供了为每个元素运行回调的函数。一个简单的实现可能如下所示:

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中分配记忆 - 当然是可以接受的方式。

我认为一个最小的例子会非常有用。

1 个答案:

答案 0 :(得分:1)

在开始编写C风格CUDA内核函数之前,您可以检查Thrust库。它是CUDA的一部分,为简单的GPU算法开发提供高级摘要。

这是一个代码示例,用于显示函数对象和带推力的lamda表达式。

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

即使使用Thrust,您仍然需要使用__device____host__来请求编译器为您生成设备代码和主机代码。由于无法将它们放在标准C ++ lamda表达式中,因此您可能需要编写更长的代码。