私は、行列乗算、行列逆行列、加算などの限られた一連の主要な線形代数演算を広範に使用(高頻度)するプロジェクトを持っています。これらの演算は、これらのさまざまなライブラリのさまざまな方法に対応するためにビジネスロジックコードを再コンパイルせずにベンチマークしたいと思っている非線形代数ライブラリです。ラッパークラスのC++効率的な実装
私はこれらの操作を残りのコードに対して標準化するために、これらのライブラリ全体の抽象としてラッパークラスを調整する最もスマートな方法を考え出すことに興味があります。私の現在のアプローチは、Curiously Recurring Template Patternと、C++ 11 gccが適切な状況下で仮想関数をインライン化するのに十分スマートであるという事実に依存しています。
これは、ビジネスロジックに利用できるようになりますラッパーインタフェースである:
template <class T>
class ITensor {
virtual void initZeros(uint32_t dim1, uint32_t dim2) = 0;
virtual void initOnes(uint32_t dim1, uint32_t dim2) = 0;
virtual void initRand(uint32_t dim1, uint32_t dim2) = 0;
virtual T mult(T& t) = 0;
virtual T add(T& t) = 0;
};
そしてここでは、例えば使用してそのインターフェイスの実装ですアルマジロ
template <typename precision>
class Tensor : public ITensor<Tensor<precision> >
{
public:
Tensor(){}
Tensor(arma::Mat<precision> mat) : M(mat) { }
~Tensor(){}
inline void initOnes(uint32_t dim1, uint32_t dim2) override final
{ M = arma::ones<arma::Mat<precision> >(dim1,dim2); }
inline void initZeros(uint32_t dim1, uint32_t dim2) override final
{ M = arma::zeros<arma::Mat<precision> >(dim1,dim2);}
inline void initRand(uint32_t dim1, uint32_t dim2) override final
{ M = arma::randu<arma::Mat<precision> >(dim1,dim2);}
inline Tensor<precision> mult(Tensor<precision>& t1) override final
{
Tensor<precision> t(M * t1.M);
return t;
}
inline Tensor<precision> add(Tensor<precision>& t1) override final
{
Tensor<precision> t(M + t1.M);
return t;
}
arma::Mat<precision> M;
};
質問:
- それは、このシナリオでCRTPとインライン化を使用する意味がありますか?
- これは、パフォーマンスの最適化に関して改善できますか?
答えで指摘したように、多態性の使用は基本クラスのテンプレート化のために少し奇妙です。
「ArmadilloTensor」のようなより具体的なものではなく、基本クラスの名前が「Tensor」であることがわかります(基本的に、Armadilloメソッドを使用するITensorメソッドを実装しています)。私の現在のデザインによれば、多形性の使用は何よりも形式主義の感覚によるものであるため、名前をそのまま残しました。計画は、プロジェクトコードがITensorで指定された機能を提供するTensorというクラスを認識することです。私がベンチマークしたい新しいライブラリごとに、新しいコンパイル単位に新しい "Tensor"クラスを書き、コンパイル結果を.aアーカイブにパッケージ化し、ベンチマークテストを行うときにビジネスロジックコードをリンクしますその図書館に対して異なる実装間を切り替えることで、どのTensor実装をリンクするかが決まります。ベースコードには、TensorメソッドがArmadilloやその他のもので実装されているかどうかは同じです。利点:すべてのライブラリ(すべて独立している)を知っているコードを避け、新しい実装を使用するためにベースコードにコンパイル時の変更を必要としません。だから、なぜ多型ですか?私の考えでは、ベンチマークに追加された新しいライブラリによって実装される必要がある関数を何らかの形で形式化したかっただけです。実際には、基本コードは関数パラメータでITセンサと連携しますが、メソッド本体自体のTensorsに潜在的にstatic_castします。
ありがとう、名前が変更されました。 – nescience
1については、頻繁に呼び出されるメソッドがインライン化されていると、コンテキストの変更が少なくなったため、パフォーマンスが向上するはずです。 – Rodrigo