diff options
author | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2014-10-02 10:39:36 -0700 |
---|---|---|
committer | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2014-10-02 10:39:36 -0700 |
commit | 8b2afe33a165ff0cc5a7afd14fcfb06cdf703235 (patch) | |
tree | ba31262fe5c38db9f6a1a422644f0b7cb38b0f2c /unsupported/Eigen | |
parent | 5cc23199be743d0d1be85d709eb366e67e87a262 (diff) |
Fixes for the forced evaluation of tensor expressions
More tests
Diffstat (limited to 'unsupported/Eigen')
-rw-r--r-- | unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h b/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h index 6f6641de6..cb14cc7f7 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h @@ -87,31 +87,28 @@ struct TensorEvaluator<const TensorForcedEvalOp<ArgType>, Device> enum { IsAligned = true, - PacketAccess = true, + PacketAccess = (internal::packet_traits<Scalar>::size > 1), }; EIGEN_DEVICE_FUNC TensorEvaluator(const XprType& op, const Device& device) : m_impl(op.expression(), device), m_op(op.expression()), m_device(device), m_buffer(NULL) { } - EIGEN_DEVICE_FUNC ~TensorEvaluator() { - eigen_assert(!m_buffer); - } - typedef typename XprType::Index Index; typedef typename XprType::CoeffReturnType CoeffReturnType; typedef typename XprType::PacketReturnType PacketReturnType; EIGEN_DEVICE_FUNC const Dimensions& dimensions() const { return m_impl.dimensions(); } - EIGEN_STRONG_INLINE void evalSubExprsIfNeeded() { - m_impl.evalSubExprsIfNeeded(); + EIGEN_STRONG_INLINE bool evalSubExprsIfNeeded(Scalar*) { + m_impl.evalSubExprsIfNeeded(NULL); m_buffer = (Scalar*)m_device.allocate(m_impl.dimensions().TotalSize() * sizeof(Scalar)); typedef TensorEvalToOp<const ArgType> EvalTo; EvalTo evalToTmp(m_buffer, m_op); internal::TensorExecutor<const EvalTo, Device, TensorEvaluator<ArgType, Device>::PacketAccess>::run(evalToTmp, m_device); m_impl.cleanup(); + return true; } EIGEN_STRONG_INLINE void cleanup() { m_device.deallocate(m_buffer); @@ -129,6 +126,8 @@ struct TensorEvaluator<const TensorForcedEvalOp<ArgType>, Device> return internal::ploadt<Packet, LoadMode>(m_buffer + index); } + Scalar* data() const { return m_buffer; } + private: TensorEvaluator<ArgType, Device> m_impl; const ArgType m_op; |