我正在将一些物理模拟代码从 C++ 移植到 CUDA。
基本算法可以理解为:对向量的每个元素应用一个算子。在伪代码中,模拟可能包括以下内核调用:
apply(Operator o, Vector v){
...
}
例如:
apply(add_three_operator, some_vector)
将为向量中的每个元素添加三个。
在我的 C++ 代码中,我有一个抽象基类 Operator,具有许多不同的具体实现。重要的方法是 class Operator{ virtual double opera(double x) =0; 运算符 compose(运算符 lo,运算符 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;
}
};
运算符类具有缩放和组合运算符具体实现的方法。这种抽象让我可以简单地将“叶”运算符组合成更一般的转换。
例如:
apply(compose(add_three_operator, square_operator), some_vector);
将添加三个然后平方向量的每个元素。
问题是 CUDA 不支持内核中的虚拟方法调用。我目前的想法是使用模板。然后内核调用看起来像:
apply<Composition<AddOperator,SquareOperator>>
(compose(add_three_operator, square_operator), some_vector);
有什么建议么?