Exemplo n.º 1
0
int main (int argc, char ** argv){
  if (argc < 2){
    std::cerr << "Usage:" << argv[0] << " input_bin_file" << std::endl;
    exit(1);
  }

  Kokkos::initialize(argc, argv);
  MyExecSpace::print_configuration(std::cout);

  idx m = 0, nnzA = 0, n = 0, k = 0;
  idx *xadj, *adj;
  wt *ew;
  KokkosKernels::Experimental::Graph::Utils::read_graph_bin<idx, wt> (&m, &nnzA, &xadj, &adj, &ew, argv[1]);

  std::cout << "m:" << m << " nnzA:" << nnzA << std::endl;
  k = n = m;


  um_array_type _xadj (xadj, m + 1);
  um_edge_array_type _adj (adj, nnzA);

  wt_um_edge_array_type _mtx_vals (ew, nnzA);


  idx_array_type kok_xadj ("xadj", m + 1);
  idx_edge_array_type kok_adj("adj", nnzA);
  value_array_type kok_mtx_vals ("MTX_VALS", nnzA);

  Kokkos::deep_copy (kok_xadj, _xadj);
  Kokkos::deep_copy (kok_adj, _adj);
  Kokkos::deep_copy (kok_mtx_vals, _mtx_vals);


  delete [] xadj;
  delete [] adj;
  delete [] ew;

  idx_array_type row_mapC, row_mapC2;
  idx_edge_array_type entriesC, entriesC2;
  value_array_type valuesC, valuesC2;

  typedef KokkosKernels::Experimental::KokkosKernelsHandle
        <idx_array_type,idx_edge_array_type, value_array_type,
        MyExecSpace, TemporaryWorkSpace,PersistentWorkSpace > KernelHandle;

  KernelHandle kh;



  kh.create_spgemm_handle(KokkosKernels::Experimental::Graph::SPGEMM_CUSP);
  Kokkos::Impl::Timer timer1;
  KokkosKernels::Experimental::Graph::spgemm_symbolic<KernelHandle> (
      &kh,
      m,
      n,
      k,
      kok_xadj,
      kok_adj,
      false,
      kok_xadj,
      kok_adj,
      false,
      row_mapC,
      entriesC
      );

  Kokkos::fence();
  double symbolic_time = timer1.seconds();
  Kokkos::Impl::Timer timer2;
  KokkosKernels::Experimental::Graph::spgemm_numeric(
      &kh,
      m,
      n,
      k,
      kok_xadj,
      kok_adj,
      kok_mtx_vals,
      false,

      kok_xadj,
      kok_adj,
      kok_mtx_vals,
      true,
      row_mapC,
      entriesC,
      valuesC
      );
  Kokkos::fence();
  double numeric_time = timer2.seconds();
  std::cout << "mm_time:" << numeric_time + symbolic_time
            << " symbolic_time:" << symbolic_time
            << " numeric:" << numeric_time << std::endl;

  std::cout << "row_mapC:" << row_mapC.dimension_0() << std::endl;
  std::cout << "entriesC:" << entriesC.dimension_0() << std::endl;
  std::cout << "valuesC:" << valuesC.dimension_0() << std::endl;




  kh.create_spgemm_handle();
  Kokkos::Impl::Timer timer3;
  KokkosKernels::Experimental::Graph::spgemm_symbolic<KernelHandle> (
      &kh,
      m,
      n,
      k,
      kok_xadj,
      kok_adj,
      false,
      kok_xadj,
      kok_adj,
      false,
      row_mapC2,
      entriesC2
      );

  Kokkos::fence();
  symbolic_time = timer3.seconds();
  Kokkos::Impl::Timer timer4;
  KokkosKernels::Experimental::Graph::spgemm_numeric(
      &kh,
      m,
      n,
      k,
      kok_xadj,
      kok_adj,
      kok_mtx_vals,
      false,

      kok_xadj,
      kok_adj,
      kok_mtx_vals,
      true,
      row_mapC2,
      entriesC2,
      valuesC2
      );
  Kokkos::fence();
  numeric_time = timer4.seconds();
  std::cout << "mm_time:" << numeric_time + symbolic_time
            << " symbolic_time:" << symbolic_time
            << " numeric:" << numeric_time << std::endl;

  std::cout << "row_mapC:" << row_mapC2.dimension_0() << std::endl;
  std::cout << "entriesC:" << entriesC2.dimension_0() << std::endl;
  std::cout << "valuesC:" << valuesC2.dimension_0() << std::endl;

  typedef Kokkos::RangePolicy<MyExecSpace> my_exec_space;

  size_t map = 0, ent = 0, val = 0;
  Kokkos::parallel_reduce(my_exec_space(0,row_mapC2.dimension_0()), compare<idx_array_type>(row_mapC,row_mapC2), map);
  Kokkos::parallel_reduce(my_exec_space(0,entriesC2.dimension_0()), compare<idx_edge_array_type>(entriesC,entriesC2), ent);
  Kokkos::parallel_reduce(my_exec_space(0,valuesC2.dimension_0()), compare<value_array_type>(valuesC,valuesC2), val);

  std::cout << "map:" << map << " ent:" << ent << " val:" << val << std::endl;
  Kokkos::finalize();
  return 0;

}