he implementado una multiplicación de matrices con boost::numeric::ublas::matrix
(ver my full, working boost code)¿Por qué aumenta la multiplicación de matrices más lenta que la mía?
Result result = read();
boost::numeric::ublas::matrix<int> C;
C = boost::numeric::ublas::prod(result.A, result.B);
y otro con el algoritmo estándar (ver 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;
}
Éste es cómo probar la velocidad:
time boostImplementation.out > boostResult.txt
diff boostResult.txt correctResult.txt
time simpleImplementation.out > simpleResult.txt
diff simpleResult.txt correctResult.txt
Ambos programas leen un archivo de texto codificado que contiene dos matrices 2000 x 2000 ces. Ambos programas fueron compilados con estas banderas:
g++ -std=c++98 -Wall -O3 -g $(PROBLEM).cpp -o $(PROBLEM).out -pedantic
que tiene 15 segundos para mi aplicación y otra 4 minutos para el impulso a la ejecución!
edición: Después de compilar con
g++ -std=c++98 -Wall -pedantic -O3 -D NDEBUG -DBOOST_UBLAS_NDEBUG library-boost.cpp -o library-boost.out
llegué 28,19 segundos para la ikj-algoritmo y 60,99 segundos de Boost. Entonces, Boost sigue siendo considerablemente más lento.
¿Por qué el impulso es mucho más lento que mi implementación?
La única vez que reinventar la rueda es una buena idea es cuando se puede hacer una rueda mejor ... – Mysticial
Boost.uBLAS está destinado a ser una _interfaz _ estándar, no una _implementación_ robusta, así que no espere que sea rápida a menos que estás usando, por ejemplo el back-end de LAPACK. – ildjarn
Boost uBLAS tiene alguna comprobación de depuración opcional que ralentizará las cosas. Consulte estas preguntas frecuentes http://www.boost.org/doc/libs/1_49_0/libs/numeric/ublas/doc/index.htm, y compruebe las macros del preprocesador BOOST_UBLAS_NDEBUG y NDEBUG – TJD