1 /* 2 [auto_generated] 3 boost/numeric/odeint/external/thrust/thrust_resize.hpp 4 5 [begin_description] 6 Enable resizing for thrusts device and host_vector. 7 [end_description] 8 9 Copyright 2010-2014 Mario Mulansky 10 Copyright 2010-2011 Karsten Ahnert 11 12 Distributed under the Boost Software License, Version 1.0. 13 (See accompanying file LICENSE_1_0.txt or 14 copy at http://www.boost.org/LICENSE_1_0.txt) 15 */ 16 17 18 #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_RESIZE_HPP_INCLUDED 19 #define BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_RESIZE_HPP_INCLUDED 20 21 #include <boost/range.hpp> 22 23 #include <thrust/device_vector.h> 24 #include <thrust/host_vector.h> 25 #include <thrust/distance.h> 26 27 #include <boost/numeric/odeint/util/resize.hpp> 28 #include <boost/numeric/odeint/util/same_size.hpp> 29 #include <boost/numeric/odeint/util/copy.hpp> 30 31 namespace boost { 32 namespace numeric { 33 namespace odeint { 34 35 // some macros that define the necessary utilities 36 37 #define ODEINT_THRUST_VECTOR_IS_RESIZEABLE( THRUST_VECTOR ) \ 38 template< class T , class A > \ 39 struct is_resizeable< THRUST_VECTOR<T,A> > \ 40 { \ 41 struct type : public boost::true_type { }; \ 42 const static bool value = type::value; \ 43 }; \ 44 45 #define ODEINT_TRHUST_VECTOR_RESIZE_IMPL( THRUST_VECTOR ) \ 46 template< class T, class A > \ 47 struct resize_impl< THRUST_VECTOR<T,A> , THRUST_VECTOR<T,A> > \ 48 { \ 49 static void resize( THRUST_VECTOR<T,A> &x , \ 50 const THRUST_VECTOR<T,A> &y ) \ 51 { \ 52 x.resize( y.size() ); \ 53 } \ 54 }; \ 55 template< class T, class A, typename Range > \ 56 struct resize_impl< THRUST_VECTOR<T,A> , Range > \ 57 { \ 58 static void resize( THRUST_VECTOR<T,A> &x , \ 59 const Range &y ) \ 60 { \ 61 x.resize( thrust::distance(boost::begin(y), \ 62 boost::end(y))); \ 63 } \ 64 }; \ 65 66 67 #define ODEINT_THRUST_SAME_SIZE_IMPL( THRUST_VECTOR ) \ 68 template< class T , class A > \ 69 struct same_size_impl< THRUST_VECTOR<T,A> , THRUST_VECTOR<T,A> > \ 70 { \ 71 static bool same_size( const THRUST_VECTOR<T,A> &x , \ 72 const THRUST_VECTOR<T,A> &y ) \ 73 { \ 74 return x.size() == y.size(); \ 75 } \ 76 }; \ 77 template< class T , class A, typename Range > \ 78 struct same_size_impl< THRUST_VECTOR<T,A> , Range > \ 79 { \ 80 static bool same_size( const THRUST_VECTOR<T,A> &x , \ 81 const Range &y ) \ 82 { \ 83 return x.size() == thrust::distance(boost::begin(y), \ 84 boost::end(y)); \ 85 } \ 86 }; \ 87 88 89 #define ODEINT_THRUST_COPY_IMPL( THRUST_VECTOR ) \ 90 template< class Container1 , class T , class A > \ 91 struct copy_impl< Container1 , THRUST_VECTOR<T,A> > \ 92 { \ 93 static void copy( const Container1 &from , THRUST_VECTOR<T,A> &to ) \ 94 { \ 95 thrust::copy( boost::begin( from ) , boost::end( from ) , \ 96 boost::begin( to ) ); \ 97 } \ 98 }; \ 99 \ 100 template< class T , class A , class Container2 > \ 101 struct copy_impl< THRUST_VECTOR<T,A> , Container2 > \ 102 { \ 103 static void copy( const THRUST_VECTOR<T,A> &from , Container2 &to ) \ 104 { \ 105 thrust::copy( boost::begin( from ) , boost::end( from ) , \ 106 boost::begin( to ) ); \ 107 } \ 108 }; \ 109 \ 110 template< class T , class A > \ 111 struct copy_impl< THRUST_VECTOR<T,A> , THRUST_VECTOR<T,A> > \ 112 { \ 113 static void copy( const THRUST_VECTOR<T,A> &from , \ 114 THRUST_VECTOR<T,A> &to ) \ 115 { \ 116 thrust::copy( boost::begin( from ) , boost::end( from ) , \ 117 boost::begin( to ) ); \ 118 } \ 119 }; \ 120 121 // add support for the standard thrust containers 122 123 ODEINT_THRUST_VECTOR_IS_RESIZEABLE( thrust::device_vector ) 124 ODEINT_TRHUST_VECTOR_RESIZE_IMPL( thrust::device_vector ) 125 ODEINT_THRUST_SAME_SIZE_IMPL( thrust::device_vector ) 126 ODEINT_THRUST_COPY_IMPL( thrust::device_vector ) 127 128 129 ODEINT_THRUST_VECTOR_IS_RESIZEABLE( thrust::host_vector ) 130 ODEINT_TRHUST_VECTOR_RESIZE_IMPL( thrust::host_vector ) 131 ODEINT_THRUST_SAME_SIZE_IMPL( thrust::host_vector ) 132 ODEINT_THRUST_COPY_IMPL( thrust::host_vector ) 133 134 135 } // odeint 136 } // numeric 137 } // boost 138 139 // add support for thrust backend vectors, if available 140 141 #include <thrust/version.h> 142 143 #if THRUST_VERSION >= 100600 144 145 #include <thrust/system/cpp/vector.h> 146 namespace boost { namespace numeric { namespace odeint { 147 ODEINT_THRUST_VECTOR_IS_RESIZEABLE( thrust::cpp::vector ) 148 ODEINT_TRHUST_VECTOR_RESIZE_IMPL( thrust::cpp::vector ) 149 ODEINT_THRUST_SAME_SIZE_IMPL( thrust::cpp::vector ) 150 ODEINT_THRUST_COPY_IMPL( thrust::cpp::vector ) 151 } } } 152 153 #ifdef _OPENMP 154 #include <thrust/system/omp/vector.h> 155 namespace boost { namespace numeric { namespace odeint { 156 ODEINT_THRUST_VECTOR_IS_RESIZEABLE( thrust::omp::vector ) 157 ODEINT_TRHUST_VECTOR_RESIZE_IMPL( thrust::omp::vector ) 158 ODEINT_THRUST_SAME_SIZE_IMPL( thrust::omp::vector ) 159 ODEINT_THRUST_COPY_IMPL( thrust::omp::vector ) 160 } } } 161 #endif // _OPENMP 162 163 #ifdef TBB_VERSION_MAJOR 164 #include <thrust/system/tbb/vector.h> 165 namespace boost { namespace numeric { namespace odeint { 166 ODEINT_THRUST_VECTOR_IS_RESIZEABLE( thrust::tbb::vector ) 167 ODEINT_TRHUST_VECTOR_RESIZE_IMPL( thrust::tbb::vector ) 168 ODEINT_THRUST_SAME_SIZE_IMPL( thrust::tbb::vector ) 169 ODEINT_THRUST_COPY_IMPL( thrust::tbb::vector ) 170 } } } 171 #endif // TBB_VERSION_MAJOR 172 173 #ifdef __CUDACC__ 174 #include <thrust/system/cuda/vector.h> 175 namespace boost { namespace numeric { namespace odeint { 176 ODEINT_THRUST_VECTOR_IS_RESIZEABLE( thrust::cuda::vector ) 177 ODEINT_TRHUST_VECTOR_RESIZE_IMPL( thrust::cuda::vector ) 178 ODEINT_THRUST_SAME_SIZE_IMPL( thrust::cuda::vector ) 179 ODEINT_THRUST_COPY_IMPL( thrust::cuda::vector ) 180 } } } 181 #endif // __CUDACC__ 182 183 #endif // THRUST_VERSION >= 100600 184 185 #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_RESIZE_HPP_INCLUDED 186