bool check_for_equality(MatrixType const & ublas_A, VCLMatrixType const & vcl_A, double epsilon) { typedef typename MatrixType::value_type value_type; boost::numeric::ublas::matrix<value_type> vcl_A_cpu(vcl_A.size1(), vcl_A.size2()); viennacl::backend::finish(); //workaround for a bug in APP SDK 2.7 on Trinity APUs (with Catalyst 12.8) viennacl::copy(vcl_A, vcl_A_cpu); for (std::size_t i=0; i<ublas_A.size1(); ++i) { for (std::size_t j=0; j<ublas_A.size2(); ++j) { if (ublas_A(i,j) != vcl_A_cpu(i,j)) { if ( (std::abs(ublas_A(i,j) - vcl_A_cpu(i,j)) / std::max(ublas_A(i,j), vcl_A_cpu(i,j)) > epsilon) || (vcl_A_cpu(i,j) != vcl_A_cpu(i,j)) ) { std::cout << "Error at index (" << i << ", " << j << "): " << ublas_A(i,j) << " vs " << vcl_A_cpu(i,j) << std::endl; std::cout << std::endl << "TEST failed!" << std::endl; return false; } } } } std::cout << "PASSED!" << std::endl; return true; }
bool check_for_equality(MatrixType const & ublas_A, VCLMatrixType const & vcl_A) { typedef typename MatrixType::value_type value_type; boost::numeric::ublas::matrix<value_type> vcl_A_cpu(vcl_A.size1(), vcl_A.size2()); viennacl::copy(vcl_A, vcl_A_cpu); for (std::size_t i=0; i<ublas_A.size1(); ++i) { for (std::size_t j=0; j<ublas_A.size2(); ++j) { if (ublas_A(i,j) != vcl_A_cpu(i,j)) { if ( std::abs(ublas_A(i,j) - vcl_A_cpu(i,j)) / std::max(ublas_A(i,j), vcl_A_cpu(i,j)) > 1e-5 ) { std::cout << "Error at index (" << i << ", " << j << "): " << ublas_A(i,j) << " vs " << vcl_A_cpu(i,j) << std::endl; std::cout << ublas_A << std::endl; std::cout << vcl_A_cpu << std::endl; return false; } } } } return true; }
ScalarType diff(ublas::matrix<ScalarType> const & mat1, VCLMatrixType const & mat2) { ublas::matrix<ScalarType> mat2_cpu(mat2.size1(), mat2.size2()); viennacl::backend::finish(); //workaround for a bug in APP SDK 2.7 on Trinity APUs (with Catalyst 12.8) viennacl::copy(mat2, mat2_cpu); for (unsigned int i = 0; i < mat2_cpu.size1(); ++i) { for (unsigned int j = 0; j < mat2_cpu.size2(); ++j) { if (mat2_cpu(i,j) != mat1(i,j)) return 1; } } //std::cout << ret << std::endl; return 0; }
ScalarType diff(ublas::matrix<ScalarType> & mat1, VCLMatrixType & mat2) { ublas::matrix<ScalarType> mat2_cpu(mat2.size1(), mat2.size2()); viennacl::backend::finish(); viennacl::copy(mat2, mat2_cpu); double ret = 0; double act = 0; for (unsigned int i = 0; i < mat2_cpu.size1(); ++i) { for (unsigned int j = 0; j < mat2_cpu.size2(); ++j) { act = fabs(mat2_cpu(i,j) - mat1(i,j)) / std::max( fabs(mat2_cpu(i, j)), fabs(mat1(i,j)) ); if (act > ret) ret = act; } } //std::cout << ret << std::endl; return ret; }
ScalarType diff(ublas::matrix<ScalarType> & mat1, VCLMatrixType & mat2) { ublas::matrix<ScalarType> mat2_cpu(mat2.size1(), mat2.size2()); viennacl::backend::finish(); //workaround for a bug in APP SDK 2.7 on Trinity APUs (with Catalyst 12.8) viennacl::copy(mat2, mat2_cpu); ScalarType ret = 0; ScalarType act = 0; for (unsigned int i = 0; i < mat2_cpu.size1(); ++i) { for (unsigned int j = 0; j < mat2_cpu.size2(); ++j) { act = std::fabs(mat2_cpu(i,j) - mat1(i,j)) / std::max( std::fabs(mat2_cpu(i, j)), std::fabs(mat1(i,j)) ); if (act > ret) ret = act; } } //std::cout << ret << std::endl; return ret; }
ScalarType diff(std::vector<std::vector<ScalarType> > const & mat1, VCLMatrixType const & mat2) { std::vector<std::vector<ScalarType> > mat2_cpu(mat2.size1(), std::vector<ScalarType>(mat2.size2())); viennacl::backend::finish(); //workaround for a bug in APP SDK 2.7 on Trinity APUs (with Catalyst 12.8) viennacl::copy(mat2, mat2_cpu); ScalarType ret = 0; ScalarType act = 0; for (std::size_t i = 0; i < mat2_cpu.size(); ++i) { for (std::size_t j = 0; j < mat2_cpu[i].size(); ++j) { act = std::fabs(mat2_cpu[i][j] - mat1[i][j]) / std::max( std::fabs(mat2_cpu[i][j]), std::fabs(mat1[i][j]) ); if (act > ret) ret = act; } } //std::cout << ret << std::endl; return ret; }