Boost logo

Ublas :

Subject: Re: [ublas] matrix row/column iterate
From: Kraus Philipp (philipp.kraus_at_[hidden])
Date: 2010-07-09 09:17:23


Am 09.07.2010 um 14:31 schrieb Nasos Iliopoulos:

> Phillipp,
>
> 1. If your question refers to whether you should use iterators, or
> indexing, it is mostly a matter of taste. The indexing operation
> i*size_j+j, compiles to only one operation (multiply-add) in any
> sensible compiler so there is no penalty from using it. In any case
> for algebraic legacy reasons I prefer indexing over iterators,
> although iterators may give you better generality and some cleaner
> assembly code (if you care about that). I think that some tests in
> the past indicated that indexing was in fact faster than iterators,
> but I can't justify it atm.

That' a nice comment. I use Visual Studio and G++ for compiling my
application. I think I will use iterators, because it create a little
bit cleaner code

> 2. If you refer to the trasversing order:
> If your matrix is row_major (default), then the inner loop should be
> over the columns (i.e. the second index). That is because when the
> loop is executed, data is transfered in blocks from the main memory
> to the CPU's local cache and since you have a block there, you want
> to do all the possible operations on it before you are done with it
> (and it is send back to the main memory). Now if the matrix is small
> enough to fit in the cache (say up to 2MB in practice), this will
> not be a problem.

For testing I have matrix with around 10k rows and 2-20 columns
(doube, float or long double values), at the moment I use code like
for(i=0; i < matrix.size1(), ++i) {
      blas::outer_prod / inner_prod(ublas::row(matrix, i),
ublas::row(data,i));
}

In reality the row size is more than 10k (average 50-80k) and column
size is around 60 columns (worst case 1000). I must use only the outer
and inner products for row vectors, so I would prefere indexing and
row-order matrix.

Thanks

Phil