From 74da2e6821011222229339b14dad70340b451e6e Mon Sep 17 00:00:00 2001 From: Antonio Sanchez Date: Thu, 26 Aug 2021 12:25:31 -0700 Subject: [PATCH] Rename Tuple -> Pair. This is to make way for a new `Tuple` class that mimics `std::tuple`, but can be reliably used on device and with aligned Eigen types. The existing Tuple has very few references, and is actually an analogue of `std::pair`. --- .../Eigen/CXX11/src/Tensor/TensorArgMax.h | 86 +++++++++---------- .../Eigen/CXX11/src/Tensor/TensorBase.h | 48 +++++------ .../src/Tensor/TensorForwardDeclarations.h | 4 +- .../Eigen/CXX11/src/Tensor/TensorFunctors.h | 8 +- .../Eigen/CXX11/src/Tensor/TensorMeta.h | 16 ++-- unsupported/test/cxx11_tensor_argmax.cpp | 70 +++++++-------- 6 files changed, 117 insertions(+), 115 deletions(-) diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h b/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h index 8b8fb9235..1d7e9f1e5 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h @@ -14,20 +14,20 @@ namespace Eigen { namespace internal { -/** \class TensorIndexTuple +/** \class TensorIndexPair * \ingroup CXX11_Tensor_Module * - * \brief Tensor + Index Tuple class. + * \brief Tensor + Index Pair class. * * */ template -struct traits > : public traits +struct traits > : public traits { typedef traits XprTraits; typedef typename XprTraits::StorageKind StorageKind; typedef typename XprTraits::Index Index; - typedef Tuple Scalar; + typedef Pair Scalar; typedef typename XprType::Nested Nested; typedef typename remove_reference::type _Nested; static const int NumDimensions = XprTraits::NumDimensions; @@ -35,32 +35,32 @@ struct traits > : public traits }; template -struct eval, Eigen::Dense> +struct eval, Eigen::Dense> { - typedef const TensorIndexTupleOpEIGEN_DEVICE_REF type; + typedef const TensorIndexPairOpEIGEN_DEVICE_REF type; }; template -struct nested, 1, - typename eval >::type> +struct nested, 1, + typename eval >::type> { - typedef TensorIndexTupleOp type; + typedef TensorIndexPairOp type; }; } // end namespace internal template -class TensorIndexTupleOp : public TensorBase, ReadOnlyAccessors> +class TensorIndexPairOp : public TensorBase, ReadOnlyAccessors> { public: - typedef typename Eigen::internal::traits::Scalar Scalar; + typedef typename Eigen::internal::traits::Scalar Scalar; typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; - typedef Tuple CoeffReturnType; + typedef typename Eigen::internal::nested::type Nested; + typedef typename Eigen::internal::traits::StorageKind StorageKind; + typedef typename Eigen::internal::traits::Index Index; + typedef Pair CoeffReturnType; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIndexTupleOp(const XprType& expr) + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorIndexPairOp(const XprType& expr) : m_xpr(expr) {} EIGEN_DEVICE_FUNC @@ -73,9 +73,9 @@ class TensorIndexTupleOp : public TensorBase, ReadOn // Eval as rvalue template -struct TensorEvaluator, Device> +struct TensorEvaluator, Device> { - typedef TensorIndexTupleOp XprType; + typedef TensorIndexPairOp XprType; typedef typename XprType::Index Index; typedef typename XprType::Scalar Scalar; typedef typename XprType::CoeffReturnType CoeffReturnType; @@ -138,14 +138,14 @@ struct TensorEvaluator, Device> namespace internal { -/** \class TensorTupleIndex +/** \class TensorPairIndex * \ingroup CXX11_Tensor_Module * - * \brief Converts to Tensor > and reduces to Tensor. + * \brief Converts to Tensor > and reduces to Tensor. * */ template -struct traits > : public traits +struct traits > : public traits { typedef traits XprTraits; typedef typename XprTraits::StorageKind StorageKind; @@ -158,32 +158,32 @@ struct traits > : public traits -struct eval, Eigen::Dense> +struct eval, Eigen::Dense> { - typedef const TensorTupleReducerOpEIGEN_DEVICE_REF type; + typedef const TensorPairReducerOpEIGEN_DEVICE_REF type; }; template -struct nested, 1, - typename eval >::type> +struct nested, 1, + typename eval >::type> { - typedef TensorTupleReducerOp type; + typedef TensorPairReducerOp type; }; } // end namespace internal template -class TensorTupleReducerOp : public TensorBase, ReadOnlyAccessors> +class TensorPairReducerOp : public TensorBase, ReadOnlyAccessors> { public: - typedef typename Eigen::internal::traits::Scalar Scalar; + typedef typename Eigen::internal::traits::Scalar Scalar; typedef typename Eigen::NumTraits::Real RealScalar; - typedef typename Eigen::internal::nested::type Nested; - typedef typename Eigen::internal::traits::StorageKind StorageKind; - typedef typename Eigen::internal::traits::Index Index; + typedef typename Eigen::internal::nested::type Nested; + typedef typename Eigen::internal::traits::StorageKind StorageKind; + typedef typename Eigen::internal::traits::Index Index; typedef Index CoeffReturnType; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorTupleReducerOp(const XprType& expr, + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorPairReducerOp(const XprType& expr, const ReduceOp& reduce_op, const Index return_dim, const Dims& reduce_dims) @@ -211,27 +211,27 @@ class TensorTupleReducerOp : public TensorBase -struct TensorEvaluator, Device> +struct TensorEvaluator, Device> { - typedef TensorTupleReducerOp XprType; + typedef TensorPairReducerOp XprType; typedef typename XprType::Index Index; typedef typename XprType::Scalar Scalar; typedef typename XprType::CoeffReturnType CoeffReturnType; - typedef typename TensorIndexTupleOp::CoeffReturnType TupleType; - typedef typename TensorEvaluator >, Device>::Dimensions Dimensions; - typedef typename TensorEvaluator , Device>::Dimensions InputDimensions; + typedef typename TensorIndexPairOp::CoeffReturnType PairType; + typedef typename TensorEvaluator >, Device>::Dimensions Dimensions; + typedef typename TensorEvaluator , Device>::Dimensions InputDimensions; static const int NumDims = internal::array_size::value; typedef array StrideDims; typedef StorageMemory Storage; typedef typename Storage::Type EvaluatorPointerType; - typedef StorageMemory TupleStorageMem; + typedef StorageMemory PairStorageMem; enum { IsAligned = /*TensorEvaluator::IsAligned*/ false, PacketAccess = /*TensorEvaluator::PacketAccess*/ false, BlockAccess = false, PreferBlockAccess = TensorEvaluator::PreferBlockAccess, - Layout = TensorEvaluator >, Device>::Layout, + Layout = TensorEvaluator >, Device>::Layout, CoordAccess = false, // to be implemented RawAccess = false }; @@ -242,7 +242,7 @@ struct TensorEvaluator, Devi EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device) : m_orig_impl(op.expression(), device), - m_impl(op.expression().index_tuples().reduce(op.reduce_dims(), op.reduce_op()), device), + m_impl(op.expression().index_pairs().reduce(op.reduce_dims(), op.reduce_op()), device), m_return_dim(op.return_dim()) { gen_strides(m_orig_impl.dimensions(), m_strides); @@ -272,7 +272,7 @@ struct TensorEvaluator, Devi } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const { - const TupleType v = m_impl.coeff(index); + const PairType v = m_impl.coeff(index); return (m_return_dim < 0) ? v.first : (v.first % m_stride_mod) / m_stride_div; } @@ -316,8 +316,8 @@ struct TensorEvaluator, Devi } protected: - TensorEvaluator, Device> m_orig_impl; - TensorEvaluator >, Device> m_impl; + TensorEvaluator, Device> m_orig_impl; + TensorEvaluator >, Device> m_impl; const Index m_return_dim; StrideDims m_strides; Index m_stride_mod; diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h b/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h index 94dca35de..580b93724 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h @@ -741,55 +741,55 @@ class TensorBase } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, + const TensorPairReducerOp< + internal::ArgMaxPairReducer >, const array, const Derived> argmax() const { array in_dims; for (Index d = 0; d < NumDimensions; ++d) in_dims[d] = d; - return TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, + return TensorPairReducerOp< + internal::ArgMaxPairReducer >, const array, - const Derived>(derived(), internal::ArgMaxTupleReducer >(), -1, in_dims); + const Derived>(derived(), internal::ArgMaxPairReducer >(), -1, in_dims); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMinTupleReducer >, + const TensorPairReducerOp< + internal::ArgMinPairReducer >, const array, const Derived> argmin() const { array in_dims; for (Index d = 0; d < NumDimensions; ++d) in_dims[d] = d; - return TensorTupleReducerOp< - internal::ArgMinTupleReducer >, + return TensorPairReducerOp< + internal::ArgMinPairReducer >, const array, - const Derived>(derived(), internal::ArgMinTupleReducer >(), -1, in_dims); + const Derived>(derived(), internal::ArgMinPairReducer >(), -1, in_dims); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, + const TensorPairReducerOp< + internal::ArgMaxPairReducer >, const array, const Derived> argmax(const Index return_dim) const { array in_dims; in_dims[0] = return_dim; - return TensorTupleReducerOp< - internal::ArgMaxTupleReducer >, + return TensorPairReducerOp< + internal::ArgMaxPairReducer >, const array, - const Derived>(derived(), internal::ArgMaxTupleReducer >(), return_dim, in_dims); + const Derived>(derived(), internal::ArgMaxPairReducer >(), return_dim, in_dims); } EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorTupleReducerOp< - internal::ArgMinTupleReducer >, + const TensorPairReducerOp< + internal::ArgMinPairReducer >, const array, const Derived> argmin(const Index return_dim) const { array in_dims; in_dims[0] = return_dim; - return TensorTupleReducerOp< - internal::ArgMinTupleReducer >, + return TensorPairReducerOp< + internal::ArgMinPairReducer >, const array, - const Derived>(derived(), internal::ArgMinTupleReducer >(), return_dim, in_dims); + const Derived>(derived(), internal::ArgMinPairReducer >(), return_dim, in_dims); } template EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE @@ -935,11 +935,11 @@ class TensorBase return TensorInflationOp(derived(), strides); } - // Returns a tensor containing index/value tuples + // Returns a tensor containing index/value pairs EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - const TensorIndexTupleOp - index_tuples() const { - return TensorIndexTupleOp(derived()); + const TensorIndexPairOp + index_pairs() const { + return TensorIndexPairOp(derived()); } // Support for custom unary and binary operations diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h b/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h index 246ebe44e..139384a71 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h @@ -61,8 +61,8 @@ template class T template class TensorCwiseTernaryOp; template class TensorSelectOp; template class MakePointer_ = MakePointer > class TensorReductionOp; -template class TensorIndexTupleOp; -template class TensorTupleReducerOp; +template class TensorIndexPairOp; +template class TensorPairReducerOp; template class TensorConcatenationOp; template class TensorContractionOp; template class TensorConversionOp; diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h b/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h index d96303224..b99edd4b0 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h @@ -367,7 +367,7 @@ struct reducer_traits { // Argmin/Argmax reducers. Returns the first occurrence if multiple locations // contain the same min/max value. -template struct ArgMaxTupleReducer +template struct ArgMaxPairReducer { EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T t, T* accum) const { if (t.second < accum->second) { @@ -385,7 +385,7 @@ template struct ArgMaxTupleReducer }; template -struct reducer_traits, Device> { +struct reducer_traits, Device> { enum { Cost = NumTraits::AddCost, PacketAccess = false, @@ -395,7 +395,7 @@ struct reducer_traits, Device> { }; -template struct ArgMinTupleReducer +template struct ArgMinPairReducer { EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void reduce(const T& t, T* accum) const { if (t.second > accum->second) { @@ -413,7 +413,7 @@ template struct ArgMinTupleReducer }; template -struct reducer_traits, Device> { +struct reducer_traits, Device> { enum { Cost = NumTraits::AddCost, PacketAccess = false, diff --git a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h index b90a1dcd6..e13ec09f5 100644 --- a/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h +++ b/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h @@ -207,9 +207,11 @@ template<> struct PacketType: PacketType struct Tuple { +// Pair mimics std::pair but works on e.g. nvcc. +template struct Pair { public: + EIGEN_MAKE_ALIGNED_OPERATOR_NEW + U first; V second; @@ -217,13 +219,13 @@ template struct Tuple { typedef V second_type; EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Tuple() : first(), second() {} + Pair() : first(), second() {} EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - Tuple(const U& f, const V& s) : first(f), second(s) {} + Pair(const U& f, const V& s) : first(f), second(s) {} EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE - void swap(Tuple& rhs) { + void swap(Pair& rhs) { using numext::swap; swap(first, rhs.first); swap(second, rhs.second); @@ -232,13 +234,13 @@ template struct Tuple { template EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -bool operator==(const Tuple& x, const Tuple& y) { +bool operator==(const Pair& x, const Pair& y) { return (x.first == y.first && x.second == y.second); } template EIGEN_CONSTEXPR EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE -bool operator!=(const Tuple& x, const Tuple& y) { +bool operator!=(const Pair& x, const Pair& y) { return !(x == y); } diff --git a/unsupported/test/cxx11_tensor_argmax.cpp b/unsupported/test/cxx11_tensor_argmax.cpp index 4a0c8967b..8be622bc8 100644 --- a/unsupported/test/cxx11_tensor_argmax.cpp +++ b/unsupported/test/cxx11_tensor_argmax.cpp @@ -14,57 +14,57 @@ using Eigen::Tensor; using Eigen::array; -using Eigen::Tuple; +using Eigen::Pair; template -static void test_simple_index_tuples() +static void test_simple_index_pairs() { Tensor tensor(2,3,5,7); tensor.setRandom(); tensor = (tensor + tensor.constant(0.5)).log(); - Tensor, 4, DataLayout> index_tuples(2,3,5,7); - index_tuples = tensor.index_tuples(); + Tensor, 4, DataLayout> index_pairs(2,3,5,7); + index_pairs = tensor.index_pairs(); for (DenseIndex n = 0; n < 2*3*5*7; ++n) { - const Tuple& v = index_tuples.coeff(n); + const Pair& v = index_pairs.coeff(n); VERIFY_IS_EQUAL(v.first, n); VERIFY_IS_EQUAL(v.second, tensor.coeff(n)); } } template -static void test_index_tuples_dim() +static void test_index_pairs_dim() { Tensor tensor(2,3,5,7); tensor.setRandom(); tensor = (tensor + tensor.constant(0.5)).log(); - Tensor, 4, DataLayout> index_tuples(2,3,5,7); + Tensor, 4, DataLayout> index_pairs(2,3,5,7); - index_tuples = tensor.index_tuples(); + index_pairs = tensor.index_pairs(); for (Eigen::DenseIndex n = 0; n < tensor.size(); ++n) { - const Tuple& v = index_tuples(n); //(i, j, k, l); + const Pair& v = index_pairs(n); //(i, j, k, l); VERIFY_IS_EQUAL(v.first, n); VERIFY_IS_EQUAL(v.second, tensor(n)); } } template -static void test_argmax_tuple_reducer() +static void test_argmax_pair_reducer() { Tensor tensor(2,3,5,7); tensor.setRandom(); tensor = (tensor + tensor.constant(0.5)).log(); - Tensor, 4, DataLayout> index_tuples(2,3,5,7); - index_tuples = tensor.index_tuples(); + Tensor, 4, DataLayout> index_pairs(2,3,5,7); + index_pairs = tensor.index_pairs(); - Tensor, 0, DataLayout> reduced; + Tensor, 0, DataLayout> reduced; DimensionList dims; - reduced = index_tuples.reduce( - dims, internal::ArgMaxTupleReducer >()); + reduced = index_pairs.reduce( + dims, internal::ArgMaxPairReducer >()); Tensor maxi = tensor.maximum(); @@ -72,9 +72,9 @@ static void test_argmax_tuple_reducer() array reduce_dims; for (int d = 0; d < 3; ++d) reduce_dims[d] = d; - Tensor, 1, DataLayout> reduced_by_dims(7); - reduced_by_dims = index_tuples.reduce( - reduce_dims, internal::ArgMaxTupleReducer >()); + Tensor, 1, DataLayout> reduced_by_dims(7); + reduced_by_dims = index_pairs.reduce( + reduce_dims, internal::ArgMaxPairReducer >()); Tensor max_by_dims = tensor.maximum(reduce_dims); @@ -84,19 +84,19 @@ static void test_argmax_tuple_reducer() } template -static void test_argmin_tuple_reducer() +static void test_argmin_pair_reducer() { Tensor tensor(2,3,5,7); tensor.setRandom(); tensor = (tensor + tensor.constant(0.5)).log(); - Tensor, 4, DataLayout> index_tuples(2,3,5,7); - index_tuples = tensor.index_tuples(); + Tensor, 4, DataLayout> index_pairs(2,3,5,7); + index_pairs = tensor.index_pairs(); - Tensor, 0, DataLayout> reduced; + Tensor, 0, DataLayout> reduced; DimensionList dims; - reduced = index_tuples.reduce( - dims, internal::ArgMinTupleReducer >()); + reduced = index_pairs.reduce( + dims, internal::ArgMinPairReducer >()); Tensor mini = tensor.minimum(); @@ -104,9 +104,9 @@ static void test_argmin_tuple_reducer() array reduce_dims; for (int d = 0; d < 3; ++d) reduce_dims[d] = d; - Tensor, 1, DataLayout> reduced_by_dims(7); - reduced_by_dims = index_tuples.reduce( - reduce_dims, internal::ArgMinTupleReducer >()); + Tensor, 1, DataLayout> reduced_by_dims(7); + reduced_by_dims = index_pairs.reduce( + reduce_dims, internal::ArgMinPairReducer >()); Tensor min_by_dims = tensor.minimum(reduce_dims); @@ -275,14 +275,14 @@ static void test_argmin_dim() EIGEN_DECLARE_TEST(cxx11_tensor_argmax) { - CALL_SUBTEST(test_simple_index_tuples()); - CALL_SUBTEST(test_simple_index_tuples()); - CALL_SUBTEST(test_index_tuples_dim()); - CALL_SUBTEST(test_index_tuples_dim()); - CALL_SUBTEST(test_argmax_tuple_reducer()); - CALL_SUBTEST(test_argmax_tuple_reducer()); - CALL_SUBTEST(test_argmin_tuple_reducer()); - CALL_SUBTEST(test_argmin_tuple_reducer()); + CALL_SUBTEST(test_simple_index_pairs()); + CALL_SUBTEST(test_simple_index_pairs()); + CALL_SUBTEST(test_index_pairs_dim()); + CALL_SUBTEST(test_index_pairs_dim()); + CALL_SUBTEST(test_argmax_pair_reducer()); + CALL_SUBTEST(test_argmax_pair_reducer()); + CALL_SUBTEST(test_argmin_pair_reducer()); + CALL_SUBTEST(test_argmin_pair_reducer()); CALL_SUBTEST(test_simple_argmax()); CALL_SUBTEST(test_simple_argmax()); CALL_SUBTEST(test_simple_argmin());