1

Eigen3 線形代数ライブラリをラップして、その構文がよりクリーンになるようにしています。ただし、最初のステップとして、(+= オーバーロードを介して) + 演算子のオーバーロードを作成すると、ラッパーのパフォーマンスがすぐに 3 倍低下します。問題が発生した場所と修正方法について、いくつかの洞察を提供していただけますか? ありがとう。

#include <iostream>
#include <ctime>
using namespace std;
#include "Eigen\Eigen"

class Wmat
{
    Eigen::ArrayXXd M;
public:
    Wmat& operator+=(const Wmat& rhs)
        {this->M += rhs.M; return *this;}
    const Wmat operator+(const Wmat &rhs2)
        {Wmat result = *this; result+= rhs2; return result;}
    void Random(int D1, int D2)
        {M = Eigen::ArrayXXd::Random(D1,D2);}
};

int main()
{
    int D = 1000000;
    int T=1000;
    clock_t start;
//---------------------------------------------------------------
    Eigen::ArrayXXd LHS = Eigen::ArrayXXd::Random(D,1);
    Eigen::ArrayXXd RHS1 = Eigen::ArrayXXd::Random(D,1);
    Eigen::ArrayXXd RHS2 = Eigen::ArrayXXd::Random(D,1);
    start = clock();
    for (int i=1; i<=T; ++i)
    {
        LHS = RHS1 + RHS2;
    }
    cout << (clock()-start) / (double) CLOCKS_PER_SEC << endl;
//---------------------------------------------------------------
    Wmat LHSW, RHSW1, RHSW2;
    RHSW1.Random(D,1); RHSW2.Random(D,1); LHSW.Random(D,1);
    start = clock();
    for (int i=1; i<=T; ++i)
    {
        LHSW = RHSW1 + RHSW2;
    }
    cout << (clock()-start) / (double) CLOCKS_PER_SEC << endl;
//---------------------------------------------------------------
    return 0;
}
4

1 に答える 1

1

ラッパーの記述は、式テンプレートでは機能しません。たとえば、追加したメソッドは、内で明示的に評価しない限りWmat使用できないため、Eigen の多くの機能が失われます。古い行列/ベクトル ライブラリと互換性を持たせるための正しいアプローチは、Eigen のプラグイン メカニズムを活用することです。このメカニズムにより、Eigen のオブジェクトと式のクラス定義内に直接新しいメンバーを追加できます。詳細はこちらのページをご覧ください。a+bWmat

于 2014-12-03T21:15:19.983 に答える