diff options
author | Mehdi Goli <mehdi.goli@codeplay.com> | 2016-12-02 17:58:30 +0000 |
---|---|---|
committer | Mehdi Goli <mehdi.goli@codeplay.com> | 2016-12-02 17:58:30 +0000 |
commit | 592acc5bfa573db766d020473189d25bd0c2ee48 (patch) | |
tree | d4b44a0eb624d4a88f8b15fecd339359d93a2f82 /unsupported/Eigen/CXX11 | |
parent | 7ff26ddcbb9abbb961ccd8f2c3949cab55b18e04 (diff) |
Makingt default numeric_list works with sycl.
Diffstat (limited to 'unsupported/Eigen/CXX11')
3 files changed, 37 insertions, 25 deletions
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExprConstructor.h b/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExprConstructor.h index 7b15f93fe..df1a732e7 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExprConstructor.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExprConstructor.h @@ -25,6 +25,15 @@ namespace Eigen { namespace TensorSycl { namespace internal { + +template <typename Expr, typename Dims> +struct DeviceFixedSizeTensor; + +template <typename Expr, typename std::ptrdiff_t... Indices> +struct DeviceFixedSizeTensor<Expr, Eigen::Sizes<Indices...>>{ + template<typename Data> + static EIGEN_ALWAYS_INLINE Expr instantiate(Data& dt) {return Expr(ConvertToActualTypeSycl(typename Expr::Scalar, dt), Indices...);} +}; /// this class is used by EvalToOp in order to create an lhs expression which is /// a pointer from an accessor on device-only buffer template <typename PtrType, size_t N, typename... Params> @@ -61,6 +70,23 @@ TENSORMAP(const) TENSORMAP() #undef TENSORMAP +/// specialisation of the \ref ExprConstructor struct when the node type is +/// TensorMap +#define TENSORMAPFIXEDSIZE(CVQual)\ +template <typename Scalar_, typename Dimensions_, int Options_2, typename IndexType, int Options_,\ +template <class> class MakePointer_, size_t N, typename... Params>\ +struct ExprConstructor< CVQual TensorMap<TensorFixedSize<Scalar_, Dimensions_, Options_2, IndexType>, Options_, MakeGlobalPointer>,\ +CVQual PlaceHolder<CVQual TensorMap<TensorFixedSize<Scalar_, Dimensions_, Options_2, IndexType>, Options_, MakePointer_>, N>, Params...>{\ + typedef CVQual TensorMap<TensorFixedSize<Scalar_, Dimensions_, Options_2, IndexType>, Options_, MakeGlobalPointer> Type;\ + Type expr;\ + template <typename FuncDetector>\ + ExprConstructor(FuncDetector &, const utility::tuple::Tuple<Params...> &t)\ + : expr(DeviceFixedSizeTensor<Type,Dimensions_>::instantiate(utility::tuple::get<N>(t))){}\ +}; +TENSORMAPFIXEDSIZE(const) +TENSORMAPFIXEDSIZE() +#undef TENSORMAPFIXEDSIZE + #define UNARYCATEGORY(CVQual)\ template <template<class, class> class UnaryCategory, typename OP, typename OrigRHSExpr, typename RHSExpr, typename... Params>\ struct ExprConstructor<CVQual UnaryCategory<OP, OrigRHSExpr>, CVQual UnaryCategory<OP, RHSExpr>, Params...> {\ diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractFunctors.h b/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractFunctors.h index 1293b14e2..ff8be5444 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractFunctors.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractFunctors.h @@ -41,6 +41,17 @@ template <typename Evaluator> struct FunctorExtractor{ : m_dimensions(expr.dimensions()) {} }; + +#define SYCLEXTRTENSORMAPFIXEDSIZE(CVQual)\ +template <typename Scalar_, typename Dimensions_, int Options_2, typename IndexType, int Options_, template <class> class MakePointer_, typename Dev>\ +struct FunctorExtractor< TensorEvaluator <CVQual TensorMap<TensorFixedSize<Scalar_, Dimensions_, Options_2, IndexType>, Options_, MakePointer_> , Dev> >{\ +FunctorExtractor(const TensorEvaluator <CVQual TensorMap<TensorFixedSize<Scalar_, Dimensions_, Options_2, IndexType>, Options_, MakePointer_> , Dev>& ){}\ +}; + +SYCLEXTRTENSORMAPFIXEDSIZE(const) +SYCLEXTRTENSORMAPFIXEDSIZE() +#undef SYCLEXTRTENSORMAPFIXEDSIZE + /// specialisation of the \ref FunctorExtractor struct when the node type is /// TensorCwiseNullaryOp, TensorCwiseUnaryOp, and TensorBroadcastingOp #define SYCLEXTRFUNCUNARY(CVQual)\ diff --git a/unsupported/Eigen/CXX11/src/util/CXX11Meta.h b/unsupported/Eigen/CXX11/src/util/CXX11Meta.h index e7c1a1bae..49d315a66 100644 --- a/unsupported/Eigen/CXX11/src/util/CXX11Meta.h +++ b/unsupported/Eigen/CXX11/src/util/CXX11Meta.h @@ -36,27 +36,12 @@ struct type_list { constexpr static int count = sizeof...(tt); }; template<typename t, typename... tt> struct type_list<t, tt...> { constexpr static int count = sizeof...(tt) + 1; typedef t first_type; }; -#ifndef EIGEN_USE_SYCL template<typename T, T... nn> struct numeric_list { constexpr static std::size_t count = sizeof...(nn); }; template<typename T, T n, T... nn> struct numeric_list<T, n, nn...> { static const std::size_t count = sizeof...(nn) + 1; const static T first_value = n; }; -#else -template<typename T, T... nn> -struct numeric_list { - static constexpr std::size_t count = sizeof...(nn); - const T values[count] = {nn...}; -}; -template<typename T> -struct numeric_list<T>{ - static constexpr std::size_t count = 0; - //Array of size zero strictly forbiden in ISO C++ -}; - -#endif - /* numeric list constructors * * equivalencies: @@ -138,19 +123,9 @@ template<typename a, typename... as> struct get<0, type_lis template<typename T, int n, T a, T... as> struct get<n, numeric_list<T, a, as...>> : get<n-1, numeric_list<T, as...>> {}; template<typename T, T a, T... as> struct get<0, numeric_list<T, a, as...>> { constexpr static T value = a; }; -#ifndef EIGEN_USE_SYCL template<std::size_t n, typename T, T a, T... as> constexpr T array_get(const numeric_list<T, a, as...>&) { return get<(int)n, numeric_list<T, a, as...>>::value; } -#else -template<std::size_t n, typename T, T... as> constexpr T array_get(const numeric_list<T, as...>& l) { - return l.values[n]; -} -template<std::size_t n, typename T> constexpr T array_get(const numeric_list<T>& ) { - return T(0); -} - -#endif /* always get type, regardless of dummy; good for parameter pack expansion */ |