私は(my full, working boost codeを参照)boost::numeric::ublas::matrix
でなぜブースト行列の乗算が私よりも遅いのですか?
Result result = read();
boost::numeric::ublas::matrix<int> C;
C = boost::numeric::ublas::prod(result.A, result.B);
と標準アルゴリズムで別の1(full standard codeを参照)1行列の乗算を実装している:これは私が速度をテストする方法です
vector< vector<int> > ijkalgorithm(vector< vector<int> > A,
vector< vector<int> > B) {
int n = A.size();
// initialise C with 0s
vector<int> tmp(n, 0);
vector< vector<int> > C(n, tmp);
for (int i = 0; i < n; i++) {
for (int k = 0; k < n; k++) {
for (int j = 0; j < n; j++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
を:
time boostImplementation.out > boostResult.txt
diff boostResult.txt correctResult.txt
time simpleImplementation.out > simpleResult.txt
diff simpleResult.txt correctResult.txt
どちらのプログラムも、2つの2000 x 2000 matri ces。 両方のプログラムは、これらのフラグでコンパイルされた:
g++ -std=c++98 -Wall -O3 -g $(PROBLEM).cpp -o $(PROBLEM).out -pedantic
私は私の実装と4 分以上のブースト実装のためのため15秒を持って!
編集:
g++ -std=c++98 -Wall -pedantic -O3 -D NDEBUG -DBOOST_UBLAS_NDEBUG library-boost.cpp -o library-boost.out
でそれをコンパイルした後、私はIKJ-アルゴリズムとブーストのため60.99秒ため28.19秒を得ました。 Boostはまだかなり遅いです。
ブーストが私の実装よりもずっと遅いのはなぜですか?
ホイールを再発明する唯一の良いアイデアは、より良いホイールを作ることができるときです。 – Mysticial
Boost.uBLASは標準の_interface_であり、堅牢な_implementation_ではないため、速くないとは思わないあなたは、例えば、 LAPACKのバックエンド。 – ildjarn
ブーストuBLASにはオプションのデバッグチェック機能があります。このFAQを参照してください。http://www.boost.org/doc/libs/1_49_0/libs/numeric/ublas/doc/index.htm、プリプロセッサマクロBOOST_UBLAS_NDEBUGとNDEBUGを確認してください – TJD