我有一个使用Eigen开发的项目,该项目实现了多种HPC方法,例如优化,最初是针对CPU。随着代码的增长,我将只有CPU的特征类型MatrixXd和VectorXd作为公共接口的一部分,例如
/// Base abstract definition for a System Solver strategy.
/**
* Base abstract definition for a System Solver strategy.
*/
class SolverInterface {
private:
DISALLOW_COPY_AND_ASSIGN(SolverInterface);
public:
/// Default constructor
/**
* Default empty constructor
*/
SolverInterface() { /* empty */ }
/// Solves the given system either determined or over-determined.
/**
* Solves the given system either determined or over-determined and returns
* the solution.
*
* \param A squared or overdetermined matrix
* \param b vector of responses
*/
virtual const VectorXd& solve(const MatrixXd& A, const VectorXd& b) = 0;
/// Destructor
/**
* Destructor
*/
virtual ~SolverInterface() { /* empty */ }
};
此时我还希望为许多算法提供原生GPU实现,因此需要以某种方式更改抽象接口。然而,最佳设计策略是什么并不是非常清楚,这是对可能性的总结:
virtual double* solve(double* d_A, int m, int n, double* d_b) = 0;
。
SolverInterface
更改为模板类,将Matrix和Vector类型作为模板参数。
updateHost()
和updateDevice()
来回同步:
任何其他建议,也许是一些使用特征的聪明设计?
对于可能性#2,将以以下协变分配问题结束:
// this will not compile!
SolverInterface<?,?>* solver = NULL;
if (CPU) {
// extends SolverInterface<MatrixXd,VectorXd>
solver = new CPULeastSquaresSolver();
} else {
// extends SolverInterface<double*,double*>
solver = new GPULeastSquaresSolver();
}