mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-11 19:29:02 +08:00
add support for ublas
This commit is contained in:
parent
ec32d2c807
commit
611fc17894
@ -26,7 +26,7 @@ typedef SparseMatrix<Scalar> EigenSparseMatrix;
|
|||||||
|
|
||||||
void fillMatrix(float density, int rows, int cols, EigenSparseMatrix& dst)
|
void fillMatrix(float density, int rows, int cols, EigenSparseMatrix& dst)
|
||||||
{
|
{
|
||||||
dst.reserve(rows*cols*density);
|
dst.reserve(double(rows)*cols*density);
|
||||||
for(int j = 0; j < cols; j++)
|
for(int j = 0; j < cols; j++)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < rows; i++)
|
for(int i = 0; i < rows; i++)
|
||||||
@ -122,22 +122,24 @@ void eiToCSparse(const EigenSparseMatrix& src, cs* &dst)
|
|||||||
#include <boost/numeric/ublas/matrix_sparse.hpp>
|
#include <boost/numeric/ublas/matrix_sparse.hpp>
|
||||||
#include <boost/numeric/ublas/vector_of_vector.hpp>
|
#include <boost/numeric/ublas/vector_of_vector.hpp>
|
||||||
#include <boost/numeric/ublas/operation.hpp>
|
#include <boost/numeric/ublas/operation.hpp>
|
||||||
// #include <boost/numeric/ublas/sparse_prod.hpp>
|
|
||||||
|
|
||||||
// using namespace boost;
|
typedef boost::numeric::ublas::compressed_matrix<Scalar,boost::numeric::ublas::column_major> UBlasSparse;
|
||||||
// using namespace boost::numeric;
|
|
||||||
// using namespace boost::numeric::ublas;
|
|
||||||
|
|
||||||
typedef boost::numeric::ublas::compressed_matrix<Scalar,boost::numeric::ublas::column_major> UblasMatrix;
|
void eiToUblas(const EigenSparseMatrix& src, UBlasSparse& dst)
|
||||||
|
|
||||||
void eiToUblas(const EigenSparseMatrix& src, UblasMatrix& dst)
|
|
||||||
{
|
{
|
||||||
|
dst.resize(src.rows(), src.cols(), false);
|
||||||
for (int j=0; j<src.cols(); ++j)
|
for (int j=0; j<src.cols(); ++j)
|
||||||
for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)
|
for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it)
|
||||||
dst(it.index(),j) = it.value();
|
dst(it.index(),j) = it.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename EigenType, typename UblasType>
|
||||||
|
void eiToUblasVec(const EigenType& src, UblasType& dst)
|
||||||
|
{
|
||||||
|
dst.resize(src.size());
|
||||||
|
for (int j=0; j<src.size(); ++j)
|
||||||
|
dst[j] = src.coeff(j);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OSKI
|
#ifdef OSKI
|
||||||
|
@ -69,4 +69,24 @@ void eiToGsl(const EigenMatrixType& src, gsl_matrix** dst)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BENCH_UBLAS
|
||||||
|
#include <boost/numeric/ublas/matrix.hpp>
|
||||||
|
#include <boost/numeric/ublas/vector.hpp>
|
||||||
|
template <typename EigenMatrixType, typename UblasMatrixType>
|
||||||
|
void eiToUblas(const EigenMatrixType& src, UblasMatrixType& dst)
|
||||||
|
{
|
||||||
|
dst.resize(src.rows(),src.cols());
|
||||||
|
for (int j=0; j<src.cols(); ++j)
|
||||||
|
for (int i=0; i<src.rows(); ++i)
|
||||||
|
dst(i,j) = src.coeff(i,j);
|
||||||
|
}
|
||||||
|
template <typename EigenType, typename UblasType>
|
||||||
|
void eiToUblasVec(const EigenType& src, UblasType& dst)
|
||||||
|
{
|
||||||
|
dst.resize(src.size());
|
||||||
|
for (int j=0; j<src.size(); ++j)
|
||||||
|
dst[j] = src.coeff(j);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // EIGEN_BENCH_UTIL_H
|
#endif // EIGEN_BENCH_UTIL_H
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
// -DNOGMM -DNOMTL -DCSPARSE
|
// -DNOGMM -DNOMTL -DCSPARSE
|
||||||
// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a
|
// -I /home/gael/Coding/LinearAlgebra/CSparse/Include/ /home/gael/Coding/LinearAlgebra/CSparse/Lib/libcsparse.a
|
||||||
#ifndef SIZE
|
#ifndef SIZE
|
||||||
#define SIZE 10000
|
#define SIZE 650000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DENSITY
|
#ifndef DENSITY
|
||||||
@ -62,7 +62,8 @@ int main(int argc, char *argv[])
|
|||||||
BenchTimer timer;
|
BenchTimer timer;
|
||||||
for (float density = DENSITY; density>=MINDENSITY; density*=0.5)
|
for (float density = DENSITY; density>=MINDENSITY; density*=0.5)
|
||||||
{
|
{
|
||||||
fillMatrix(density, rows, cols, sm1);
|
//fillMatrix(density, rows, cols, sm1);
|
||||||
|
fillMatrix2(7, rows, cols, sm1);
|
||||||
|
|
||||||
// dense matrices
|
// dense matrices
|
||||||
#ifdef DENSEMATRIX
|
#ifdef DENSEMATRIX
|
||||||
@ -76,14 +77,14 @@ int main(int argc, char *argv[])
|
|||||||
for (int k=0; k<REPEAT; ++k)
|
for (int k=0; k<REPEAT; ++k)
|
||||||
v2 = m1 * v1;
|
v2 = m1 * v1;
|
||||||
timer.stop();
|
timer.stop();
|
||||||
std::cout << " a * v:\t" << timer.value() << endl;
|
std::cout << " a * v:\t" << timer.best() << " " << double(REPEAT)/timer.best() << " * / sec " << endl;
|
||||||
|
|
||||||
timer.reset();
|
timer.reset();
|
||||||
timer.start();
|
timer.start();
|
||||||
for (int k=0; k<REPEAT; ++k)
|
for (int k=0; k<REPEAT; ++k)
|
||||||
v2 = m1.transpose() * v1;
|
v2 = m1.transpose() * v1;
|
||||||
timer.stop();
|
timer.stop();
|
||||||
std::cout << " a' * v:\t" << timer.value() << endl;
|
std::cout << " a' * v:\t" << timer.best() << endl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -92,12 +93,12 @@ int main(int argc, char *argv[])
|
|||||||
std::cout << "Eigen sparse\t" << sm1.nonZeros()/float(sm1.rows()*sm1.cols())*100 << "%\n";
|
std::cout << "Eigen sparse\t" << sm1.nonZeros()/float(sm1.rows()*sm1.cols())*100 << "%\n";
|
||||||
|
|
||||||
BENCH(asm("#myc"); v2 = sm1 * v1; asm("#myd");)
|
BENCH(asm("#myc"); v2 = sm1 * v1; asm("#myd");)
|
||||||
std::cout << " a * v:\t" << timer.value() << endl;
|
std::cout << " a * v:\t" << timer.best()/REPEAT << " " << double(REPEAT)/timer.best(REAL_TIMER) << " * / sec " << endl;
|
||||||
|
|
||||||
|
|
||||||
BENCH( { asm("#mya"); v2 = sm1.transpose() * v1; asm("#myb"); })
|
BENCH( { asm("#mya"); v2 = sm1.transpose() * v1; asm("#myb"); })
|
||||||
|
|
||||||
std::cout << " a' * v:\t" << timer.value() << endl;
|
std::cout << " a' * v:\t" << timer.best()/REPEAT << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// {
|
// {
|
||||||
@ -131,6 +132,28 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef NOUBLAS
|
||||||
|
{
|
||||||
|
std::cout << "ublas sparse\t" << density*100 << "%\n";
|
||||||
|
UBlasSparse m1(rows,cols);
|
||||||
|
eiToUblas(sm1, m1);
|
||||||
|
|
||||||
|
boost::numeric::ublas::vector<Scalar> uv1, uv2;
|
||||||
|
eiToUblasVec(v1,uv1);
|
||||||
|
eiToUblasVec(v2,uv2);
|
||||||
|
|
||||||
|
// std::vector<Scalar> gmmV1(cols), gmmV2(cols);
|
||||||
|
// Map<Matrix<Scalar,Dynamic,1> >(&gmmV1[0], cols) = v1;
|
||||||
|
// Map<Matrix<Scalar,Dynamic,1> >(&gmmV2[0], cols) = v2;
|
||||||
|
|
||||||
|
BENCH( uv2 = boost::numeric::ublas::prod(m1, uv1); )
|
||||||
|
std::cout << " a * v:\t" << timer.value() << endl;
|
||||||
|
|
||||||
|
// BENCH( boost::ublas::prod(gmm::transposed(m1), gmmV1, gmmV2); )
|
||||||
|
// std::cout << " a' * v:\t" << timer.value() << endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// MTL4
|
// MTL4
|
||||||
#ifndef NOMTL
|
#ifndef NOMTL
|
||||||
{
|
{
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "BenchTimer.h"
|
#include "BenchTimer.h"
|
||||||
|
#include "BenchUtil.h"
|
||||||
#include "BenchSparseUtil.h"
|
#include "BenchSparseUtil.h"
|
||||||
|
|
||||||
#ifndef NBTRIES
|
#ifndef NBTRIES
|
||||||
@ -228,16 +229,12 @@ int main(int argc, char *argv[])
|
|||||||
eiToCSparse(sm1, m1);
|
eiToCSparse(sm1, m1);
|
||||||
eiToCSparse(sm2, m2);
|
eiToCSparse(sm2, m2);
|
||||||
|
|
||||||
// timer.reset();
|
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
BENCH(
|
BENCH(
|
||||||
{
|
{
|
||||||
m3 = cs_sorted_multiply(m1, m2);
|
m3 = cs_sorted_multiply(m1, m2);
|
||||||
if (!m3)
|
if (!m3)
|
||||||
{
|
{
|
||||||
std::cerr << "cs_multiply failed\n";
|
std::cerr << "cs_multiply failed\n";
|
||||||
// break;
|
|
||||||
}
|
}
|
||||||
// cs_print(m3, 0);
|
// cs_print(m3, 0);
|
||||||
cs_spfree(m3);
|
cs_spfree(m3);
|
||||||
@ -254,16 +251,11 @@ int main(int argc, char *argv[])
|
|||||||
#ifndef NOUBLAS
|
#ifndef NOUBLAS
|
||||||
{
|
{
|
||||||
std::cout << "ublas\t" << nnzPerCol << "%\n";
|
std::cout << "ublas\t" << nnzPerCol << "%\n";
|
||||||
UblasMatrix m1(rows,cols), m2(rows,cols), m3(rows,cols);
|
UBlasSparse m1(rows,cols), m2(rows,cols), m3(rows,cols);
|
||||||
eiToUblas(sm1, m1);
|
eiToUblas(sm1, m1);
|
||||||
eiToUblas(sm2, m2);
|
eiToUblas(sm2, m2);
|
||||||
|
|
||||||
BENCH(boost::numeric::ublas::prod(m1, m2, m3););
|
BENCH(boost::numeric::ublas::prod(m1, m2, m3););
|
||||||
// timer.reset();
|
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
// gmm::mult(m1, m2, gmmT3);
|
|
||||||
// timer.stop();
|
|
||||||
std::cout << " a * b:\t" << timer.value() << endl;
|
std::cout << " a * b:\t" << timer.value() << endl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -277,34 +269,18 @@ int main(int argc, char *argv[])
|
|||||||
eiToGmm(sm1, m1);
|
eiToGmm(sm1, m1);
|
||||||
eiToGmm(sm2, m2);
|
eiToGmm(sm2, m2);
|
||||||
|
|
||||||
timer.reset();
|
BENCH(gmm::mult(m1, m2, gmmT3););
|
||||||
timer.start();
|
|
||||||
for (int k=0; k<REPEAT; ++k)
|
|
||||||
gmm::mult(m1, m2, gmmT3);
|
|
||||||
timer.stop();
|
|
||||||
std::cout << " a * b:\t" << timer.value() << endl;
|
std::cout << " a * b:\t" << timer.value() << endl;
|
||||||
|
|
||||||
// timer.reset();
|
// BENCH(gmm::mult(gmm::transposed(m1), m2, gmmT3););
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
// gmm::mult(gmm::transposed(m1), m2, gmmT3);
|
|
||||||
// timer.stop();
|
|
||||||
// std::cout << " a' * b:\t" << timer.value() << endl;
|
// std::cout << " a' * b:\t" << timer.value() << endl;
|
||||||
//
|
//
|
||||||
// if (rows<500)
|
// if (rows<500)
|
||||||
// {
|
// {
|
||||||
// timer.reset();
|
// BENCH(gmm::mult(gmm::transposed(m1), gmm::transposed(m2), gmmT3););
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
// gmm::mult(gmm::transposed(m1), gmm::transposed(m2), gmmT3);
|
|
||||||
// timer.stop();
|
|
||||||
// std::cout << " a' * b':\t" << timer.value() << endl;
|
// std::cout << " a' * b':\t" << timer.value() << endl;
|
||||||
//
|
//
|
||||||
// timer.reset();
|
// BENCH(gmm::mult(m1, gmm::transposed(m2), gmmT3););
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
// gmm::mult(m1, gmm::transposed(m2), gmmT3);
|
|
||||||
// timer.stop();
|
|
||||||
// std::cout << " a * b':\t" << timer.value() << endl;
|
// std::cout << " a * b':\t" << timer.value() << endl;
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
@ -323,32 +299,16 @@ int main(int argc, char *argv[])
|
|||||||
eiToMtl(sm1, m1);
|
eiToMtl(sm1, m1);
|
||||||
eiToMtl(sm2, m2);
|
eiToMtl(sm2, m2);
|
||||||
|
|
||||||
timer.reset();
|
BENCH(m3 = m1 * m2;);
|
||||||
timer.start();
|
|
||||||
for (int k=0; k<REPEAT; ++k)
|
|
||||||
m3 = m1 * m2;
|
|
||||||
timer.stop();
|
|
||||||
std::cout << " a * b:\t" << timer.value() << endl;
|
std::cout << " a * b:\t" << timer.value() << endl;
|
||||||
|
|
||||||
// timer.reset();
|
// BENCH(m3 = trans(m1) * m2;);
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
// m3 = trans(m1) * m2;
|
|
||||||
// timer.stop();
|
|
||||||
// std::cout << " a' * b:\t" << timer.value() << endl;
|
// std::cout << " a' * b:\t" << timer.value() << endl;
|
||||||
//
|
//
|
||||||
// timer.reset();
|
// BENCH(m3 = trans(m1) * trans(m2););
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
// m3 = trans(m1) * trans(m2);
|
|
||||||
// timer.stop();
|
|
||||||
// std::cout << " a' * b':\t" << timer.value() << endl;
|
// std::cout << " a' * b':\t" << timer.value() << endl;
|
||||||
//
|
//
|
||||||
// timer.reset();
|
// BENCH(m3 = m1 * trans(m2););
|
||||||
// timer.start();
|
|
||||||
// for (int k=0; k<REPEAT; ++k)
|
|
||||||
// m3 = m1 * trans(m2);
|
|
||||||
// timer.stop();
|
|
||||||
// std::cout << " a * b' :\t" << timer.value() << endl;
|
// std::cout << " a * b' :\t" << timer.value() << endl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user