From: Karl R. <ru...@iu...> - 2010-07-09 15:21:36
|
Hi! Sorry for the late approval of your support email, the junk filter caught it... Hmm, I'll have a look at the inplace_solve issue and let you know by Monday. Best regards, Karli On 06/30/2010 11:51 PM, mel...@ms... wrote: > Hi, I've just recently discovered your project and I was toying around > LU factorization and forward-back substitution, and in my programs, the > inplace_solve function seems to break down when I invert a matrix larger > than about 225x225. > > I'm using linux and an NVIDIA tesla C1060. > > Basically, when I run the viennacl inplace solve and the ublas inplace > solve they produce results differing by about one index (if my matrix is > (200-400)^2 ) and more indices if the matrix is larger. I tested the > lu_factorize function, and that produces similar results to ublas (up to > a relatively high level of significance), so I'm fairly certain the > problem I'm having lies with the inplace_solve function. > > Here is the code I'm running: > > -------------------------------------------------------------------------------------------------- > > #include <boost/numeric/ublas/triangular.hpp> > #include <boost/numeric/ublas/matrix_sparse.hpp> > #include <boost/numeric/ublas/vector.hpp> > #include <boost/numeric/ublas/matrix.hpp> > #include <boost/numeric/ublas/io.hpp> > #include <boost/numeric/ublas/lu.hpp> > #include <fstream> > > #include "viennacl/vector.hpp" > #include "viennacl/matrix.hpp" > #include "viennacl/linalg/direct_solve.hpp" > #include "benchmark-utils.hpp" > > using namespace boost::numeric; > > int main() > { > int N = 500; > ublas::matrix<double> A(N,N); > ublas::vector<double> b(N); > ublas::vector<double> b2(N); > viennacl::matrix<double> gpu_A(N,N); > viennacl::vector<double> gpu_b(N); > > for (int i=0;i<N;i++) > { > for (int j=i;j<N;j++) > { > A(i,j)=1; > } > b(i)=N-i; > } > copy(A,gpu_A); > copy(b,gpu_b); > > ublas::inplace_solve(A,b,ublas::upper_tag()); > viennacl::linalg::inplace_solve(gpu_A,gpu_b,viennacl::linalg::upper_tag()); > ublas::inplace_solve(A2,b3,ublas::upper_tag()); > copy(gpu_b,b2); > > > double err = 0; > > > for (int i=0;i<N;i++) > { > if (abs(b2(i)-b(i))>err) > { > err=abs(b2(i)-b(i)); > std::cout<<"At index "<<i<<std::endl; > std::cout<<"CPU= "<<b(i)<<" and"<<std::endl; > std::cout<<"GPU= "<<b2(i)<<std::endl; > } > } > > std::cout<<err<<std::endl; > } > > -------------------------------------------------------------------------------------------------- > > Every time I run this there are one or two errors at different indices. > Am I doing something wrong? Do you have any suggestions? > > Thanks in advance, > Andrew Melfi > > > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by Sprint > What will you do first with EVO, the first 4G phone? > Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first > > > > _______________________________________________ > Viennacl-support mailing list > Vie...@li... > https://lists.sourceforge.net/lists/listinfo/viennacl-support |