如何在CUDA中使用多态性

use*_*717 6 polymorphism cuda

我正在将一些物理模拟代码从C++移植到CUDA.

基本算法可以理解为:将运算符应用于向量的每个元素.在伪代码中,模拟可能包括以下内核调用:

apply(Operator o, Vector v){
    ...
}
Run Code Online (Sandbox Code Playgroud)

例如:

apply(add_three_operator, some_vector)
Run Code Online (Sandbox Code Playgroud)

将为向量中的每个元素添加三个.

在我的C++代码中,我有一个抽象的基类Operator,有许多不同的具体实现.重要的方法是类Operator {virtual double operate(double x)= 0; 操作员撰写(操作员,操作员ro); ...}

AddOperator的实现可能如下所示:

class AddOperator : public Operator{
    private:
        double to_add;
    public:
        AddOperator(double to_add): to_add(to_add){}
        double operator(double x){
            return x + to_add;
        }
};
Run Code Online (Sandbox Code Playgroud)

运算符类具有用于缩放和组合Operator的具体实现的方法.这种抽象允许我简单地将"叶子"运算符组合成更一般的变换.

例如:

apply(compose(add_three_operator, square_operator), some_vector);
Run Code Online (Sandbox Code Playgroud)

将添加三个然后平方向量的每个元素.

问题是CUDA不支持内核中的虚方法调用.我目前的想法是使用模板.然后内核调用看起来像:

apply<Composition<AddOperator,SquareOperator>>
    (compose(add_three_operator, square_operator), some_vector);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

tun*_*unc 2

也许是这样的事情...

template <class Op1, class Op2>
class Composition {...}

template <class Op1, class Op2>
Composition<Op1, Op2> compose(Op1& op1, Op2& op2) {...}

template<class C>
void apply(C& c, VecType& vec){...}
Run Code Online (Sandbox Code Playgroud)