Почему умножение матриц бустов медленнее, чем у меня?

Я реализовал одно матричное умножение с помощью boost::numeric::ublas::matrix(см. мой полный рабочий код повышения )

Result result = read ();

boost::numeric::ublas::matrix C;
C = boost::numeric::ublas::prod(result.A, result.B);

и еще одна со стандартным алгоритмом (см. полный стандартный код):

vector< vector > ijkalgorithm(vector< vector > A, 
                                    vector< vector > B) {
    int n = A.size();

    // initialise C with 0s
    vector tmp(n, 0);
    vector< vector > 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

Обе программы читают жестко закодированный текстовый файл, содержащий два файла размером 2000 x 2000. матрицы.Обе программы были скомпилированы с такими флагами:

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

Я получил 15 секунддля своей реализации и более 4 минутдля буст-реализации!

edit: после компиляции с помощью

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

я получил 28,19 секунддля ikj-алгоритма и 60,99 секунддля Boost. Таким образом, Boost все еще значительно медленнее.

Почему ускорение намного медленнее моей реализации?

46
задан Martin Thoma 3 July 2012 в 10:31
поделиться