¿Por qué es más lenta la multiplicación de matrices que la mía?

He implementado una multiplicación de matrices conboost::numeric::ublas::matrix (verMi código de impulso completo, de trabajo)

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 (vercódigo estándar completo):

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;
}

Así es como pruebo 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 de 2000 x 2000. Ambos programas fueron compilados con estas banderas:

g++ -std=c++98 -Wall -O3 -g $(PROBLEM).cpp -o $(PROBLEM).out -pedantic

tengo15 segundos para mi implementación y más4 minutos para la aplicación de impulso!

Edición: Después de compilarlo con

g++ -std=c++98 -Wall -pedantic -O3 -D NDEBUG -DBOOST_UBLAS_NDEBUG library-boost.cpp -o library-boost.out

tengo28.19 segundos para el algoritmo ikj y60.99 segundos para Boost. Así que Boost sigue siendo considerablemente más lento.

¿Por qué el impulso es mucho más lento que mi implementación?

Respuestas a la pregunta(3)

Su respuesta a la pregunta