我将把一些物理模拟代码从C++移植到CUDA。
基本算法可以理解为:对向量的每个元素应用一个运算符。在伪代码中,模拟可能包括以下内核调用:
例如:
有什么建议吗?
基本算法可以理解为:对向量的每个元素应用一个运算符。在伪代码中,模拟可能包括以下内核调用:
apply(Operator o, Vector v){
...
}
例如:
apply(add_three_operator, some_vector)
我将向向量中的每个元素添加三。
在我的C++代码中,我有一个抽象基类Operator,其中包含许多不同的具体实现。重要的方法是:
class Operator{ virtual double operate(double x) =0; Operator compose(Operator lo, Operator ro); ... }
加法运算符的实现可能如下所示:
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);
有什么建议吗?
virtual
函数需要使用-arch=sm_20
或更高版本进行编译。但是,我建议将多态性隔离到启动内核的主机代码中。即使您最终使事情编译成功,我也预计在 SIMD 代码中虚函数分派的性能会令人失望。 - Jared Hoberock