viennacl_operations.hpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. [auto_generated]
  3. boost/numeric/odeint/external/viennacl_operations.hpp
  4. [begin_description]
  5. ViennaCL operations.
  6. [end_description]
  7. Copyright 2012 Denis Demidov
  8. Copyright 2012 Karsten Ahnert
  9. Copyright 2012 Mario Mulansky
  10. Distributed under the Boost Software License, Version 1.0.
  11. (See accompanying file LICENSE_1_0.txt or
  12. copy at http://www.boost.org/LICENSE_1_0.txt)
  13. */
  14. #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED
  15. #define BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED
  16. #include <viennacl/vector.hpp>
  17. #ifdef VIENNACL_WITH_OPENCL
  18. # include <viennacl/generator/custom_operation.hpp>
  19. #endif
  20. namespace boost {
  21. namespace numeric {
  22. namespace odeint {
  23. #ifdef VIENNACL_WITH_OPENCL
  24. struct viennacl_operations
  25. {
  26. template< class Fac1 = double , class Fac2 = Fac1 >
  27. struct scale_sum2
  28. {
  29. const Fac1 m_alpha1;
  30. const Fac2 m_alpha2;
  31. scale_sum2( Fac1 alpha1 , Fac2 alpha2 )
  32. : m_alpha1( alpha1 ) , m_alpha2( alpha2 )
  33. { }
  34. template< class T1 , class T2 , class T3 >
  35. void operator()( viennacl::vector<T1> &v1 ,
  36. const viennacl::vector<T2> &v2 ,
  37. const viennacl::vector<T3> &v3
  38. ) const
  39. {
  40. using namespace viennacl;
  41. static generator::symbolic_vector <0, T1> sym_v1;
  42. static generator::symbolic_vector <1, T2> sym_v2;
  43. static generator::symbolic_vector <2, T3> sym_v3;
  44. static generator::cpu_symbolic_scalar<3, Fac1> sym_a1;
  45. static generator::cpu_symbolic_scalar<4, Fac2> sym_a2;
  46. static generator::custom_operation op(
  47. sym_v1 = sym_a1 * sym_v2
  48. + sym_a2 * sym_v3,
  49. "scale_sum2"
  50. );
  51. ocl::enqueue( op(v1, v2, v3, m_alpha1, m_alpha2) );
  52. }
  53. typedef void result_type;
  54. };
  55. template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 >
  56. struct scale_sum3
  57. {
  58. const Fac1 m_alpha1;
  59. const Fac2 m_alpha2;
  60. const Fac3 m_alpha3;
  61. scale_sum3( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 )
  62. : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 )
  63. { }
  64. template< class T1 , class T2 , class T3 , class T4 >
  65. void operator()( viennacl::vector<T1> &v1 ,
  66. const viennacl::vector<T2> &v2 ,
  67. const viennacl::vector<T3> &v3 ,
  68. const viennacl::vector<T4> &v4
  69. ) const
  70. {
  71. using namespace viennacl;
  72. static generator::symbolic_vector <0, T1> sym_v1;
  73. static generator::symbolic_vector <1, T2> sym_v2;
  74. static generator::symbolic_vector <2, T3> sym_v3;
  75. static generator::symbolic_vector <3, T4> sym_v4;
  76. static generator::cpu_symbolic_scalar<4, Fac1> sym_a1;
  77. static generator::cpu_symbolic_scalar<5, Fac2> sym_a2;
  78. static generator::cpu_symbolic_scalar<6, Fac3> sym_a3;
  79. static generator::custom_operation op(
  80. sym_v1 = sym_a1 * sym_v2
  81. + sym_a2 * sym_v3
  82. + sym_a3 * sym_v4,
  83. "scale_sum3"
  84. );
  85. ocl::enqueue( op(v1, v2, v3, v4, m_alpha1, m_alpha2, m_alpha3) );
  86. }
  87. typedef void result_type;
  88. };
  89. template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 >
  90. struct scale_sum4
  91. {
  92. const Fac1 m_alpha1;
  93. const Fac2 m_alpha2;
  94. const Fac3 m_alpha3;
  95. const Fac4 m_alpha4;
  96. scale_sum4( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 )
  97. : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) { }
  98. template< class T1 , class T2 , class T3 , class T4 , class T5 >
  99. void operator()( viennacl::vector<T1> &v1 ,
  100. const viennacl::vector<T2> &v2 ,
  101. const viennacl::vector<T3> &v3 ,
  102. const viennacl::vector<T4> &v4 ,
  103. const viennacl::vector<T5> &v5
  104. ) const
  105. {
  106. using namespace viennacl;
  107. static generator::symbolic_vector <0, T1> sym_v1;
  108. static generator::symbolic_vector <1, T2> sym_v2;
  109. static generator::symbolic_vector <2, T3> sym_v3;
  110. static generator::symbolic_vector <3, T4> sym_v4;
  111. static generator::symbolic_vector <4, T5> sym_v5;
  112. static generator::cpu_symbolic_scalar<5, Fac1> sym_a1;
  113. static generator::cpu_symbolic_scalar<6, Fac2> sym_a2;
  114. static generator::cpu_symbolic_scalar<7, Fac3> sym_a3;
  115. static generator::cpu_symbolic_scalar<8, Fac4> sym_a4;
  116. static generator::custom_operation op(
  117. sym_v1 = sym_a1 * sym_v2
  118. + sym_a2 * sym_v3
  119. + sym_a3 * sym_v4
  120. + sym_a4 * sym_v5,
  121. "scale_sum4"
  122. );
  123. ocl::enqueue( op(v1, v2, v3, v4, v5,
  124. m_alpha1, m_alpha2, m_alpha3, m_alpha4) );
  125. }
  126. typedef void result_type;
  127. };
  128. template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 >
  129. struct scale_sum5
  130. {
  131. const Fac1 m_alpha1;
  132. const Fac2 m_alpha2;
  133. const Fac3 m_alpha3;
  134. const Fac4 m_alpha4;
  135. const Fac5 m_alpha5;
  136. scale_sum5( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 )
  137. : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { }
  138. template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
  139. void operator()( viennacl::vector<T1> &v1 ,
  140. const viennacl::vector<T2> &v2 ,
  141. const viennacl::vector<T3> &v3 ,
  142. const viennacl::vector<T4> &v4 ,
  143. const viennacl::vector<T5> &v5 ,
  144. const viennacl::vector<T6> &v6
  145. ) const
  146. {
  147. using namespace viennacl;
  148. static generator::symbolic_vector < 0, T1> sym_v1;
  149. static generator::symbolic_vector < 1, T2> sym_v2;
  150. static generator::symbolic_vector < 2, T3> sym_v3;
  151. static generator::symbolic_vector < 3, T4> sym_v4;
  152. static generator::symbolic_vector < 4, T5> sym_v5;
  153. static generator::symbolic_vector < 5, T6> sym_v6;
  154. static generator::cpu_symbolic_scalar< 6, Fac1> sym_a1;
  155. static generator::cpu_symbolic_scalar< 7, Fac2> sym_a2;
  156. static generator::cpu_symbolic_scalar< 8, Fac3> sym_a3;
  157. static generator::cpu_symbolic_scalar< 9, Fac4> sym_a4;
  158. static generator::cpu_symbolic_scalar<10, Fac5> sym_a5;
  159. static generator::custom_operation op(
  160. sym_v1 = sym_a1 * sym_v2
  161. + sym_a2 * sym_v3
  162. + sym_a3 * sym_v4
  163. + sym_a4 * sym_v5
  164. + sym_a5 * sym_v6,
  165. "scale_sum5"
  166. );
  167. ocl::enqueue( op(v1, v2, v3, v4, v5, v6,
  168. m_alpha1, m_alpha2, m_alpha3, m_alpha4, m_alpha5) );
  169. }
  170. typedef void result_type;
  171. };
  172. };
  173. #else
  174. struct viennacl_operations : public default_operations {};
  175. #endif
  176. } // odeint
  177. } // numeric
  178. } // boost
  179. #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED