| // This file is part of Eigen, a lightweight C++ template library |
| // for linear algebra. |
| // |
| // Copyright (C) 2015 Benoit Steiner <benoit.steiner.goog@gmail.com> |
| // |
| // 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/. |
| |
| #ifndef EIGEN_CXX11_FIXED_POINT_MAT_VEC_PRODUCT_H |
| #define EIGEN_CXX11_FIXED_POINT_MAT_VEC_PRODUCT_H |
| |
| |
| namespace Eigen { |
| namespace internal { |
| |
| // Mat-Vec product |
| // Both lhs and rhs are encoded as 8bit signed integers |
| template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> |
| struct general_matrix_vector_product<Index,QInt8,LhsMapper,ColMajor,ConjugateLhs,QInt8,RhsMapper,ConjugateRhs,Version> |
| { |
| EIGEN_DONT_INLINE static void run( |
| Index rows, Index cols, |
| const LhsMapper& lhs, |
| const RhsMapper& rhs, |
| QInt32* res, Index resIncr, |
| QInt8 alpha); |
| }; |
| |
| template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> |
| EIGEN_DONT_INLINE void general_matrix_vector_product<Index,QInt8,LhsMapper,ColMajor,ConjugateLhs,QInt8,RhsMapper,ConjugateRhs,Version>::run( |
| Index rows, Index cols, |
| const LhsMapper& lhs, |
| const RhsMapper& rhs, |
| QInt32* res, Index resIncr, |
| QInt8 alpha) |
| { |
| eigen_assert(alpha.value == 1); |
| eigen_assert(resIncr == 1); |
| eigen_assert(rows > 0); |
| eigen_assert(cols > 0); |
| |
| for (Index i = 0; i < rows; ++i) { |
| for (Index j = 0; j < cols; ++j) { |
| res[i] += lhs(i, j) * rhs(j, 0); |
| } |
| } |
| } |
| |
| // Mat-Vec product |
| // Both lhs and rhs are encoded as 16bit signed integers |
| template <typename Index, typename LhsMapper, bool ConjugateLhs, |
| typename RhsMapper, bool ConjugateRhs, int Version> |
| struct general_matrix_vector_product<Index, QInt16, LhsMapper, ColMajor, |
| ConjugateLhs, QInt16, RhsMapper, |
| ConjugateRhs, Version> { |
| EIGEN_DONT_INLINE static void run(Index rows, Index cols, |
| const LhsMapper& lhs, const RhsMapper& rhs, |
| QInt32* res, Index resIncr, QInt16 alpha); |
| }; |
| |
| template <typename Index, typename LhsMapper, bool ConjugateLhs, |
| typename RhsMapper, bool ConjugateRhs, int Version> |
| EIGEN_DONT_INLINE void general_matrix_vector_product< |
| Index, QInt16, LhsMapper, ColMajor, ConjugateLhs, QInt16, RhsMapper, |
| ConjugateRhs, Version>::run(Index rows, Index cols, const LhsMapper& lhs, |
| const RhsMapper& rhs, QInt32* res, |
| Index resIncr, QInt16 alpha) { |
| eigen_assert(alpha.value == 1); |
| eigen_assert(resIncr == 1); |
| eigen_assert(rows > 0); |
| eigen_assert(cols > 0); |
| |
| for (Index i = 0; i < rows; ++i) { |
| for (Index j = 0; j < cols; ++j) { |
| res[i] += lhs(i, j) * rhs(j, 0); |
| } |
| } |
| } |
| |
| // Mat-Vec product |
| // The lhs is encoded using 8bit signed integers, the rhs using 8bit unsigned integers |
| template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> |
| struct general_matrix_vector_product<Index,QInt8,LhsMapper,ColMajor,ConjugateLhs,QUInt8,RhsMapper,ConjugateRhs,Version> |
| { |
| EIGEN_DONT_INLINE static void run( |
| Index rows, Index cols, |
| const LhsMapper& lhs, |
| const RhsMapper& rhs, |
| QInt32* res, Index resIncr, |
| QUInt8 alpha); |
| }; |
| |
| template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> |
| EIGEN_DONT_INLINE void general_matrix_vector_product<Index,QInt8,LhsMapper,ColMajor,ConjugateLhs,QUInt8,RhsMapper,ConjugateRhs,Version>::run( |
| Index rows, Index cols, |
| const LhsMapper& lhs, |
| const RhsMapper& rhs, |
| QInt32* res, Index resIncr, |
| QUInt8 alpha) |
| { |
| eigen_assert(alpha.value == 1); |
| eigen_assert(resIncr == 1); |
| eigen_assert(rows > 0); |
| eigen_assert(cols > 0); |
| |
| for (Index i = 0; i < rows; ++i) { |
| for (Index j = 0; j < cols; ++j) { |
| res[i] += lhs(i, j) * rhs(j, 0); |
| } |
| } |
| } |
| |
| |
| // Mat-Vec product |
| // The lhs is encoded using bit unsigned integers, the rhs using 8bit signed integers |
| template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> |
| struct general_matrix_vector_product<Index,QUInt8,LhsMapper,ColMajor,ConjugateLhs,QInt8,RhsMapper,ConjugateRhs,Version> |
| { |
| EIGEN_DONT_INLINE static void run( |
| Index rows, Index cols, |
| const LhsMapper& lhs, |
| const RhsMapper& rhs, |
| QInt32* res, Index resIncr, |
| QInt8 alpha); |
| }; |
| |
| template<typename Index, typename LhsMapper, bool ConjugateLhs, typename RhsMapper, bool ConjugateRhs, int Version> |
| EIGEN_DONT_INLINE void general_matrix_vector_product<Index,QUInt8,LhsMapper,ColMajor,ConjugateLhs,QInt8,RhsMapper,ConjugateRhs,Version>::run( |
| Index rows, Index cols, |
| const LhsMapper& lhs, |
| const RhsMapper& rhs, |
| QInt32* res, Index resIncr, |
| QInt8 alpha) |
| { |
| eigen_assert(alpha.value == 1); |
| eigen_assert(resIncr == 1); |
| eigen_assert(rows > 0); |
| eigen_assert(cols > 0); |
| |
| for (Index i = 0; i < rows; ++i) { |
| for (Index j = 0; j < cols; ++j) { |
| res[i] += lhs(i, j) * rhs(j, 0); |
| } |
| } |
| } |
| |
| } // namespace internal |
| } // namespace Eigen |
| |
| |
| |
| #endif // EIGEN_CXX11_FIXED_POINT_MAT_VEC_PRODUCT_H |