32#ifndef UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_ACCESSOR_HPP
33#define UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_EXTRACT_ACCESSOR_HPP
42template <
typename Evaluator>
43struct ExtractAccessor;
45struct 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()));
68template <
template<
class,
class>
class UnaryCategory,
typename OP,
typename RHSExpr,
typename Dev>
69struct 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());
77template <
template<
class,
class>
class UnaryCategory,
typename OP,
typename RHSExpr,
typename Dev>
78struct ExtractAccessor<TensorEvaluator<UnaryCategory<OP, RHSExpr>, Dev> >
79: ExtractAccessor<TensorEvaluator<const UnaryCategory<OP, RHSExpr>, Dev> > {};
82template <
template<
class,
class,
class>
class BinaryCategory,
typename OP,
typename LHSExpr,
typename RHSExpr,
typename Dev>
83struct 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());
90template <
template<
class,
class,
class>
class BinaryCategory,
typename OP,
typename LHSExpr,
typename RHSExpr,
typename Dev>
91struct ExtractAccessor<TensorEvaluator<BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> >
92: ExtractAccessor<TensorEvaluator<const BinaryCategory<OP, LHSExpr, RHSExpr>, Dev> >{};
96template <
template<
class,
class,
class,
class>
class TernaryCategory,
typename OP,
typename Arg1Expr,
typename Arg2Expr,
typename Arg3Expr,
typename Dev>
97struct 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());
105template <
template<
class,
class,
class,
class>
class TernaryCategory,
typename OP,
typename Arg1Expr,
typename Arg2Expr,
typename Arg3Expr,
typename Dev>
106struct ExtractAccessor<TensorEvaluator<TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> >
107: ExtractAccessor<TensorEvaluator<const TernaryCategory<OP, Arg1Expr, Arg2Expr, Arg3Expr>, Dev> >{};
111template <
typename IfExpr,
typename ThenExpr,
typename ElseExpr,
typename Dev>
112struct 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());
121template <
typename IfExpr,
typename ThenExpr,
typename ElseExpr,
typename Dev>
122struct ExtractAccessor<TensorEvaluator<TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> >
123: ExtractAccessor<TensorEvaluator<const TensorSelectOp<IfExpr, ThenExpr, ElseExpr>, Dev> >{};
126template <
typename LHSExpr,
typename RHSExpr,
typename Dev>
127struct 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());
135template <
typename LHSExpr,
typename RHSExpr,
typename Dev>
136struct ExtractAccessor<TensorEvaluator<TensorAssignOp<LHSExpr, RHSExpr>, Dev> >
137: ExtractAccessor<TensorEvaluator<const TensorAssignOp<LHSExpr, RHSExpr>, Dev> >{};
140#define TENSORMAPEXPR(CVQual, ACCType)\
141template <typename PlainObjectType, int Options_, typename Dev>\
142struct 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);\
148TENSORMAPEXPR(
const, cl::sycl::access::mode::read)
149TENSORMAPEXPR(, cl::sycl::access::mode::read_write)
153template <
typename Expr,
typename Dev>
154struct 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);
162template <
typename Expr,
typename Dev>
163struct ExtractAccessor<TensorEvaluator<TensorForcedEvalOp<Expr>, Dev> >
164: ExtractAccessor<TensorEvaluator<const TensorForcedEvalOp<Expr>, Dev> >{};
167template <
typename Expr,
typename Dev>
168struct 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()));
176template <
typename Expr,
typename Dev>
177struct ExtractAccessor<TensorEvaluator<TensorEvalToOp<Expr>, Dev> >
178: ExtractAccessor<TensorEvaluator<const TensorEvalToOp<Expr>, Dev> >{};
181template <
typename OP,
typename Dim,
typename Expr,
typename Dev>
182struct 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);
190template <
typename OP,
typename Dim,
typename Expr,
typename Dev>
191struct ExtractAccessor<TensorEvaluator<TensorReductionOp<OP, Dim, Expr>, Dev> >
192: ExtractAccessor<TensorEvaluator<const TensorReductionOp<OP, Dim, Expr>, Dev> >{};
195template <
typename Evaluator>
196auto createTupleOfAccessors(cl::sycl::handler& cgh,
const Evaluator& expr)
197->
decltype(ExtractAccessor<Evaluator>::getTuple(cgh, expr)) {
198 return ExtractAccessor<Evaluator>::getTuple(cgh, expr);
Namespace containing all symbols from the Eigen library.
Definition: AdolcForward:45