Ich habe eine Matrix-Multiplikation mit boost::numeric::ublas::matrix
implementiertWarum ist die Matrixmultiplikation langsamer als meine?
Result result = read();
boost::numeric::ublas::matrix<int> C;
C = boost::numeric::ublas::prod(result.A, result.B);
und ein anderer mit dem Standard-Algorithmus (my full, working boost code sehen) (siehe full standard code):
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;
}
Dies ist, wie ich die Geschwindigkeit testen:
time boostImplementation.out > boostResult.txt
diff boostResult.txt correctResult.txt
time simpleImplementation.out > simpleResult.txt
diff simpleResult.txt correctResult.txt
Beide Programme lesen eine hartcodierte Textdatei, die zwei 2000 x 2000 matri enthält ces. Beide Programme wurden mit diesen Flags zusammengestellt:
g++ -std=c++98 -Wall -O3 -g $(PROBLEM).cpp -o $(PROBLEM).out -pedantic
Ich habe 15 Sekunden für meine Implementierung und über 4 Minuten für die Boost-Implementierung! Ich habe 28,19 Sekunden für den ikj-Algorithmus und 60,99 Sekunden für Boost-Nachdem es mit
g++ -std=c++98 -Wall -pedantic -O3 -D NDEBUG -DBOOST_UBLAS_NDEBUG library-boost.cpp -o library-boost.out
Kompilieren:
bearbeiten. Boost ist also immer noch deutlich langsamer.
Warum ist Boost so viel langsamer als meine Implementierung?
Die einzige Zeit, das Rad neu zu erfinden ist eine gute Idee ist, wenn Sie ein besseres Rad machen können ... – Mysticial
Boost.uBLAS soll ein Standard _interface_ sein, nicht eine robuste _implementation_, also erwarten Sie nicht, dass es schnell ist, es sei denn Du verwendest zB das LAPACK-Backend. – ildjarn
Boost uBLAS hat einige optionale Debug-Checks, die die Dinge verlangsamen. Siehe diese FAQ http://www.boost.org/doc/libs/1_49_0/libs/numeric/ublas/doc/index.htm, und prüfe die Präprozessormakros BOOST_UBLAS_NDEBUG und NDEBUG – TJD