Ejemplo n.º 1
0
void large_cg_test(uint i){
  message("Blocksize = %d", N);
  char filename[255];

  sprintf(filename, "%s", matrixFiles[(uint)i].c_str());

  SpMatrix<N, T>* mat = 0;

  /*Load a matrix from file*/
  mat = load_matrix_market_exchange<N, T>(filename);
  if(mat == 0){
    warning("Failed loading %s", filename);
    return;
  }

  if(mat){
    Vector<T> vec(mat->getWidth());
    for(int j=0;j<mat->getWidth();j++){
      if(j%2==0)
	vec[j] = 1;
      else
	vec[j] = 1;
    }

    mat->finalize();

    LinSolve<N, T>* solver = 0; 

    /*Enable the tests you like to perform.*/
#if 1
    message("Single non-threaded test");
    solver = new LinSolveCG<N, T>(mat->getWidth());
    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();

    delete solver;
#endif
#if 1
    message("Single threaded test");
    solver = new LinSolveCGParallel<N, T>(mat->getWidth(), 1);
    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif
#if 1
    message("Dual threaded test");
    solver = new LinSolveCGParallel<N, T>(mat->getWidth(), 2);
    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif
#if 1    
    message("Quad threaded test");

    solver = new LinSolveCGParallel<N, T>(mat->getWidth(), 4);
    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif
#if 1
    message("Oct threaded test");

    solver = new LinSolveCGParallel<N, T>(mat->getWidth(), 8);
    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif
#if 1
    message("16 threaded test");

    solver = new LinSolveCGParallel<N, T>(mat->getWidth(), 16);
    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif
#if 1
    message("32 threaded test");

    solver = new LinSolveCGParallel<N, T>(mat->getWidth(), 32);
    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif


#ifdef CUDA
#if 1
    message("Single cuda test");
    solver = new LinSolveCGGPU<N, T>(mat->getWidth(), 1);

    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif
#if 0
    message("Dual cuda test");
    solver = new LinSolveCGGPU<N, T>(mat->getWidth(), 2);

    solver->setMatrix(mat);
    solver->setb(&vec);
    solver->preSolve();
    solver->solve();
    
    delete solver;
#endif
#endif
    
    delete mat;
  }else{
    warning("File %s not found. Test skipped.", filename);
  }
}