void test_svd(const std::string & fn, ScalarType EPS) { std::size_t sz1, sz2; //read matrix // sz1 = 2048, sz2 = 2048; // std::vector<ScalarType> in(sz1 * sz2); // random_fill(in); // read file std::fstream f(fn.c_str(), std::fstream::in); //read size of input matrix read_matrix_size(f, sz1, sz2); std::size_t to = std::min(sz1, sz2); viennacl::matrix<ScalarType> Ai(sz1, sz2), Aref(sz1, sz2), QL(sz1, sz1), QR(sz2, sz2); read_matrix_body(f, Ai); std::vector<ScalarType> sigma_ref(to); read_vector_body(f, sigma_ref); f.close(); // viennacl::fast_copy(&in[0], &in[0] + in.size(), Ai); Aref = Ai; viennacl::tools::timer timer; timer.start(); viennacl::linalg::svd(Ai, QL, QR); viennacl::backend::finish(); double time_spend = timer.get(); viennacl::matrix<ScalarType> result1(sz1, sz2), result2(sz1, sz2); result1 = viennacl::linalg::prod(QL, Ai); result2 = viennacl::linalg::prod(result1, trans(QR)); ScalarType sigma_diff = sigmas_compare(Ai, sigma_ref); ScalarType prods_diff = matrix_compare(result2, Aref); bool sigma_ok = (fabs(sigma_diff) < EPS) && (fabs(prods_diff) < std::sqrt(EPS)); //note: computing the product is not accurate down to 10^{-16}, so we allow for a higher tolerance here printf("%6s [%dx%d] %40s sigma_diff = %.6f; prod_diff = %.6f; time = %.6f\n", sigma_ok?"[[OK]]":"[FAIL]", (int)Aref.size1(), (int)Aref.size2(), fn.c_str(), sigma_diff, prods_diff, time_spend); if (!sigma_ok) exit(EXIT_FAILURE); }
int main() { /* * Programm zum Testen der einzelnen OpenMP Funktionen * vom Ordner /build aus aufrufen! * * Matrix wird automatisch eingelesen, dann wird die entsprechende * Funktion (z.B. house_update_A_right ) darauf angewendet, dann * wird sie wieder ausgegeben * */ boost::numeric::ublas::compressed_matrix<ScalarType> ublas_A; std::cout << "Reading..." << "\n"; std::size_t sz; // read file std::fstream f("../examples/testdata/eigen/symm1.example", std::fstream::in); //read size of input matrix read_matrix_size(f, sz); ublas::vector<ScalarType> D = ublas::scalar_vector<ScalarType>(sz, 0); ublas::vector<ScalarType> E = ublas::scalar_vector<ScalarType>(sz, 0); std::cout << "Testing matrix of size " << sz << "-by-" << sz << std::endl; viennacl::matrix<ScalarType> A_input(sz, sz), A_ref(sz, sz), Q(sz, sz); read_matrix_body(f, A_input); f.close(); matrix_print(A_input); D[0] = 0; D[1] = -5.77735; D[2] = -5.77735; D[3] = 5.77735; //viennacl::linalg::host_based::house_update_A_left(A_input, D, 0); //viennacl::linalg::host_based::house_update_A_right(A_input, D, 0); viennacl::linalg::cuda::bidiag_pack(A_input, D, 0); std::cout << "Testdata wurde gelesen!" << std::endl; //vector_print(D); //matrix_print(A_input); }
void test_eigen(const std::string& fn, bool is_symm) { std::cout << "Reading..." << "\n"; std::size_t sz; // read file std::fstream f(fn.c_str(), std::fstream::in); //read size of input matrix read_matrix_size(f, sz); bool is_row = viennacl::is_row_major<MatrixLayout>::value; if (is_row) std::cout << "Testing row-major matrix of size " << sz << "-by-" << sz << std::endl; else std::cout << "Testing column-major matrix of size " << sz << "-by-" << sz << std::endl; viennacl::matrix<ScalarType> A_input(sz, sz), A_ref(sz, sz), Q(sz, sz); // reference vector with reference values from file std::vector<ScalarType> eigen_ref_re(sz); // calculated real eigenvalues std::vector<ScalarType> eigen_re(sz); // calculated im. eigenvalues std::vector<ScalarType> eigen_im(sz); // read input matrix from file read_matrix_body(f, A_input); // read reference eigenvalues from file read_vector_body(f, eigen_ref_re); f.close(); A_ref = A_input; std::cout << "Calculation..." << "\n"; Timer timer; timer.start(); // Start the calculation if(is_symm) viennacl::linalg::qr_method_sym(A_input, Q, eigen_re); else viennacl::linalg::qr_method_nsm(A_input, Q, eigen_re, eigen_im); /* std::cout << "\n\n Matrix A: \n\n"; matrix_print(A_input); std::cout << "\n\n"; std::cout << "\n\n Matrix Q: \n\n"; matrix_print(Q); std::cout << "\n\n"; */ double time_spend = timer.get(); std::cout << "Verification..." << "\n"; bool is_hessenberg = check_hessenberg(A_input); bool is_tridiag = check_tridiag(A_input); ublas::matrix<ScalarType> A_ref_ublas(sz, sz), A_input_ublas(sz, sz), Q_ublas(sz, sz), result1(sz, sz), result2(sz, sz); viennacl::copy(A_ref, A_ref_ublas); viennacl::copy(A_input, A_input_ublas); viennacl::copy(Q, Q_ublas); // compute result1 = ublas::prod(Q_ublas, A_input_ublas); (terribly slow when using ublas directly) for (std::size_t i=0; i<result1.size1(); ++i) for (std::size_t j=0; j<result1.size2(); ++j) { ScalarType value = 0; for (std::size_t k=0; k<Q_ublas.size2(); ++k) value += Q_ublas(i, k) * A_input_ublas(k, j); result1(i,j) = value; } // compute result2 = ublas::prod(A_ref_ublas, Q_ublas); (terribly slow when using ublas directly) for (std::size_t i=0; i<result2.size1(); ++i) for (std::size_t j=0; j<result2.size2(); ++j) { ScalarType value = 0; for (std::size_t k=0; k<A_ref_ublas.size2(); ++k) value += A_ref_ublas(i, k) * Q_ublas(k, j); result2(i,j) = value; } ScalarType prods_diff = matrix_compare(result1, result2); ScalarType eigen_diff = vector_compare(eigen_re, eigen_ref_re); bool is_ok = is_hessenberg; if(is_symm) is_ok = is_ok && is_tridiag; is_ok = is_ok && (eigen_diff < EPS); is_ok = is_ok && (prods_diff < EPS); // std::cout << A_ref << "\n"; // std::cout << A_input << "\n"; // std::cout << Q << "\n"; // std::cout << eigen_re << "\n"; // std::cout << eigen_im << "\n"; // std::cout << eigen_ref_re << "\n"; // std::cout << eigen_ref_im << "\n"; // std::cout << result1 << "\n"; // std::cout << result2 << "\n"; // std::cout << eigen_ref << "\n"; // std::cout << eigen << "\n"; printf("%6s [%dx%d] %40s time = %.4f\n", is_ok?"[[OK]]":"[FAIL]", (int)A_ref.size1(), (int)A_ref.size2(), fn.c_str(), time_spend); printf("tridiagonal = %d, hessenberg = %d prod-diff = %f eigen-diff = %f\n", is_tridiag, is_hessenberg, prods_diff, eigen_diff); std::cout << std::endl << std::endl; if (!is_ok) exit(EXIT_FAILURE); }
int main(int argc, char **argv){ int test; test = 0; int n_processes; if (argc < 2){ return 0; } n_processes = atoi(argv[1]); int m, x, n; int i, j; int **mmx, **mxn, **mmn; // Read in1.txt f_mmx = fopen("in1.txt", "r"); read_matrix_size(f_mmx, &m, &x); mmx = (int**)malloc(m*sizeof(int*)); for (i = 0; i < m ; i++){ mmx[i] = (int*)malloc(x*sizeof(int)); for (j = 0; j < x ; j++){ fscanf(f_mmx, "%d",&mmx[i][j]); } } fclose(f_mmx); // Read in2.txt f_mxn = fopen("in2.txt", "r"); read_matrix_size(f_mxn, &x, &n); mxn = (int**)malloc(x*sizeof(int*)); for (i = 0; i < x ; i++){ mxn[i] = (int*)malloc(x*sizeof(int)); for (j = 0; j < n ; j++){ fscanf(f_mxn, "%d",&mxn[i][j]); } } fclose(f_mxn); // Init MMN mmn = (int**)malloc(m*sizeof(int*)); for(i=0; i<m; i++){ mmn[i] = (int*)malloc(n*sizeof(int)); } pid_t pid; matrix_mult(0,n_processes,mmx, mxn, mmn, m, x, n); switch(n_processes) { case 1: write_matrix("out.txt", mmn, m, n); break; case 2: pid = fork(); if(pid != 0){ ; } else{ matrix_mult(1,n_processes,mmx, mxn, mmn, m, x, n); write_matrix("out.txt", mmn, m, n); } break; case 4: pid = fork(); if(pid != 0){ ; } else { matrix_mult(1,n_processes,mmx, mxn, mmn, m, x, n); pid=fork(); if(pid!=0){ ; } else{ matrix_mult(2,n_processes,mmx, mxn, mmn, m, x, n); pid=fork(); if(pid !=0){ waitpid(pid,0,0); } else{ matrix_mult(3,n_processes,mmx, mxn, mmn, m, x, n); write_matrix("out.txt", mmn, m, n); } } } break; case 8: pid = fork(); if(pid != 0){ waitpid(pid,0,0); } else{ matrix_mult(1,n_processes,mmx, mxn, mmn, m, x, n); pid = fork(); if(pid != 0){ ; } else{ matrix_mult(2,n_processes,mmx, mxn, mmn, m, x, n); pid = fork(); if( pid!= 0){ ; } else{ matrix_mult(3,n_processes,mmx, mxn, mmn, m, x, n); pid = fork(); if( pid!=0){ ; } else{ matrix_mult(4,n_processes,mmx, mxn, mmn, m, x, n); pid = fork(); if(pid!=0){ ; } else { matrix_mult(5,n_processes,mmx, mxn, mmn, m, x, n); pid=fork(); if( pid!=0){ ; } else{ matrix_mult(6,n_processes,mmx, mxn, mmn, m, x, n); pid = fork(); if( pid!=0){ waitpid(pid,0,0); } else{ matrix_mult(7,n_processes,mmx, mxn, mmn, m, x, n); write_matrix("out.txt", mmn, m, n); } } } } } } } break; default: printf("WRONG \n" ); } free(mmn); free(mmx); free(mxn); return 0; }