我正在将一些物理模拟代码从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)
有什么建议?