如何在CUDA中使用多态性

时间:2013-07-23 21:28:05

标签: cuda polymorphism

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

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

apply(Operator o, Vector v){
    ...
}

例如:

apply(add_three_operator, some_vector)

会向向量中的每个元素添加三个。

在我的C ++代码中,我有一个抽象的基类Operator,有许多不同的具体实现。重要的方法是     class Operator {         虚拟双重操作(双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;
        }
};

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

例如:

apply(compose(add_three_operator, square_operator), some_vector);

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

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

apply<Composition<AddOperator,SquareOperator>>
    (compose(add_three_operator, square_operator), some_vector);

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这样的事可能......

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){...}