32 #ifndef UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_ACCESSOR_HPP 33 #define UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_ACCESSOR_HPP 36 namespace TensorSycl {
42 template <
typename Evaluator>
43 struct ExtractAccessor;
45 struct AccessorConstructor{
46 template<
typename Arg>
static inline auto getTuple(cl::sycl::handler& cgh, Arg eval)
47 -> decltype(ExtractAccessor<Arg>::getTuple(cgh, eval)) {
48 return ExtractAccessor<Arg>::getTuple(cgh, eval);
51 template<
typename Arg1,
typename Arg2>
static inline auto getTuple(cl::sycl::handler& cgh, Arg1 eval1, Arg2 eval2)
52 -> decltype(utility::tuple::append(ExtractAccessor<Arg1>::getTuple(cgh, eval1), ExtractAccessor<Arg2>::getTuple(cgh, eval2))) {
53 return utility::tuple::append(ExtractAccessor<Arg1>::getTuple(cgh, eval1), ExtractAccessor<Arg2>::getTuple(cgh, eval2));
55 template<
typename Arg1,
typename Arg2,
typename Arg3>
static inline auto getTuple(cl::sycl::handler& cgh, Arg1 eval1 , Arg2 eval2 , Arg3 eval3)
56 -> decltype(utility::tuple::append(ExtractAccessor<Arg1>::getTuple(cgh, eval1),utility::tuple::append(ExtractAccessor<Arg2>::getTuple(cgh, eval2), ExtractAccessor<Arg3>::getTuple(cgh, eval3)))) {
57 return utility::tuple::append(ExtractAccessor<Arg1>::getTuple(cgh, eval1),utility::tuple::append(ExtractAccessor<Arg2>::getTuple(cgh, eval2), ExtractAccessor<Arg3>::getTuple(cgh, eval3)));
59 template< cl::sycl::access::mode AcM,
typename Arg>
static inline auto getAccessor(cl::sycl::handler& cgh, Arg eval)
60 -> decltype(utility::tuple::make_tuple( eval.device().template get_sycl_accessor<AcM,
61 typename Eigen::internal::remove_all<typename Arg::CoeffReturnType>::type>(eval.dimensions().TotalSize(), cgh,eval.data()))){
62 return utility::tuple::make_tuple(eval.device().template get_sycl_accessor<AcM, typename Eigen::internal::remove_all<typename Arg::CoeffReturnType>::type>(eval.dimensions().TotalSize(), cgh,eval.data()));
68 template <
template<
class,
class>
class UnaryCategory,
typename OP,
typename RHSExpr,
typename Dev>
69 struct ExtractAccessor<TensorEvaluator<const UnaryCategory<OP, RHSExpr>, Dev> > {
70 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const UnaryCategory<OP, RHSExpr>, Dev> eval)
71 -> decltype(AccessorConstructor::getTuple(cgh, eval.impl())){
72 return AccessorConstructor::getTuple(cgh, eval.impl());
77 template <
template<
class,
class>
class UnaryCategory,
typename OP,
typename RHSExpr,
typename Dev>
78 struct ExtractAccessor<TensorEvaluator<UnaryCategory<OP, RHSExpr>, Dev> >
79 : ExtractAccessor<TensorEvaluator<const UnaryCategory<OP, RHSExpr>, Dev> > {};
82 template <
template<
class,
class,
class>
class BinaryCategory,
typename OP,
typename LHSExpr,
typename RHSExpr,
typename Dev>
83 struct ExtractAccessor<TensorEvaluator<const BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> > {
84 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> eval)
85 -> decltype(AccessorConstructor::getTuple(cgh, eval.left_impl(), eval.right_impl())){
86 return AccessorConstructor::getTuple(cgh, eval.left_impl(), eval.right_impl());
90 template <
template<
class,
class,
class>
class BinaryCategory,
typename OP,
typename LHSExpr,
typename RHSExpr,
typename Dev>
91 struct ExtractAccessor<TensorEvaluator<BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> >
92 : ExtractAccessor<TensorEvaluator<const BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> >{};
96 template <
template<
class,
class,
class,
class>
class TernaryCategory,
typename OP,
typename Arg1Expr,
typename Arg2Expr,
typename Arg3Expr,
typename Dev>
97 struct ExtractAccessor<TensorEvaluator<const TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> > {
98 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> eval)
99 -> decltype(AccessorConstructor::getTuple(cgh, eval.arg1Impl(), eval.arg2Impl(), eval.arg3Impl())){
100 return AccessorConstructor::getTuple(cgh, eval.arg1Impl(), eval.arg2Impl(), eval.arg3Impl());
105 template <
template<
class,
class,
class,
class>
class TernaryCategory,
typename OP,
typename Arg1Expr,
typename Arg2Expr,
typename Arg3Expr,
typename Dev>
106 struct ExtractAccessor<TensorEvaluator<TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> >
107 : ExtractAccessor<TensorEvaluator<const TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> >{};
111 template <
typename IfExpr,
typename ThenExpr,
typename ElseExpr,
typename Dev>
112 struct ExtractAccessor<TensorEvaluator<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> > {
113 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> eval)
114 -> decltype(AccessorConstructor::getTuple(cgh, eval.cond_impl(), eval.then_impl(), eval.else_impl())){
115 return AccessorConstructor::getTuple(cgh, eval.cond_impl(), eval.then_impl(), eval.else_impl());
121 template <
typename IfExpr,
typename ThenExpr,
typename ElseExpr,
typename Dev>
122 struct ExtractAccessor<TensorEvaluator<TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> >
123 : ExtractAccessor<TensorEvaluator<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> >{};
126 template <
typename LHSExpr,
typename RHSExpr,
typename Dev>
127 struct ExtractAccessor<TensorEvaluator<const TensorAssignOp<LHSExpr, RHSExpr>, Dev> > {
128 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const TensorAssignOp<LHSExpr, RHSExpr>, Dev> eval)
129 -> decltype(AccessorConstructor::getTuple(cgh, eval.left_impl(), eval.right_impl())){
130 return AccessorConstructor::getTuple(cgh, eval.left_impl(), eval.right_impl());
135 template <
typename LHSExpr,
typename RHSExpr,
typename Dev>
136 struct ExtractAccessor<TensorEvaluator<TensorAssignOp<LHSExpr, RHSExpr>, Dev> >
137 : ExtractAccessor<TensorEvaluator<const TensorAssignOp<LHSExpr, RHSExpr>, Dev> >{};
140 #define TENSORMAPEXPR(CVQual, ACCType)\ 141 template <typename PlainObjectType, int Options_, typename Dev>\ 142 struct ExtractAccessor<TensorEvaluator<CVQual TensorMap<PlainObjectType, Options_>, Dev> > {\ 143 static inline auto getTuple(cl::sycl::handler& cgh,const TensorEvaluator<CVQual TensorMap<PlainObjectType, Options_>, Dev> eval)\ 144 -> decltype(AccessorConstructor::template getAccessor<ACCType>(cgh, eval)){\ 145 return AccessorConstructor::template getAccessor<ACCType>(cgh, eval);\ 148 TENSORMAPEXPR(
const, cl::sycl::access::mode::read)
149 TENSORMAPEXPR(, cl::sycl::access::mode::read_write)
153 template <
typename Expr,
typename Dev>
154 struct ExtractAccessor<TensorEvaluator<const TensorForcedEvalOp<Expr>, Dev> > {
155 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const TensorForcedEvalOp<Expr>, Dev> eval)
156 -> decltype(AccessorConstructor::template getAccessor<cl::sycl::access::mode::read>(cgh, eval)){
157 return AccessorConstructor::template getAccessor<cl::sycl::access::mode::read>(cgh, eval);
162 template <
typename Expr,
typename Dev>
163 struct ExtractAccessor<TensorEvaluator<TensorForcedEvalOp<Expr>, Dev> >
164 : ExtractAccessor<TensorEvaluator<const TensorForcedEvalOp<Expr>, Dev> >{};
167 template <
typename Expr,
typename Dev>
168 struct ExtractAccessor<TensorEvaluator<const TensorEvalToOp<Expr>, Dev> > {
169 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const TensorEvalToOp<Expr>, Dev> eval)
170 -> decltype(utility::tuple::append(AccessorConstructor::template getAccessor<cl::sycl::access::mode::write>(cgh, eval), AccessorConstructor::getTuple(cgh, eval.impl()))){
171 return utility::tuple::append(AccessorConstructor::template getAccessor<cl::sycl::access::mode::write>(cgh, eval), AccessorConstructor::getTuple(cgh, eval.impl()));
176 template <
typename Expr,
typename Dev>
177 struct ExtractAccessor<TensorEvaluator<TensorEvalToOp<Expr>, Dev> >
178 : ExtractAccessor<TensorEvaluator<const TensorEvalToOp<Expr>, Dev> >{};
181 template <
typename OP,
typename Dim,
typename Expr,
typename Dev>
182 struct ExtractAccessor<TensorEvaluator<const TensorReductionOp<OP, Dim, Expr>, Dev> > {
183 static inline auto getTuple(cl::sycl::handler& cgh,
const TensorEvaluator<
const TensorReductionOp<OP, Dim, Expr>, Dev> eval)
184 -> decltype(AccessorConstructor::template getAccessor<cl::sycl::access::mode::read>(cgh, eval)){
185 return AccessorConstructor::template getAccessor<cl::sycl::access::mode::read>(cgh, eval);
190 template <
typename OP,
typename Dim,
typename Expr,
typename Dev>
191 struct ExtractAccessor<TensorEvaluator<TensorReductionOp<OP, Dim, Expr>, Dev> >
192 : ExtractAccessor<TensorEvaluator<const TensorReductionOp<OP, Dim, Expr>, Dev> >{};
195 template <
typename Evaluator>
196 auto createTupleOfAccessors(cl::sycl::handler& cgh,
const Evaluator& expr)
197 -> decltype(ExtractAccessor<Evaluator>::getTuple(cgh, expr)) {
198 return ExtractAccessor<Evaluator>::getTuple(cgh, expr);
204 #endif // UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_ACCESSOR_HPP Namespace containing all symbols from the Eigen library.
Definition: AdolcForward:45