void test_dynrankview_op_perf( const int par_size ) { typedef DeviceType execution_space; typedef typename execution_space::size_type size_type; const size_type dim2 = 900; const size_type dim3 = 300; double elapsed_time_view = 0; double elapsed_time_compview = 0; double elapsed_time_strideview = 0; double elapsed_time_view_rank7 = 0; double elapsed_time_drview = 0; double elapsed_time_compdrview = 0; Kokkos::Timer timer; { Kokkos::View<double***,DeviceType> testview("testview",par_size,dim2,dim3); typedef InitViewFunctor<DeviceType> FunctorType; timer.reset(); Kokkos::RangePolicy<DeviceType> policy(0,par_size); Kokkos::parallel_for( policy , FunctorType(testview) ); DeviceType::fence(); elapsed_time_view = timer.seconds(); std::cout << " View time (init only): " << elapsed_time_view << std::endl; timer.reset(); Kokkos::View<double*,DeviceType> sumview("sumview",par_size); Kokkos::parallel_for( policy , typename FunctorType::SumComputationTest(testview, sumview) ); DeviceType::fence(); elapsed_time_compview = timer.seconds(); std::cout << " View sum computation time: " << elapsed_time_view << std::endl; Kokkos::View<double***,Kokkos::LayoutStride, DeviceType> teststrideview = Kokkos::subview(testview, Kokkos::ALL, Kokkos::ALL,Kokkos::ALL); typedef InitStrideViewFunctor<DeviceType> FunctorStrideType; timer.reset(); Kokkos::parallel_for( policy , FunctorStrideType(teststrideview) ); DeviceType::fence(); elapsed_time_strideview = timer.seconds(); std::cout << " Strided View time (init only): " << elapsed_time_strideview << std::endl; } { Kokkos::View<double*******,DeviceType> testview("testview",par_size,dim2,dim3,1,1,1,1); typedef InitViewRank7Functor<DeviceType> FunctorType; timer.reset(); Kokkos::RangePolicy<DeviceType> policy(0,par_size); Kokkos::parallel_for( policy , FunctorType(testview) ); DeviceType::fence(); elapsed_time_view_rank7 = timer.seconds(); std::cout << " View Rank7 time (init only): " << elapsed_time_view_rank7 << std::endl; } { Kokkos::DynRankView<double,DeviceType> testdrview("testdrview",par_size,dim2,dim3); typedef InitDynRankViewFunctor<DeviceType> FunctorType; timer.reset(); Kokkos::RangePolicy<DeviceType> policy(0,par_size); Kokkos::parallel_for( policy , FunctorType(testdrview) ); DeviceType::fence(); elapsed_time_drview = timer.seconds(); std::cout << " DynRankView time (init only): " << elapsed_time_drview << std::endl; timer.reset(); Kokkos::DynRankView<double,DeviceType> sumview("sumview",par_size); Kokkos::parallel_for( policy , typename FunctorType::SumComputationTest(testdrview, sumview) ); DeviceType::fence(); elapsed_time_compdrview = timer.seconds(); std::cout << " DynRankView sum computation time: " << elapsed_time_compdrview << std::endl; } std::cout << " Ratio of View to DynRankView time: " << elapsed_time_view / elapsed_time_drview << std::endl; //expect < 1 std::cout << " Ratio of View to DynRankView sum computation time: " << elapsed_time_compview / elapsed_time_compdrview << std::endl; //expect < 1 std::cout << " Ratio of View to View Rank7 time: " << elapsed_time_view / elapsed_time_view_rank7 << std::endl; //expect < 1 std::cout << " Ratio of StrideView to DynRankView time: " << elapsed_time_strideview / elapsed_time_drview << std::endl; //expect < 1 std::cout << " Ratio of DynRankView to View Rank7 time: " << elapsed_time_drview / elapsed_time_view_rank7 << std::endl; //expect ? timer.reset(); } //end test_dynrankview
int main(int argc, char *argv[]) { // Initialize POOMA and output stream, using Tester class Pooma::initialize(argc, argv); Pooma::Tester tester(argc, argv); tester.out() << argv[0]; tester.out() << ": DynamicArray dynamic ops w/views." << std::endl; tester.out() << "-------------------------------------------" << std::endl; // Create an Interval object to create and index into an Array with tester.out() << "Creating an Interval<1> object ..." << std::endl; Interval<1> D1(3); tester.out() << "D1 = " << D1 << std::endl; // Create simple dynamic array. tester.out() << "Creating DynamicArray using domain ..." << std::endl; DynamicArray<int,Dynamic> a(D1); tester.check(a.domain().size() == D1.size()); // Initialize dynamic array with scalar. a = 3; tester.out() << "Initialized DynamicArray to 3:" << std::endl; tester.out() << "a = " << a << std::endl; tester.check(sum(a) == (a.domain().size() * 3)); // Create elements in the array. tester.out() << "Creating 2 elements at end of a ..." << std::endl; a.create(2); a.sync(); tester.out() << "a = " << a << std::endl; tester.check(a.domain().size() == (D1.size() + 2)); #if 0 // This test is bogous, as the comment in Engine/DynamicEngine.cpp::create() // tells (the check for shared data is commented out): // "It would be nice to assert that no-one else is looking at the engine // when we perform dynamic operations, but all the particle swap operations // take place inside iterates which means the engine is a copy of another // engine, so the data is shared." // Call a function which takes a view and the original DynamicArray std::cout << "The program should abort in the next operation when it\n"; std::cout << "tries to create elements in an array with an existing view."; std::cout << std::endl; tester.out() << "Calling testview with a and a(1,3) ..." << std::endl; tester.check(testview(tester, a, a(Interval<1>(1,3)))); #endif // Return resulting error code and exit; Tester will shut down POOMA. tester.out() << "-------------------------------------------" << std::endl; int retval = tester.results("DynamicArray dynamic ops w/views"); Pooma::finalize(); return retval; }