From b0f2b6f297b47585ef007073ec7550fe4cf5bde6 Mon Sep 17 00:00:00 2001 From: Benoit Steiner Date: Mon, 2 Mar 2015 10:11:40 -0800 Subject: [PATCH] Updated the tensor type casting code as follow: in the case where TgtRatio < SrcRatio, disable the vectorization of the source expression unless is has direct-access. --- unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h b/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h index f594725a8..fb1f1f6ea 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h @@ -93,7 +93,10 @@ struct PacketConverter { template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TgtPacket packet(Index index) const { const int SrcPacketSize = internal::unpacket_traits::size; - if (index + SrcPacketSize < m_maxIndex) { + // Only call m_impl.packet() when we have direct access to the underlying data. This + // ensures that we don't compute the subexpression twice. We may however load some + // coefficients twice, but in practice this doesn't negatively impact performance. + if (m_impl.data() && (index + SrcPacketSize < m_maxIndex)) { // Force unaligned memory loads since we can't ensure alignment anymore return internal::pcast(m_impl.template packet(index)); } else {