From: Gunter Winkler (guwi17_at_[hidden])
Date: 2008-02-11 13:49:39
Am Montag, 11. Februar 2008 09:21 schrieb Michael Lehn:
> > BTW. Did you run the comparison in 32 or 64-Bit mode?
> For the sparse matrix-vector product I wrote a simple implementation
> crs_gemv as shown on
> r = b-Ax is equivalent to copy and crs_gemv (4.7s)
> r = Ax-b is equivalent to crs_gemv and axpy (5.3s)
> As vectors are dense for copy and axpy BLAS gets used. In this case
> ATLAS which (compared to MKL) is not so good for axpy.
This means you used 32 Bit integers for the index arrays, right? uBLAS
by default uses std::size_t which is 64 Bit. Please try this type which
is the usual row major compressed matrix with 32 Bit indices.
// type of stiffnes matrix
boost::numeric::ublas::basic_row_major<unsigned int, int>,
> By the way: for small matrices and vectors the performance of uBLAS
> ist much better than that of ATLAS, MKL, ... So I think some hybrid
> approach might be interesting ...
for small fixed size matrices I suggest http://tvmet.sourceforge.net/ .
For medium size matrices ublas might be comparable to BLAS, but in my
last tests the limit was around 100x100 ...
> is there a better way to initialize a compressed sparse matrix in
> arbitrary order?
Personally, I use a coordinate matrix for assembly and then compress it.
Unfortunately the current implementation requires a copy of the data. I
did some experiments to compress the matrix 'in place' but the
performance gain was quite small compared to the additional complexity.
Alternatively one can use a vector of compressed or coordinate vectors.
The uBLAS type is
which is quite efficient for random insertions.