/* ---------------------------------------------------------------------------- * GTSAM Copyright 2010, Georgia Tech Research Corporation, * Atlanta, Georgia 30332-0415 * All Rights Reserved * Authors: Frank Dellaert, et al. (see THANKS for the full author list) * See LICENSE for the license information * -------------------------------------------------------------------------- */ /** * @file timeublas.cpp * @brief Tests to help determine which way of accomplishing something in ublas is faster * @author Richard Roberts * @created Sep 18, 2010 */ #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; namespace ublas = boost::numeric::ublas; using boost::timer; using boost::format; using namespace boost::lambda; static boost::variate_generator > rng(boost::mt19937(), boost::uniform_real<>(-1.0, 0.0)); typedef ublas::matrix matrix; typedef ublas::matrix_range matrix_range; using ublas::range; using ublas::triangular_matrix; int main(int argc, char* argv[]) { if(false) { cout << "\nTiming matrix_range:" << endl; // We use volatile here to make these appear to the optimizing compiler as // if their values are only known at run-time. volatile size_t m=500; volatile size_t n=300; volatile size_t nReps = 1000; assert(m > n); boost::variate_generator > rni(boost::mt19937(), boost::uniform_int(0,m-1)); boost::variate_generator > rnj(boost::mt19937(), boost::uniform_int(0,n-1)); matrix mat(m,n); matrix_range full(mat, range(0,m), range(0,n)); matrix_range top(mat, range(0,n), range(0,n)); matrix_range block(mat, range(m/4, m-m/4), range(n/4, n-n/4)); cout << format(" Basic: %1%x%2%\n") % m % n; cout << format(" Full: mat(%1%:%2%, %3%:%4%)\n") % 0 % m % 0 % n; cout << format(" Top: mat(%1%:%2%, %3%:%4%)\n") % 0 % n % 0 % n; cout << format(" Block: mat(%1%:%2%, %3%:%4%)\n") % size_t(m/4) % size_t(m-m/4) % size_t(n/4) % size_t(n-n/4); cout << endl; { timer tim; double basicTime, fullTime, topTime, blockTime; cout << "Row-major matrix, row-major assignment:" << endl; // Do a few initial assignments to let any cache effects stabilize for(size_t rep=0; rep<1000; ++rep) for(size_t i=0; i ij_t; vector ijs(100000); cout << "Row-major matrix, random assignment:" << endl; // Do a few initial assignments to let any cache effects stabilize for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni(),rnj())); for(size_t rep=0; rep<1000; ++rep) BOOST_FOREACH(const ij_t& ij, ijs) { mat(ij.first, ij.second) = rng(); } for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni(),rnj())); for(size_t rep=0; rep<1000; ++rep) BOOST_FOREACH(const ij_t& ij, ijs) { mat(ij.first, ij.second) = rng(); } basicTime = tim.elapsed(); cout << format(" Basic: %1% mus/element") % double(1000000 * basicTime / double(ijs.size()*nReps)) << endl; for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni(),rnj())); for(size_t rep=0; rep<1000; ++rep) BOOST_FOREACH(const ij_t& ij, ijs) { full(ij.first, ij.second) = rng(); } fullTime = tim.elapsed(); cout << format(" Full: %1% mus/element") % double(1000000 * fullTime / double(ijs.size()*nReps)) << endl; for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%top.size1(),rnj())); for(size_t rep=0; rep<1000; ++rep) BOOST_FOREACH(const ij_t& ij, ijs) { top(ij.first, ij.second) = rng(); } topTime = tim.elapsed(); cout << format(" Top: %1% mus/element") % double(1000000 * topTime / double(ijs.size()*nReps)) << endl; for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%block.size1(),rnj()%block.size2())); for(size_t rep=0; rep<1000; ++rep) BOOST_FOREACH(const ij_t& ij, ijs) { block(ij.first, ij.second) = rng(); } blockTime = tim.elapsed(); cout << format(" Block: %1% mus/element") % double(1000000 * blockTime / double(ijs.size()*nReps)) << endl; cout << endl; } } if(true) { cout << "\nTesting square triangular matrices:" << endl; typedef triangular_matrix triangular; typedef ublas::matrix matrix; triangular tri(5,5); matrix mat(5,5); for(size_t j=0; j(mat); cout << " Assigned from triangular adapter: " << tri << endl; cout << " Triangular adapter of mat: " << ublas::triangular_adaptor(mat) << endl; for(size_t j=0; j(mat)) = tri; cout << " Assign triangular adaptor from triangular: " << mat << endl; } { cout << "\nTesting wide triangular matrices:" << endl; typedef triangular_matrix triangular; typedef ublas::matrix matrix; triangular tri(5,7); matrix mat(5,7); for(size_t j=0; j(mat); cout << " Assigned from triangular adapter: " << tri << endl; cout << " Triangular adapter of mat: " << ublas::triangular_adaptor(mat) << endl; for(size_t j=0; j(mat); cout << " Assign matrix from triangular adaptor of self: " << mat << endl; } { cout << "\nTesting subvectors:" << endl; typedef ublas::matrix matrix; matrix mat(4,4); for(size_t j=0; j