/* //@HEADER // ************************************************************************ // // Kokkos v. 2.0 // Copyright (2014) Sandia Corporation // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the Corporation nor the names of the // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov) // // ************************************************************************ //@HEADER */ #include #include #include #include #include /*--------------------------------------------------------------------------*/ #if defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) namespace Test { template < class Device > void test_view_impl() {} } #else /*--------------------------------------------------------------------------*/ namespace Test { struct DummyMemorySpace { typedef DummyMemorySpace memory_space ; typedef unsigned size_type ; }; /*--------------------------------------------------------------------------*/ template< class Type > struct DefineShape { typedef typename Kokkos::Impl::AnalyzeShape::shape type ; }; template< class Type > struct ExtractValueType { typedef typename Kokkos::Impl::AnalyzeShape::value_type type ; }; template< class Type > struct ArrayType { typedef Type type ; }; template < class Device > void test_view_impl() { //typedef typename Device::memory_space memory_space ; // unused typedef ArrayType< int[100] >::type type_01 ; typedef ArrayType< int* >::type type_11 ; typedef ArrayType< int[5][6][700] >::type type_03 ; typedef ArrayType< double*[8][9][900] >::type type_14 ; typedef ArrayType< long** >::type type_22 ; typedef ArrayType< short **[5][6][7] >::type type_25 ; typedef ArrayType< const short **[5][6][7] >::type const_type_25 ; typedef ArrayType< short***[5][6][7] >::type type_36 ; typedef ArrayType< const short***[5][6][7] >::type const_type_36 ; // mfh 14 Feb 2014: With gcc 4.8.2 -Wall, this emits a warning: // // typedef ‘ok_const_25’ locally defined but not used [-Wunused-local-typedefs] // // It's unfortunate that this is the case, because the typedef is // being used for a compile-time check! We deal with this by // declaring an instance of ok_const_25, and marking it with // "(void)" so that instance doesn't emit an "unused variable" // warning. // // typedef typename Kokkos::Impl::StaticAssertSame< // typename Kokkos::Impl::AnalyzeShape::const_type , // typename Kokkos::Impl::AnalyzeShape::type // > ok_const_25 ; typedef typename Kokkos::Impl::StaticAssertSame< typename Kokkos::Impl::AnalyzeShape::const_type, typename Kokkos::Impl::AnalyzeShape::type > ok_const_25 ; typedef typename Kokkos::Impl::StaticAssertSame< typename Kokkos::Impl::AnalyzeShape::const_type, typename Kokkos::Impl::AnalyzeShape::type > ok_const_36 ; { ok_const_25 thing_25 ; ok_const_36 thing_36 ; (void) thing_25 ; // silence warning for unused variable (void) thing_36 ; // silence warning for unused variable } ASSERT_TRUE( ( Kokkos::Impl::is_same< ExtractValueType::type , int >::value ) ); ASSERT_TRUE( ( Kokkos::Impl::is_same< ExtractValueType::type , double >::value ) ); ASSERT_TRUE( ( Kokkos::Impl::is_same< ExtractValueType::type , long >::value ) ); ASSERT_TRUE( ( Kokkos::Impl::is_same< ExtractValueType::type , short >::value ) ); ASSERT_FALSE( ( Kokkos::Impl::is_same< ExtractValueType::type , int >::value ) ); typedef typename DefineShape< type_01 >::type shape_01_type ; typedef typename DefineShape< type_11 >::type shape_11_type ; typedef typename DefineShape< type_03 >::type shape_03_type ; typedef typename DefineShape< type_14 >::type shape_14_type ; typedef typename DefineShape< type_22 >::type shape_22_type ; typedef typename DefineShape< type_36 >::type shape_36_type ; ASSERT_TRUE( ( Kokkos::Impl::StaticAssert< shape_36_type::rank == 6 >::value ) ); ASSERT_TRUE( ( Kokkos::Impl::StaticAssert< shape_03_type::rank == 3 >::value ) ); shape_01_type shape_01 ; shape_01_type::assign( shape_01 ); shape_11_type shape_11 ; shape_11_type::assign( shape_11, 1000 ); shape_03_type shape_03 ; shape_03_type::assign( shape_03 ); shape_14_type shape_14 ; shape_14_type::assign( shape_14 , 0 ); shape_22_type shape_22 ; shape_22_type::assign( shape_22 , 0 , 0 ); shape_36_type shape_36 ; shape_36_type::assign( shape_36 , 10 , 20 , 30 ); ASSERT_TRUE( shape_01.rank_dynamic == 0u ); ASSERT_TRUE( shape_01.rank == 1u ); ASSERT_TRUE( shape_01.N0 == 100u ); ASSERT_TRUE( shape_11.rank_dynamic == 1u ); ASSERT_TRUE( shape_11.rank == 1u ); ASSERT_TRUE( shape_11.N0 == 1000u ); ASSERT_TRUE( shape_03.rank_dynamic == 0u ); ASSERT_TRUE( shape_03.rank == 3u ); ASSERT_TRUE( shape_03.N0 == 5u ); ASSERT_TRUE( shape_03.N1 == 6u ); ASSERT_TRUE( shape_03.N2 == 700u ); ASSERT_TRUE( shape_14.rank_dynamic == 1u ); ASSERT_TRUE( shape_14.rank == 4u ); ASSERT_TRUE( shape_14.N0 == 0u ); ASSERT_TRUE( shape_14.N1 == 8u ); ASSERT_TRUE( shape_14.N2 == 9u ); ASSERT_TRUE( shape_14.N3 == 900u ); ASSERT_TRUE( shape_22.rank_dynamic == 2u ); ASSERT_TRUE( shape_22.rank == 2u ); ASSERT_TRUE( shape_22.N0 == 0u ); ASSERT_TRUE( shape_22.N1 == 0u ); ASSERT_TRUE( shape_36.rank_dynamic == 3u ); ASSERT_TRUE( shape_36.rank == 6u ); ASSERT_TRUE( shape_36.N0 == 10u ); ASSERT_TRUE( shape_36.N1 == 20u ); ASSERT_TRUE( shape_36.N2 == 30u ); ASSERT_TRUE( shape_36.N3 == 5u ); ASSERT_TRUE( shape_36.N4 == 6u ); ASSERT_TRUE( shape_36.N5 == 7u ); ASSERT_TRUE( shape_01 == shape_01 ); ASSERT_TRUE( shape_11 == shape_11 ); ASSERT_TRUE( shape_36 == shape_36 ); ASSERT_TRUE( shape_01 != shape_36 ); ASSERT_TRUE( shape_22 != shape_36 ); //------------------------------------------------------------------------ typedef Kokkos::Impl::ViewOffset< shape_01_type , Kokkos::LayoutLeft > shape_01_left_offset ; typedef Kokkos::Impl::ViewOffset< shape_11_type , Kokkos::LayoutLeft > shape_11_left_offset ; typedef Kokkos::Impl::ViewOffset< shape_03_type , Kokkos::LayoutLeft > shape_03_left_offset ; typedef Kokkos::Impl::ViewOffset< shape_14_type , Kokkos::LayoutLeft > shape_14_left_offset ; typedef Kokkos::Impl::ViewOffset< shape_22_type , Kokkos::LayoutLeft > shape_22_left_offset ; typedef Kokkos::Impl::ViewOffset< shape_36_type , Kokkos::LayoutLeft > shape_36_left_offset ; typedef Kokkos::Impl::ViewOffset< shape_01_type , Kokkos::LayoutRight > shape_01_right_offset ; typedef Kokkos::Impl::ViewOffset< shape_11_type , Kokkos::LayoutRight > shape_11_right_offset ; typedef Kokkos::Impl::ViewOffset< shape_03_type , Kokkos::LayoutRight > shape_03_right_offset ; typedef Kokkos::Impl::ViewOffset< shape_14_type , Kokkos::LayoutRight > shape_14_right_offset ; typedef Kokkos::Impl::ViewOffset< shape_22_type , Kokkos::LayoutRight > shape_22_right_offset ; typedef Kokkos::Impl::ViewOffset< shape_36_type , Kokkos::LayoutRight > shape_36_right_offset ; ASSERT_TRUE( ! shape_01_left_offset::has_padding ); ASSERT_TRUE( ! shape_11_left_offset::has_padding ); ASSERT_TRUE( ! shape_03_left_offset::has_padding ); ASSERT_TRUE( shape_14_left_offset::has_padding ); ASSERT_TRUE( shape_22_left_offset::has_padding ); ASSERT_TRUE( shape_36_left_offset::has_padding ); ASSERT_TRUE( ! shape_01_right_offset::has_padding ); ASSERT_TRUE( ! shape_11_right_offset::has_padding ); ASSERT_TRUE( ! shape_03_right_offset::has_padding ); ASSERT_TRUE( ! shape_14_right_offset::has_padding ); ASSERT_TRUE( shape_22_right_offset::has_padding ); ASSERT_TRUE( shape_36_right_offset::has_padding ); //------------------------------------------------------------------------ typedef Kokkos::Impl::ViewOffset< shape_01_type , Kokkos::LayoutStride > shape_01_stride_offset ; typedef Kokkos::Impl::ViewOffset< shape_36_type , Kokkos::LayoutStride > shape_36_stride_offset ; { shape_01_stride_offset stride_offset_01 ; stride_offset_01.assign( 1, stride_offset_01.N0, 0,0,0,0,0,0,0 ); ASSERT_EQ( int(stride_offset_01.S[0]) , int(1) ); ASSERT_EQ( int(stride_offset_01.S[1]) , int(stride_offset_01.N0) ); } { shape_36_stride_offset stride_offset_36 ; size_t str[7] ; str[5] = 1 ; str[4] = str[5] * stride_offset_36.N5 ; str[3] = str[4] * stride_offset_36.N4 ; str[2] = str[3] * stride_offset_36.N3 ; str[1] = str[2] * 100 ; str[0] = str[1] * 200 ; str[6] = str[0] * 300 ; stride_offset_36.assign( str[0] , str[1] , str[2] , str[3] , str[4] , str[5] , str[6] , 0 , 0 ); ASSERT_EQ( size_t(stride_offset_36.S[6]) , size_t(str[6]) ); ASSERT_EQ( size_t(stride_offset_36.N2) , size_t(100) ); ASSERT_EQ( size_t(stride_offset_36.N1) , size_t(200) ); ASSERT_EQ( size_t(stride_offset_36.N0) , size_t(300) ); } //------------------------------------------------------------------------ { const int rank = 6 ; const int order[] = { 5 , 3 , 1 , 0 , 2 , 4 }; const unsigned dim[] = { 2 , 3 , 5 , 7 , 11 , 13 }; Kokkos::LayoutStride stride_6 = Kokkos::LayoutStride::order_dimensions( rank , order , dim ); size_t n = 1 ; for ( int i = 0 ; i < rank ; ++i ) { ASSERT_EQ( size_t(dim[i]) , size_t( stride_6.dimension[i] ) ); ASSERT_EQ( size_t(n) , size_t( stride_6.stride[ order[i] ] ) ); n *= dim[order[i]] ; } } //------------------------------------------------------------------------ } } /* namespace Test */ #endif /*--------------------------------------------------------------------------*/