From 0699fa06fe220173b5fde56405f1d5b07fc3c08a Mon Sep 17 00:00:00 2001 From: Chip Kerchner Date: Wed, 23 Mar 2022 18:09:33 +0000 Subject: [PATCH] Split general_matrix_vector_product interface for Power into two macros - one ColMajor and RowMajor. --- .../Core/arch/AltiVec/MatrixVectorProduct.h | 84 ++++++++++++------- 1 file changed, 54 insertions(+), 30 deletions(-) diff --git a/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h b/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h index 65b78b134..b9b97313a 100644 --- a/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h +++ b/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.h @@ -1996,9 +1996,9 @@ EIGEN_STRONG_INLINE void gemv_row( } } -#define EIGEN_POWER_GEMV_REAL_SPECIALIZE(Scalar, Major) \ +#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL(Scalar) \ template \ -struct general_matrix_vector_product \ +struct general_matrix_vector_product \ { \ typedef typename ScalarBinaryOpTraits::ReturnType ResScalar; \ \ @@ -2008,18 +2008,30 @@ struct general_matrix_vector_product(rows, cols, lhs, rhs, res, resIncr, alpha); \ - } else { \ - gemv_row(rows, cols, lhs, rhs, res, resIncr, alpha); \ - } \ + gemv_col(rows, cols, lhs, rhs, res, resIncr, alpha); \ } \ }; -EIGEN_POWER_GEMV_REAL_SPECIALIZE(float, ColMajor) -EIGEN_POWER_GEMV_REAL_SPECIALIZE(double, ColMajor) -EIGEN_POWER_GEMV_REAL_SPECIALIZE(float, RowMajor) -EIGEN_POWER_GEMV_REAL_SPECIALIZE(double, RowMajor) +#define EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW(Scalar) \ +template \ +struct general_matrix_vector_product \ +{ \ + typedef typename ScalarBinaryOpTraits::ReturnType ResScalar; \ +\ + EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \ + Index rows, Index cols, \ + const LhsMapper& lhs, \ + const RhsMapper& rhs, \ + ResScalar* res, Index resIncr, \ + ResScalar alpha) { \ + gemv_row(rows, cols, lhs, rhs, res, resIncr, alpha); \ + } \ +}; + +EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL(float) +EIGEN_POWER_GEMV_REAL_SPECIALIZE_COL(double) +EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW(float) +EIGEN_POWER_GEMV_REAL_SPECIALIZE_ROW(double) template EIGEN_ALWAYS_INLINE ScalarBlock predux_complex(PResPacket& a0, PResPacket& b0, ResPacket& a1, ResPacket& b1) @@ -2311,9 +2323,9 @@ EIGEN_STRONG_INLINE void gemv_complex_row( } } -#define EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(Scalar, LhsScalar, RhsScalar, Major) \ +#define EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(Scalar, LhsScalar, RhsScalar) \ template \ -struct general_matrix_vector_product \ +struct general_matrix_vector_product \ { \ typedef typename ScalarBinaryOpTraits::ReturnType ResScalar; \ \ @@ -2323,26 +2335,38 @@ struct general_matrix_vector_product(rows, cols, lhs, rhs, res, resIncr, alpha); \ - } else { \ - gemv_complex_row(rows, cols, lhs, rhs, res, resIncr, alpha); \ - } \ + gemv_complex_col(rows, cols, lhs, rhs, res, resIncr, alpha); \ } \ }; -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(float, float, std::complex, ColMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(float, std::complex, float, ColMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(float, std::complex, std::complex, ColMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(double, double, std::complex, ColMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(double, std::complex, double, ColMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(double, std::complex, std::complex, ColMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(float, float, std::complex, RowMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(float, std::complex, float, RowMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(float, std::complex, std::complex, RowMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(double, double, std::complex, RowMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(double, std::complex, double, RowMajor) -EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE(double, std::complex, std::complex, RowMajor) +#define EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(Scalar, LhsScalar, RhsScalar) \ +template \ +struct general_matrix_vector_product \ +{ \ + typedef typename ScalarBinaryOpTraits::ReturnType ResScalar; \ +\ + EIGEN_DEVICE_FUNC EIGEN_DONT_INLINE static void run( \ + Index rows, Index cols, \ + const LhsMapper& lhs, \ + const RhsMapper& rhs, \ + ResScalar* res, Index resIncr, \ + ResScalar alpha) { \ + gemv_complex_row(rows, cols, lhs, rhs, res, resIncr, alpha); \ + } \ +}; + +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float, float, std::complex) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float, std::complex, float) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(float, std::complex, std::complex) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(double, double, std::complex) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(double, std::complex, double) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_COL(double, std::complex, std::complex) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float, float, std::complex) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float, std::complex, float) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(float, std::complex, std::complex) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(double, double, std::complex) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(double, std::complex, double) +EIGEN_POWER_GEMV_COMPLEX_SPECIALIZE_ROW(double, std::complex, std::complex) #endif // EIGEN_MATRIX_VECTOR_PRODUCT_ALTIVEC_H