void run( MPI_Comm comm , const int cmd[] ) { if ( cmd[ CMD_USE_THREADS ] ) { std::cout << "THREADS , " << cmd[ CMD_USE_THREADS ] ; } else if ( cmd[ CMD_USE_OPENMP ] ) { std::cout << "OPENMP , " << cmd[ CMD_USE_OPENMP ] ; } else if ( cmd[ CMD_USE_CUDA ] ) { std::cout << "CUDA" ; } if ( cmd[ CMD_USE_FIXTURE_QUADRATIC ] ) { std::cout << " , QUADRATIC-ELEMENT" ; } else { std::cout << " , LINEAR-ELEMENT" ; } if ( cmd[ CMD_USE_ATOMIC ] ) { std::cout << " , USING ATOMICS" ; } std::cout << std::endl ; std::cout << "ELEMS , NODES , NEWTON , CG , GRAPH/NODE , FILL/NODE , BOUNDARY/NODE , CG/ITER/ROW , ERROR" << std::endl ; std::cout << "count , count , iter , iter , millisec , millisec , millisec , millisec , ratio" << std::endl ; if ( cmd[ CMD_USE_FIXTURE_BEGIN ] ) { for ( int i = cmd[CMD_USE_FIXTURE_BEGIN] ; i < cmd[CMD_USE_FIXTURE_END] * 2 ; i *= 2 ) { int nelem[3] ; nelem[0] = std::max( 1 , (int) cbrt( ((double) i) / 2.0 ) ); nelem[1] = 1 + nelem[0] ; nelem[2] = 2 * nelem[0] ; const Kokkos::Example::FENL::Perf perf = cmd[ CMD_USE_FIXTURE_QUADRATIC ] ? Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemQuadratic > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) : Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemLinear > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) ; print_perf_value( std::cout , perf ); } } else { int nelem[3] = { cmd[ CMD_USE_FIXTURE_X ] , cmd[ CMD_USE_FIXTURE_Y ] , cmd[ CMD_USE_FIXTURE_Z ] }; const Kokkos::Example::FENL::Perf perf = cmd[ CMD_USE_FIXTURE_QUADRATIC ] ? Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemQuadratic > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) : Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemLinear > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) ; print_perf_value( std::cout , perf ); } }
void run( MPI_Comm comm , const int cmd[] ) { int comm_rank = 0 ; #if defined( KOKKOS_ENABLE_MPI ) MPI_Comm_rank( comm , & comm_rank ); #else comm = 0 ; #endif if ( 0 == comm_rank ) { if ( cmd[ CMD_USE_THREADS ] ) { std::cout << "THREADS , " << cmd[ CMD_USE_THREADS ] ; } else if ( cmd[ CMD_USE_OPENMP ] ) { std::cout << "OPENMP , " << cmd[ CMD_USE_OPENMP ] ; } else if ( cmd[ CMD_USE_CUDA ] ) { std::cout << "CUDA" ; } if ( cmd[ CMD_USE_FIXTURE_QUADRATIC ] ) { std::cout << " , QUADRATIC-ELEMENT" ; } else { std::cout << " , LINEAR-ELEMENT" ; } if ( cmd[ CMD_USE_ATOMIC ] ) { std::cout << " , USING ATOMICS" ; } } std::vector< std::pair<std::string,std::string> > headers; headers.push_back(std::make_pair("ELEMS","count")); headers.push_back(std::make_pair("NODES","count")); headers.push_back(std::make_pair("NEWTON","iter")); headers.push_back(std::make_pair("CG","iter")); headers.push_back(std::make_pair("MAP_RATIO","ratio")); headers.push_back(std::make_pair("SET_FILL/NODE","millisec")); headers.push_back(std::make_pair("SCAN/NODE","millisec")); headers.push_back(std::make_pair("GRAPH_FILL/NODE","millisec")); headers.push_back(std::make_pair("SORT/NODE","millisec")); headers.push_back(std::make_pair("ELEM_GRAPH_FILL/NODE","millisec")); headers.push_back(std::make_pair("MATRIX_CREATE/NODE","millisec")); headers.push_back(std::make_pair("MATRIX_FILL/NODE","millisec")); headers.push_back(std::make_pair("BOUNDARY/NODE","millisec")); headers.push_back(std::make_pair("MAT_VEC/ITER/ROW","millisec")); headers.push_back(std::make_pair("CG/ITER/ROW","millisec")); headers.push_back(std::make_pair("ERROR","ratio")); // find print widths size_t min_width = 10; std::vector< size_t > widths(headers.size()); for (size_t i=0, ie=headers.size(); i<ie; ++i) widths[i] = std::max(min_width, headers[i].first.size()+1); // print column headers if ( 0 == comm_rank ) { std::cout << std::endl ; for (size_t i=0; i<headers.size(); ++i) std::cout << std::setw(widths[i]) << headers[i].first << " ,"; std::cout << "\b\b " << std::endl; for (size_t i=0; i<headers.size(); ++i) std::cout << std::setw(widths[i]) << headers[i].second << " ,"; std::cout << "\b\b " << std::endl; std::cout << std::scientific; std::cout.precision(3); } if ( cmd[ CMD_USE_FIXTURE_BEGIN ] ) { for ( int i = cmd[CMD_USE_FIXTURE_BEGIN] ; i < cmd[CMD_USE_FIXTURE_END] * 2 ; i *= 2 ) { int nelem[3] ; nelem[0] = std::max( 1 , (int) cbrt( ((double) i) / 2.0 ) ); nelem[1] = 1 + nelem[0] ; nelem[2] = 2 * nelem[0] ; const Kokkos::Example::FENL::Perf perf = cmd[ CMD_USE_FIXTURE_QUADRATIC ] ? Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemQuadratic > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) : Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemLinear > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) ; if ( 0 == comm_rank ) print_perf_value( std::cout , widths, perf ); } } else { int nelem[3] = { cmd[ CMD_USE_FIXTURE_X ] , cmd[ CMD_USE_FIXTURE_Y ] , cmd[ CMD_USE_FIXTURE_Z ] }; const Kokkos::Example::FENL::Perf perf = cmd[ CMD_USE_FIXTURE_QUADRATIC ] ? Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemQuadratic > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) : Kokkos::Example::FENL::fenl< Device , Kokkos::Example::BoxElemPart::ElemLinear > ( comm , cmd[CMD_PRINT], cmd[CMD_USE_TRIALS], cmd[CMD_USE_ATOMIC], nelem ) ; if ( 0 == comm_rank ) print_perf_value( std::cout , widths, perf ); } }