// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Mehdi Goli Codeplay Software Ltd. // Ralph Potter Codeplay Software Ltd. // Luke Iwanski Codeplay Software Ltd. // Contact: // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. /***************************************************************** * TensorSyclConvertToDeviceExpression.h * * \brief: * Conversion from host pointer to device pointer * inside leaf nodes of the expression. * *****************************************************************/ #ifndef UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_CONVERT_TO_DEVICE_EXPRESSION_HPP #define UNSUPPORTED_EIGEN_CXX11_SRC_TENSOR_TENSORSYCL_CONVERT_TO_DEVICE_EXPRESSION_HPP namespace Eigen { namespace TensorSycl { namespace internal { /// \struct ConvertToDeviceExpression /// \brief This struct is used to convert the MakePointer in the host expression /// to the MakeGlobalPointer for the device expression. For the leafNodes /// containing the pointer. This is due to the fact that the address space of /// the pointer T* is different on the host and the device. template struct ConvertToDeviceExpression; template class NonOpCategory, bool IsConst, typename... Args> struct NonOpConversion{ typedef typename GetType::Type...> >::Type Type; }; template class > class NonOpCategory, bool IsConst, typename Args> struct DeviceConvertor{ typedef typename GetType::Type, MakeGlobalPointer> >::Type Type; }; /// specialisation of the \ref ConvertToDeviceExpression struct when the node /// type is TensorMap #define TENSORMAPCONVERT(CVQual)\ template class MakePointer_>\ struct ConvertToDeviceExpression, Options2_, MakePointer_> > {\ typedef CVQual TensorMap, Options2_, MakeGlobalPointer> Type;\ }; TENSORMAPCONVERT(const) TENSORMAPCONVERT() #undef TENSORMAPCONVERT /// specialisation of the \ref ConvertToDeviceExpression struct when the node /// type is TensorCwiseNullaryOp, TensorCwiseUnaryOp, TensorCwiseBinaryOp, TensorCwiseTernaryOp, TensorBroadcastingOp #define CATEGORYCONVERT(CVQual)\ template class Category, typename OP, typename... subExprs>\ struct ConvertToDeviceExpression > {\ typedef CVQual Category::Type... > Type;\ }; CATEGORYCONVERT(const) CATEGORYCONVERT() #undef CATEGORYCONVERT /// specialisation of the \ref ConvertToDeviceExpression struct when the node /// type is TensorCwiseSelectOp #define SELECTOPCONVERT(CVQual, Res)\ template \ struct ConvertToDeviceExpression >\ : NonOpConversion {}; SELECTOPCONVERT(const, true) SELECTOPCONVERT(, false) #undef SELECTOPCONVERT /// specialisation of the \ref ConvertToDeviceExpression struct when the node /// type is const AssingOP #define ASSIGNCONVERT(CVQual, Res)\ template \ struct ConvertToDeviceExpression >\ : NonOpConversion{}; ASSIGNCONVERT(const, true) ASSIGNCONVERT(, false) #undef ASSIGNCONVERT /// specialisation of the \ref ConvertToDeviceExpression struct when the node /// type is either TensorForcedEvalOp or TensorEvalToOp #define KERNELBROKERCONVERT(CVQual, Res, ExprNode)\ template \ struct ConvertToDeviceExpression > \ : DeviceConvertor{}; KERNELBROKERCONVERT(const, true, TensorForcedEvalOp) KERNELBROKERCONVERT(, false, TensorForcedEvalOp) KERNELBROKERCONVERT(const, true, TensorEvalToOp) KERNELBROKERCONVERT(, false, TensorEvalToOp) #undef KERNELBROKERCONVERT /// specialisation of the \ref ConvertToDeviceExpression struct when the node type is TensorReductionOp #define KERNELBROKERCONVERTREDUCTION(CVQual)\ template class MakePointer_>\ struct ConvertToDeviceExpression > {\ typedef CVQual TensorReductionOp::Type, MakeGlobalPointer> Type;\ }; KERNELBROKERCONVERTREDUCTION(const) KERNELBROKERCONVERTREDUCTION() #undef KERNELBROKERCONVERTREDUCTION } // namespace internal } // namespace TensorSycl } // namespace Eigen #endif // UNSUPPORTED_EIGEN_CXX1