|
Boost : |
Subject: [boost] performance of a linear algebra/matrix library
From: DE (satan66613_at_[hidden])
Date: 2010-05-06 13:02:40
hi all
i work on a linear algebra library with an intent to propose it for
inclusion into boost collection of libs
so my question is: how fast such a lib should be to make everybody
happy?
i found that to increase the performance of a generic linear algebra
library one must complicate the implementation to a very high degree
(though this statement should be obvious to everyone)
i struggled with poor performance of matrix multiplication and finally
identified the bottleneck
i improved the implementation (seriosly complicating it, i'm afraid i
will forget how it works in a month) and now it performs some 33%
slower than C code for virtually any size of matrix
the C code is as follows:
typedef double type;
const size_t n = 42;
type
*a = new type[n*n],
*a1 = new type[n*n],
*a2 = new type[n*n];
//filling 'a1' and 'a2'
for (size_t i = 0; i<n; ++i)
{
type * const a_i = a + i*n;
for (size_t j = 0; j<n; ++j)
a_i[j] = 0.;
for (size_t k = 0; k<n; ++k)
{
type *a = a_i;
const type a1_ik = a1[i*n + k];
const type *a2_k = a2 + k*n;
for (size_t j = 0; j<n; ++j, ++a, ++a2_k)
*a += a1_ik*(*a2_k);
}
}
the C++ code is just
matrix<type> m(n, n), m1(n, n), m2(n, n);
//filling 'm1' and 'm2'
m.assign(m1, m2);
more detailed results:
'n' is the dimensions of matrices, 'ratio' is runtime of C++ code
divided by runtime of C code (time_cpp/time_c)
n | 2 | 4 | 8 | 16 | 32 | 64 | 128 | 256 | 512 | 1024 | 2048
ratio | 1,77 | 1,57 | 1,34 | 1,12 | 1,05 | 1,12 | 1,32 | 1,33 | 1,23 | 1,23 | 1,23
as you can see starting with 8 by 8 matices C++ code is roughly 33%
slower than C code
is that enough to make you (the reader) happy?
-- Pavel
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk